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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

Q&A

解決済

2回答

1297閲覧

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

c02

総合スコア7

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

0グッド

0クリップ

投稿2020/01/21 06:51

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

java

1//書き込み用クラス 2package grade6; 3import java.io.*; 4import java.util.*; 5import grade4.*; 6public class WriteGradeToFile{ 7 public static void main(String[] args){ 8 BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); 9 10 Vector buffer = new Vector(); 11 System.out.println("バッファの容量 = "+buffer.capacity()); 12 13 if(args.length != 1) { 14 System.out.println("エラー:出力ファイル名を1つ与えてください。"); 15 System.out.println("使い方:$ java grade4.WriteGradeTofile.dat"); 16 System.exit(1); 17 } 18 try{ 19 while(true) { 20 Student s = new Student(); 21 System.out.print("番号=>"); 22 s.setNumber(buf.readLine()); 23 24 if(s.getNumber().equals(".")) break; 25 System.out.print("名前=>"); 26 s.setName(buf.readLine()); 27 System.out.print("英語=>"); 28 s.setEnglish(Integer.parseInt(buf.readLine())); 29 System.out.print("国語=>"); 30 s.setLiterature(Integer.parseInt(buf.readLine())); 31 System.out.print("数学=>"); 32 s.setMathematics(Integer.parseInt(buf.readLine())); 33 double avg = new WriteGradeToFile().computeAverage(s); 34 displayGrade(s,avg); 35 buffer.addElement(s); 36 buffer.addElement(new Double(avg)); 37 38 } 39 40 System.out.println(buffer.size() + "個のデータを入力しました。"); 41 writeGradeToFile(args[0],buffer); 42 43 44 System.out.println(args[0] + "へ書き出しました。"); 45 46 System.out.println(); 47 } 48 catch(IllegalPointsException ipe){ 49 System.err.println(ipe); 50 } 51 catch(NumberFormatException nfe){ 52 System.err.println(nfe); 53 } 54 catch(IOException ioe){ 55 System.err.println(ioe); 56 } 57 } 58 59 public double computeAverage (Student sub) { 60 return (double) (sub.getEnglish() + sub.getLiterature()+ sub.getMathematics())/3.0; 61 } 62 public static void displayGrade(Student sub, double avg){ 63 System.out.println("番号 = "+sub.getNumber()); 64 System.out.println("名前 = "+sub.getName()); 65 System.out.println("英語 = "+sub.getEnglish()); 66 System.out.println("国語 = "+sub.getLiterature()); 67 System.out.println("数学 = "+sub.getMathematics()); 68 System.out.println("平均 = "+avg); 69 } 70 public static void writeGradeToFile(String filename ,Vector v) throws IOException { 71 72 73 74 FileWriter fw = null; 75 BufferedWriter bw = null; 76 PrintWriter pw=null; 77 78 try { 79 fw = new FileWriter(filename,true); 80 bw = new BufferedWriter(fw); 81 pw = new PrintWriter(bw); 82 83 for(int i = 0;i < v.size(); i += 2){ 84 Student s = (Student)v.elementAt(i); 85 pw.println(s.getNumber()); 86 pw.println(s.getName()); 87 pw.println(s.getEnglish()); 88 pw.println(s.getLiterature()); 89 pw.println(s.getMathematics()); 90 double d = ((Double)v.elementAt(i+1)).doubleValue(); 91 pw.println(d); 92 93 pw.flush(); 94 } 95 } 96 catch(IOException ioe){ 97 System.err.println(ioe); 98 } 99 catch(Exception e){ 100 System.err.println(e); 101 } 102 finally{ 103 if(pw !=null) pw.close(); 104 if(bw !=null) bw.close(); 105 if(fw !=null) fw.close(); 106 } 107 } 108}

java

