質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.80%

文字ストリームから読み込むためにのクラス(ArrayList)

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 464

score 7

文字ストリームに書き込み、書き込んだデータを読み込んで表示するプログラムを作りたいのですが,読み込んだ際、番号と名前の部分がnullと表示されています。書き込みとファイルの部分は問題ないと思います。アドバイスなど些細なことでもいいのでお教えいただけると助かります。
(どちらも実行できます,importされているgrade4の部分は問題ないと思っています。)
写真1 両方クラスの実行結果
写真2 a.dat(書き込んだファイル)
写真3 grade4
環境...sentos
言語...java

//書き込み用クラス
package grade6;
import java.io.*;
import java.util.*;
import grade4.*;
public class WriteGradeToFile{
    public static void main(String[] args){ 
    BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));

    Vector buffer = new Vector();
    System.out.println("バッファの容量 = "+buffer.capacity());

    if(args.length != 1) {
        System.out.println("エラー:出力ファイル名を1つ与えてください。");
        System.out.println("使い方:$ java grade4.WriteGradeTofile.dat");
        System.exit(1);
    }
    try{
        while(true) {
        Student s = new Student();
        System.out.print("番号=>");
        s.setNumber(buf.readLine());

        if(s.getNumber().equals(".")) break;
        System.out.print("名前=>");
        s.setName(buf.readLine());
        System.out.print("英語=>");
        s.setEnglish(Integer.parseInt(buf.readLine()));
        System.out.print("国語=>");
        s.setLiterature(Integer.parseInt(buf.readLine()));
        System.out.print("数学=>");
        s.setMathematics(Integer.parseInt(buf.readLine()));
        double avg = new  WriteGradeToFile().computeAverage(s);
        displayGrade(s,avg);
               buffer.addElement(s);
        buffer.addElement(new Double(avg));

        }

        System.out.println(buffer.size() + "個のデータを入力しました。");
        writeGradeToFile(args[0],buffer);


        System.out.println(args[0] + "へ書き出しました。");

        System.out.println();  
    }
    catch(IllegalPointsException ipe){
        System.err.println(ipe);
    }
    catch(NumberFormatException nfe){
        System.err.println(nfe);
    }
    catch(IOException ioe){
        System.err.println(ioe);
    }         
    }

    public double computeAverage (Student sub) {
    return (double) (sub.getEnglish() + sub.getLiterature()+ sub.getMathematics())/3.0;
    }   
    public static void displayGrade(Student sub, double avg){
    System.out.println("番号 = "+sub.getNumber());
    System.out.println("名前 = "+sub.getName());
    System.out.println("英語 = "+sub.getEnglish());
    System.out.println("国語 = "+sub.getLiterature());
    System.out.println("数学 = "+sub.getMathematics());
    System.out.println("平均 = "+avg);
    }
    public static void writeGradeToFile(String filename ,Vector v) throws IOException {



    FileWriter  fw = null;
    BufferedWriter bw = null;
    PrintWriter  pw=null;

    try {
        fw = new FileWriter(filename,true);
        bw = new BufferedWriter(fw);
        pw = new PrintWriter(bw);

        for(int i = 0;i < v.size(); i += 2){
        Student s = (Student)v.elementAt(i);    
        pw.println(s.getNumber());
        pw.println(s.getName());
        pw.println(s.getEnglish());
        pw.println(s.getLiterature());
        pw.println(s.getMathematics());
        double d = ((Double)v.elementAt(i+1)).doubleValue();
        pw.println(d);

        pw.flush();
        }
    }
    catch(IOException ioe){
        System.err.println(ioe);
    }
    catch(Exception e){
        System.err.println(e);
    }
    finally{
        if(pw !=null) pw.close();
        if(bw !=null) bw.close();
        if(fw !=null) fw.close();
    }
    }
}
//読み込み用クラス