1 2//読み込み用クラス 3 4package grade6; 5import java.io.*; 6import java.util.*; 7import grade4.*; 8public class ReadGradeFromFile{ 9 public static void main(String[] args)throws IOException{ 10 BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); 11 12 if(args.length != 1) { 13 System.out.println("エラー:入力ファイル名を1つ与えてください。"); 14 System.out.println("使い方:$ java grade5.ReadGradeFromFilea ファイル名"); 15 System.exit(1); 16 } 17 ArrayList buffer = new ArrayList(); 18 19 20 FileReader fr = null; 21 BufferedReader br = null; 22 23 try{ 24 Student s = new Student(); 25 fr = new FileReader(args[0]); 26 br = new BufferedReader(fr); 27 System.err.println(args[0]+"から読み込みます。"); 28 System.err.println(args[0]+"の読み込みが終了しました。"); 29 30 while(true) { 31 32 s.setNumber(br.readLine()); 33 s.setName(br.readLine()); 34 if(s.getName() == null) { 35 36 37 break; 38 } 39 s.setEnglish(Integer.parseInt(br.readLine())); 40 s.setLiterature(Integer.parseInt(br.readLine())); 41 s.setMathematics(Integer.parseInt(br.readLine())); 42 double avg = Double.parseDouble(br.readLine()); 43 buffer.add(s); 44 buffer.add(new Double(avg)); 45 46 } 47 System.out.println(buffer.size()+"個のデータを読み込みました。"); 48 displayGrade(buffer); 49 50 } 51 catch(IllegalPointsException ipe){ 52 ipe.printStackTrace(); 53 } 54 catch(FileNotFoundException fnfe){ 55 System.err.println(fnfe); 56 } 57 catch(IOException ioe){ 58 System.err.println(ioe); 59 } 60 finally{ 61 if(br !=null) br.close(); 62 if(fr !=null) fr.close(); 63 } 64 } 65 66 public static void displayGrade(ArrayList al){ 67 for (int i = 0; i < al.size(); i += 2){ 68 Student s = (Student)al.get(i); 69 System.out.println("番号 = "+s.getNumber()); 70 System.out.println("名前 = "+s.getName()); 71 System.out.println("英語 = "+s.getEnglish()); 72 System.out.println("国語 = "+s.getLiterature()); 73 System.out.println("数学 = "+s.getMathematics()); 74 double d = ((Double)al.get(i+1)).doubleValue(); 75 System.out.println("平均 = "+d); 76 } 77 } 78}

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

Student.java

1public class Student { 2 private String number; 3 private String name; 4 private int english; 5 private int literature; 6 private int mathematics; 7 8 public void setNumber(String number) { 9 this.number = number; 10 } 11 12 public String getNumber() { 13 return this.number; 14 } 15 16 public void setName(String name) { 17 this.name = name; 18 } 19 20 public String getName() { 21 return this.name; 22 } 23 24 public void setEnglish(int score) { 25 this.english = score; 26 } 27 28 public int getEnglish() { 29 return this.english; 30 } 31 32 public void setMathematics(int score) { 33 this.mathematics = score; 34 } 35 36 public int getMathematics() { 37 return this.mathematics; 38 } 39 40 public void setLiterature(int score) { 41 this.literature = score; 42 } 43 44 public int getLiterature() { 45 return this.literature; 46 } 47 48 public double average() { 49 return (this.english + this.mathematics + this.literature) / 3.0; 50 } 51}

WriteGradeToFile.java

1//package grade6; 2import java.io.*; 3import java.util.*; 4//import grade4.*; 5 6public class WriteGradeToFile { 7 private BufferedReader ui = new BufferedReader(new InputStreamReader(System.in)); 8 private List<Student> students = new ArrayList<Student>(); 9 10 private int readInt() throws IOException { 11 return Integer.parseInt(ui.readLine()); 12 } 13 14 void input() throws IOException { 15 while (true) { 16 Student student = new Student(); 17 System.out.print("番号=>"); 18 student.setNumber(ui.readLine()); 19 if (student.getNumber().equals(".")) 20 break; 21 System.out.print("名前=>"); 22 student.setName(ui.readLine()); 23 System.out.print("英語=>"); 24 student.setEnglish(readInt()); 25 System.out.print("国語=>"); 26 student.setLiterature(readInt()); 27 System.out.print("数学=>"); 28 student.setMathematics(readInt()); 29 students.add(student); 30 } 31 System.out.println(students.size() + "人のデータを入力しました。"); 32 } 33 34 public void displayGrade(Student student) { 35 System.out.println("番号 = " + student.getNumber()); 36 System.out.println("名前 = " + student.getName()); 37 System.out.println("英語 = " + student.getEnglish()); 38 System.out.println("国語 = " + student.getLiterature()); 39 System.out.println("数学 = " + student.getMathematics()); 40 System.out.println("平均 = " + student.average()); 41 } 42 43 public void displayGrade() { 44 students.forEach(this::displayGrade); 45 } 46 47 public void save(PrintWriter pw) throws IOException { 48 for (Student student: students) { 49 pw.println(student.getNumber()); 50 pw.println(student.getName()); 51 pw.println(student.getEnglish()); 52 pw.println(student.getLiterature()); 53 pw.println(student.getMathematics()); 54 pw.println(student.average()); 55 pw.flush(); 56 } 57 } 58 59 public void save(String filename) throws IOException { 60 var pw = new PrintWriter(new BufferedWriter(new FileWriter(filename, true))); 61 save(pw); 62 pw.close(); 63 System.out.println(filename + "へ書き出しました。"); 64 System.out.println(); 65 } 66 67 public static void main(String[] args) throws IOException { 68 if (args.length != 1) { 69 System.out.println("エラー:出力ファイル名を1つ与えてください。"); 70 System.out.println("使い方:$ java grade4.WriteGradeTofile.dat"); 71 System.exit(1); 72 } 73 var teacher = new WriteGradeToFile(); 74 teacher.input(); 75 teacher.displayGrade(); 76 teacher.save(args[0]); 77 } 78}