package grade6;
import java.io.*;
import java.util.*;
import grade4.*;
public class ReadGradeFromFile{
    public static void main(String[] args)throws IOException{ 
    BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));

    if(args.length != 1) {
        System.out.println("エラー:入力ファイル名を1つ与えてください。");
        System.out.println("使い方:$ java grade5.ReadGradeFromFilea ファイル名");
        System.exit(1);
    }
    ArrayList buffer = new ArrayList();


    FileReader    fr = null;
    BufferedReader br = null;

    try{
        Student s = new Student();
        fr = new FileReader(args[0]);
        br = new BufferedReader(fr);
        System.err.println(args[0]+"から読み込みます。");
        System.err.println(args[0]+"の読み込みが終了しました。");

        while(true) {

        s.setNumber(br.readLine());
        s.setName(br.readLine());
        if(s.getName() == null) {


            break;
        }
        s.setEnglish(Integer.parseInt(br.readLine()));
        s.setLiterature(Integer.parseInt(br.readLine()));
        s.setMathematics(Integer.parseInt(br.readLine()));
        double avg = Double.parseDouble(br.readLine());
        buffer.add(s);
        buffer.add(new Double(avg));

        }
        System.out.println(buffer.size()+"個のデータを読み込みました。");
        displayGrade(buffer);

    }
    catch(IllegalPointsException ipe){
        ipe.printStackTrace();
    }
    catch(FileNotFoundException fnfe){
        System.err.println(fnfe);
    }
    catch(IOException ioe){
        System.err.println(ioe);
    }     
    finally{
        if(br !=null) br.close();
        if(fr !=null) fr.close();
    }
    }

    public static void displayGrade(ArrayList al){
    for (int i = 0; i < al.size(); i += 2){
        Student s = (Student)al.get(i);
        System.out.println("番号 = "+s.getNumber());
        System.out.println("名前 = "+s.getName());
        System.out.println("英語 = "+s.getEnglish());
        System.out.println("国語 = "+s.getLiterature());
        System.out.println("数学 = "+s.getMathematics());
        double d = ((Double)al.get(i+1)).doubleValue();
        System.out.println("平均 = "+d);
    }    
    }
}


イメージ説明
イメージ説明
イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

直接の回答ではないですが、私もリファクタリングしてみました。
オブジェクトには役割を持たせましょう。生徒役、先生役。先生が生徒に成績を伝える。平均点は生徒が計算する。
何か参考になることがあれば幸いです。

public class Student {
    private String number;
    private String name;
    private int english;
    private int literature;
    private int mathematics;

    public void setNumber(String number) {
        this.number = number;
    }

    public String getNumber() {
        return this.number;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void setEnglish(int score) {
        this.english = score;
    }

    public int getEnglish() {
        return this.english;
    }

    public void setMathematics(int score) {
        this.mathematics = score;
    }

    public int getMathematics() {
        return this.mathematics;
    }

    public void setLiterature(int score) {
        this.literature = score;
    }

    public int getLiterature() {
        return this.literature;
    }

    public double average() {
        return (this.english + this.mathematics + this.literature) / 3.0;
    }
}
//package grade6;
import java.io.*;
import java.util.*;
//import grade4.*;

public class WriteGradeToFile {
    private BufferedReader ui = new BufferedReader(new InputStreamReader(System.in));
    private List<Student> students = new ArrayList<Student>();

    private int readInt() throws IOException {
        return Integer.parseInt(ui.readLine());
    }

    void input() throws IOException {
        while (true) {
            Student student = new Student();
            System.out.print("番号=>");
            student.setNumber(ui.readLine());
            if (student.getNumber().equals("."))
                break;
            System.out.print("名前=>");
            student.setName(ui.readLine());
            System.out.print("英語=>");
            student.setEnglish(readInt());
            System.out.print("国語=>");
            student.setLiterature(readInt());
            System.out.print("数学=>");
            student.setMathematics(readInt());
            students.add(student);
        }
        System.out.println(students.size() + "人のデータを入力しました。");
    }

    public void displayGrade(Student student) {
        System.out.println("番号 = " + student.getNumber());
        System.out.println("名前 = " + student.getName());
        System.out.println("英語 = " + student.getEnglish());
        System.out.println("国語 = " + student.getLiterature());
        System.out.println("数学 = " + student.getMathematics());
        System.out.println("平均 = " + student.average());
    }

    public void displayGrade() {
        students.forEach(this::displayGrade);
    }

    public void save(PrintWriter pw) throws IOException {
        for (Student student: students) {
            pw.println(student.getNumber());
            pw.println(student.getName());
            pw.println(student.getEnglish());
            pw.println(student.getLiterature());
            pw.println(student.getMathematics());
            pw.println(student.average());
            pw.flush();
        }
    }

    public void save(String filename) throws IOException {
        var pw = new PrintWriter(new BufferedWriter(new FileWriter(filename, true)));
        save(pw);
        pw.close();
        System.out.println(filename + "へ書き出しました。");
        System.out.println();
    }

    public static void main(String[] args) throws IOException {
        if (args.length != 1) {
            System.out.println("エラー:出力ファイル名を1つ与えてください。");
            System.out.println("使い方:$ java grade4.WriteGradeTofile.dat");
            System.exit(1);
        }
        var teacher = new WriteGradeToFile();
        teacher.input();
        teacher.displayGrade();
        teacher.save(args[0]);
    }
}
//package grade6;
import java.io.*;
import java.util.*;
//import grade4.*;

public class ReadGradeFromFile {
    private List<Student> students = new ArrayList<Student>();

    private static int readInt(BufferedReader file) throws IOException {
        return Integer.parseInt(file.readLine());
    }

    public void load(BufferedReader file) throws IOException {
        while (true) {
            String number = file.readLine();
            if (number == null) {
                return;
            }
            Student student = new Student();
            student.setNumber(number);
            student.setName(file.readLine());
            student.setEnglish(readInt(file));
            student.setLiterature(readInt(file));
            student.setMathematics(readInt(file));
            file.readLine(); // drop out average
            students.add(student);
        }
    }

    public void load(String filename) throws IOException {
        var file = new BufferedReader(new FileReader(filename));
        System.err.println(filename + "から読み込みます。");
        load(file);
        System.out.println(students.size() + "人のデータを読み込みました。");
        System.err.println(filename + "の読み込みが終了しました。");
    }

    public void displayGrade(Student student) {
        System.out.println("番号 = " + student.getNumber());
        System.out.println("名前 = " + student.getName());
        System.out.println("英語 = " + student.getEnglish());
        System.out.println("国語 = " + student.getLiterature());
        System.out.println("数学 = " + student.getMathematics());
        System.out.println("平均 = " + student.average());
    }

    public void displayGrade() {
        students.forEach(this::displayGrade);
    }

    public static void main(String[] args) throws IOException {
        if (args.length != 1) {
            System.out.println("エラー:入力ファイル名を1つ与えてください。");
            System.out.println("使い方:$ java grade5.ReadGradeFromFilea ファイル名");
            System.exit(1);
        }
        var teacher = new ReadGradeFromFile();
        teacher.load(args[0]);
        teacher.displayGrade();
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

ReadGradeFromFileクラスのwhileループ部分でループ毎にStudentクラスをnewで初期化してないことが原因です。
結果をよく見ていただければわかるかと思いますが、番号と名前がnullなだけでなく1ループ目の他の結果も2ループ目の値で上書きされています。
ArrayListにはクラスの参照が渡されているだけなので、newで初期化して別にメモリを確保しないと格納した値が上書きされてしまいます。
この辺りはデバッグでArrayListの値を確認しながら動作させればわかると思います。

また気になった点ですが、VectorやArrayListにStudentクラスとavg変数をまとめてに入れていますが、
これらのクラスに格納するのは一種類のクラスが推奨されます。
ジェネリクスを無指定にしてObject型にして無理矢理格納していますがこれは推奨できません。
この処理を見た分ではavg変数をStudentクラスに持ってしまうか、
平均点が必要なところでその都度求める方法でもいいのではないかと思います。

ひとまずStudentにavgを持たせる方法で修正してみました。

//書き込み用クラス
package grade6;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Vector;

public class WriteGradeToFile{
    public static void main(String[] args){
        BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));

        Vector<Student> buffer = new Vector<>();
        System.out.println("バッファの容量 = "+buffer.capacity());

        if(args.length != 1) {
            System.out.println("エラー:出力ファイル名を1つ与えてください。");
            System.out.println("使い方:$ java grade4.WriteGradeTofile.dat");
            System.exit(1);
        }

        try {
            while(true) {
                Student s = new Student();
                System.out.print("番号=>");
                s.setNumber(buf.readLine());

                if(s.getNumber().equals(".")) break;
                System.out.print("名前=>");
                s.setName(buf.readLine());
                System.out.print("英語=>");
                s.setEnglish(Integer.parseInt(buf.readLine()));
                System.out.print("国語=>");
                s.setLiterature(Integer.parseInt(buf.readLine()));
                System.out.print("数学=>");
                s.setMathematics(Integer.parseInt(buf.readLine()));
                double avg = new  WriteGradeToFile().computeAverage(s);
                s.setAvg(avg);
                displayGrade(s);
                buffer.addElement(s);
            }

            System.out.println(buffer.size() + "個のデータを入力しました。");
            writeGradeToFile(args[0],buffer);

            System.out.println(args[0] + "へ書き出しました。");

            System.out.println();
        }
        catch(IllegalPointsException ipe){
            System.err.println(ipe);
        }
        catch(NumberFormatException nfe){
            System.err.println(nfe);
        }
        catch(IOException ioe){
            System.err.println(ioe);
        }
    }