ReadGradeFromFile.java

1//package grade6; 2import java.io.*; 3import java.util.*; 4//import grade4.*; 5 6public class ReadGradeFromFile { 7 private List<Student> students = new ArrayList<Student>(); 8 9 private static int readInt(BufferedReader file) throws IOException { 10 return Integer.parseInt(file.readLine()); 11 } 12 13 public void load(BufferedReader file) throws IOException { 14 while (true) { 15 String number = file.readLine(); 16 if (number == null) { 17 return; 18 } 19 Student student = new Student(); 20 student.setNumber(number); 21 student.setName(file.readLine()); 22 student.setEnglish(readInt(file)); 23 student.setLiterature(readInt(file)); 24 student.setMathematics(readInt(file)); 25 file.readLine(); // drop out average 26 students.add(student); 27 } 28 } 29 30 public void load(String filename) throws IOException { 31 var file = new BufferedReader(new FileReader(filename)); 32 System.err.println(filename + "から読み込みます。"); 33 load(file); 34 System.out.println(students.size() + "人のデータを読み込みました。"); 35 System.err.println(filename + "の読み込みが終了しました。"); 36 } 37 38 public void displayGrade(Student student) { 39 System.out.println("番号 = " + student.getNumber()); 40 System.out.println("名前 = " + student.getName()); 41 System.out.println("英語 = " + student.getEnglish()); 42 System.out.println("国語 = " + student.getLiterature()); 43 System.out.println("数学 = " + student.getMathematics()); 44 System.out.println("平均 = " + student.average()); 45 } 46 47 public void displayGrade() { 48 students.forEach(this::displayGrade); 49 } 50 51 public static void main(String[] args) throws IOException { 52 if (args.length != 1) { 53 System.out.println("エラー:入力ファイル名を1つ与えてください。"); 54 System.out.println("使い方:$ java grade5.ReadGradeFromFilea ファイル名"); 55 System.exit(1); 56 } 57 var teacher = new ReadGradeFromFile(); 58 teacher.load(args[0]); 59 teacher.displayGrade(); 60 } 61}

投稿2020/01/21 10:08

編集2020/01/21 10:21
shiracamus

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

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

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

java

1//書き込み用クラス 2package grade6; 3import java.io.BufferedReader; 4import java.io.BufferedWriter; 5import java.io.FileWriter; 6import java.io.IOException; 7import java.io.InputStreamReader; 8import java.io.PrintWriter; 9import java.util.Vector; 10 11public class WriteGradeToFile{ 12 public static void main(String[] args){ 13 BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); 14 15 Vector<Student> buffer = new Vector<>(); 16 System.out.println("バッファの容量 = "+buffer.capacity()); 17 18 if(args.length != 1) { 19 System.out.println("エラー:出力ファイル名を1つ与えてください。"); 20 System.out.println("使い方:$ java grade4.WriteGradeTofile.dat"); 21 System.exit(1); 22 } 23 24 try { 25 while(true) { 26 Student s = new Student(); 27 System.out.print("番号=>"); 28 s.setNumber(buf.readLine()); 29 30 if(s.getNumber().equals(".")) break; 31 System.out.print("名前=>"); 32 s.setName(buf.readLine()); 33 System.out.print("英語=>"); 34 s.setEnglish(Integer.parseInt(buf.readLine())); 35 System.out.print("国語=>"); 36 s.setLiterature(Integer.parseInt(buf.readLine())); 37 System.out.print("数学=>"); 38 s.setMathematics(Integer.parseInt(buf.readLine())); 39 double avg = new WriteGradeToFile().computeAverage(s); 40 s.setAvg(avg); 41 displayGrade(s); 42 buffer.addElement(s); 43 } 44 45 System.out.println(buffer.size() + "個のデータを入力しました。"); 46 writeGradeToFile(args[0],buffer); 47 48 System.out.println(args[0] + "へ書き出しました。"); 49 50 System.out.println(); 51 } 52 catch(IllegalPointsException ipe){ 53 System.err.println(ipe); 54 } 55 catch(NumberFormatException nfe){ 56 System.err.println(nfe); 57 } 58 catch(IOException ioe){ 59 System.err.println(ioe); 60 } 61 } 62 63 public double computeAverage (Student sub) { 64 return (double) (sub.getEnglish() + sub.getLiterature()+ sub.getMathematics())/3.0; 65 } 66 public static void displayGrade(Student sub){ 67 System.out.println("番号 = "+sub.getNumber()); 68 System.out.println("名前 = "+sub.getName()); 69 System.out.println("英語 = "+sub.getEnglish()); 70 System.out.println("国語 = "+sub.getLiterature()); 71 System.out.println("数学 = "+sub.getMathematics()); 72 System.out.println("平均 = "+sub.getAvg()); 73 } 74 public static void writeGradeToFile(String filename ,Vector<Student> v) throws IOException { 75 76 FileWriter fw = null; 77 BufferedWriter bw = null; 78 PrintWriter pw=null; 79 80 try { 81 fw = new FileWriter(filename,true); 82 bw = new BufferedWriter(fw); 83 pw = new PrintWriter(bw); 84 85 for(int i = 0;i < v.size(); i++){ 86 Student s = v.elementAt(i); 87 pw.println(s.getNumber()); 88 pw.println(s.getName()); 89 pw.println(s.getEnglish()); 90 pw.println(s.getLiterature()); 91 pw.println(s.getMathematics()); 92 pw.println(s.getAvg()); 93 pw.flush(); 94 } 95 } 96 catch(IOException ioe){ 97 System.err.println(ioe); 98 } 99 catch(Exception e){ 100 System.err.println(e); 101 } 102 finally{ 103 if(pw !=null) pw.close(); 104 if(bw !=null) bw.close(); 105 if(fw !=null) fw.close(); 106 } 107 } 108}

java

1//読み込み用クラス 2package grade6; 3import java.io.BufferedReader; 4import java.io.FileNotFoundException; 5import java.io.FileReader; 6import java.io.IOException; 7import java.util.ArrayList; 8import java.util.List; 9 10public class ReadGradeFromFile{ 11 public static void main(String[] args)throws IOException{ 12 13 if(args.length != 1) { 14 System.out.println("エラー:入力ファイル名を1つ与えてください。"); 15 System.out.println("使い方:$ java grade5.ReadGradeFromFilea ファイル名"); 16 System.exit(1); 17 } 18 19 List<Student> buffer = new ArrayList<>(); 20 21 FileReader fr = null; 22 BufferedReader br = null; 23 24 try{ 25 fr = new FileReader(args[0]); 26 br = new BufferedReader(fr); 27 System.err.println(args[0]+"から読み込みます。"); 28 System.err.println(args[0]+"の読み込みが終了しました。"); 29 30 Student s; 31 while(true) { 32 s = new Student(); 33 34 s.setNumber(br.readLine()); 35 s.setName(br.readLine()); 36 37 if(s.getName() == null) { 38 break; 39 } 40 s.setEnglish(Integer.parseInt(br.readLine())); 41 s.setLiterature(Integer.parseInt(br.readLine())); 42 s.setMathematics(Integer.parseInt(br.readLine())); 43 s.setAvg(Double.parseDouble(br.readLine())); 44 buffer.add(s); 45 } 46 System.out.println(buffer.size()+"個のデータを読み込みました。"); 47 displayGrade(buffer); 48 } 49 catch(IllegalPointsException ipe){ 50 ipe.printStackTrace(); 51 } 52 catch(FileNotFoundException fnfe){ 53 System.err.println(fnfe); 54 } 55 catch(IOException ioe){ 56 System.err.println(ioe); 57 } 58 finally{ 59 if(br !=null) br.close(); 60 if(fr !=null) fr.close(); 61 } 62 } 63 64 public static void displayGrade(List<Student> al){ 65 for (int i = 0; i < al.size(); i++){ 66 Student s = (Student)al.get(i); 67 System.out.println("番号 = "+s.getNumber()); 68 System.out.println("名前 = "+s.getName()); 69 System.out.println("英語 = "+s.getEnglish()); 70 System.out.println("国語 = "+s.getLiterature()); 71 System.out.println("数学 = "+s.getMathematics()); 72 System.out.println("平均 = "+s.getAvg()); 73 } 74 } 75}

java

1package grade6; 2 3public class Student { 4 5 private String Number; 6 private String Name; 7 private int english; 8 private int literature; 9 private int mathematics; 10 private double avg; 11 12 public String getNumber() { 13 return Number; 14 } 15 16 public void setNumber(String number) { 17 Number = number; 18 } 19 20 public String getName() { 21 return Name; 22 } 23 24 public void setName(String name) { 25 Name = name; 26 } 27 28 public int getEnglish() { 29 return english; 30 } 31 32 public void setEnglish(int english) { 33 this.english = english; 34 } 35 36 public int getLiterature() { 37 return literature; 38 } 39 40 public void setLiterature(int literature) { 41 this.literature = literature; 42 } 43 44 public int getMathematics() { 45 return mathematics; 46 } 47 48 public void setMathematics(int mathematics) { 49 this.mathematics = mathematics; 50 } 51 52 public double getAvg() { 53 return avg; 54 } 55 56 public void setAvg(double avg) { 57 this.avg = avg; 58 } 59 60}

投稿2020/01/21 08:19

yureighost

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問