    public double computeAverage (Student sub) {
        return (double) (sub.getEnglish() + sub.getLiterature()+ sub.getMathematics())/3.0;
    }
    public static void displayGrade(Student sub){
        System.out.println("番号 = "+sub.getNumber());
        System.out.println("名前 = "+sub.getName());
        System.out.println("英語 = "+sub.getEnglish());
        System.out.println("国語 = "+sub.getLiterature());
        System.out.println("数学 = "+sub.getMathematics());
        System.out.println("平均 = "+sub.getAvg());
    }
    public static void writeGradeToFile(String filename ,Vector<Student> v) throws IOException {

        FileWriter  fw = null;
        BufferedWriter bw = null;
        PrintWriter  pw=null;

        try {
            fw = new FileWriter(filename,true);
            bw = new BufferedWriter(fw);
            pw = new PrintWriter(bw);

            for(int i = 0;i < v.size(); i++){
                Student s = v.elementAt(i);
                pw.println(s.getNumber());
                pw.println(s.getName());
                pw.println(s.getEnglish());
                pw.println(s.getLiterature());
                pw.println(s.getMathematics());
                pw.println(s.getAvg());
                pw.flush();
            }
        }
        catch(IOException ioe){
            System.err.println(ioe);
        }
        catch(Exception e){
            System.err.println(e);
        }
        finally{
            if(pw !=null) pw.close();
            if(bw !=null) bw.close();
            if(fw !=null) fw.close();
        }
    }
}
//読み込み用クラス
package grade6;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ReadGradeFromFile{
    public static void main(String[] args)throws IOException{

        if(args.length != 1) {
            System.out.println("エラー:入力ファイル名を1つ与えてください。");
            System.out.println("使い方:$ java grade5.ReadGradeFromFilea ファイル名");
            System.exit(1);
        }

        List<Student> buffer = new ArrayList<>();

        FileReader    fr = null;
        BufferedReader br = null;

        try{
            fr = new FileReader(args[0]);
            br = new BufferedReader(fr);
            System.err.println(args[0]+"から読み込みます。");
            System.err.println(args[0]+"の読み込みが終了しました。");

            Student s;
            while(true) {
                s = new Student();

                s.setNumber(br.readLine());
                s.setName(br.readLine());

                if(s.getName() == null) {
                    break;
                }
                s.setEnglish(Integer.parseInt(br.readLine()));
                s.setLiterature(Integer.parseInt(br.readLine()));
                s.setMathematics(Integer.parseInt(br.readLine()));
                s.setAvg(Double.parseDouble(br.readLine()));
                buffer.add(s);
            }
            System.out.println(buffer.size()+"個のデータを読み込みました。");
            displayGrade(buffer);
        }
        catch(IllegalPointsException ipe){
            ipe.printStackTrace();
        }
        catch(FileNotFoundException fnfe){
            System.err.println(fnfe);
        }
        catch(IOException ioe){
            System.err.println(ioe);
        }
        finally{
            if(br !=null) br.close();
            if(fr !=null) fr.close();
        }
    }

    public static void displayGrade(List<Student> al){
        for (int i = 0; i < al.size(); i++){
            Student s = (Student)al.get(i);
            System.out.println("番号 = "+s.getNumber());
            System.out.println("名前 = "+s.getName());
            System.out.println("英語 = "+s.getEnglish());
            System.out.println("国語 = "+s.getLiterature());
            System.out.println("数学 = "+s.getMathematics());
            System.out.println("平均 = "+s.getAvg());
        }
    }
}
package grade6;

public class Student {

    private String Number;
    private String Name;
    private int english;
    private int literature;
    private int mathematics;
    private double avg;

    public String getNumber() {
        return Number;
    }

    public void setNumber(String number) {
        Number = number;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public int getEnglish() {
        return english;
    }

    public void setEnglish(int english) {
        this.english = english;
    }

    public int getLiterature() {
        return literature;
    }

    public void setLiterature(int literature) {
        this.literature = literature;
    }

    public int getMathematics() {
        return mathematics;
    }

    public void setMathematics(int mathematics) {
        this.mathematics = mathematics;
    }

    public double getAvg() {
        return avg;
    }

    public void setAvg(double avg) {
        this.avg = avg;
    }

}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る