whileループを追加した後、Printwriterが指定されたファイルに出力されないようです

私は学校のためのプロジェクトの初期段階にあり、すでにバグに遭っています。 whileループなしでforループを使って配列リストの内容を単純に書き出すと、すべてうまく動作しますが、whileループを使用してオプションを提供できるようにするには、出力テキストファイルには単にプログラム何もしなかったが、空のテキストファイルを作成した。私は非常に混乱しています。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;
import java.io.PrintStream;
import javax.swing.JOptionPane;
import java.util.Arrays;

public class studentProcessor
{
   public static void main(String[] args) throws FileNotFoundException
   {  
      PrintStream pr=System.out;
      String inputFileName = JOptionPane.showInputDialog("Input file:");
      String outputFileName = JOptionPane.showInputDialog("Output file:");
      File inputFile = new File(inputFileName);
      Scanner in = new Scanner(inputFile);
      PrintWriter out = new PrintWriter(outputFileName);
      ArrayListstudent = new ArrayList();
      while (in.hasNextLine())
      {
          student.add(new Student(in.nextInt(), in.next(), in.nextDouble()));
      }
      in.close();
      boolean done=false;
      while (!done)
        {
            String m=JOptionPane.showInputDialog("Please enter the number for the action which you would like to perform." +
                "\n1. Add new student(s)\n2. Remove student(s)\n3. Update student's data\n4. Search for student" +
                "\n5. Sort students\n6. Create GPA report\n7. Output information to a .txt file\n0. Exit");
            if (m.equals("1"))
            {
                JOptionPane.showMessageDialog(null, "Add new student(s)");
            }
            else if (m.equals("2"))
            {
                JOptionPane.showMessageDialog(null, "Remove student(s)");
            }
            else if (m.equals("3"))
            {
                JOptionPane.showMessageDialog(null, "Update student's data");
            }
            else if (m.equals("4"))
            {
                JOptionPane.showMessageDialog(null, "Search for a student");
            }
            else if (m.equals("5"))
            {
                JOptionPane.showMessageDialog(null, "Sort students");
            }
            else if (m.equals("6"))
            {
                JOptionPane.showMessageDialog(null, "Create GPA report");
            }
            else if (m.equals("7"))
            {
                JOptionPane.showMessageDialog(null, "Output information to a .txt file");
                out.println("The students' information is listed below:");
                for (Student Stu:student)
                {
                    out.println(Stu.getId()+" "+Stu.getLName()+" "+Stu.getGpa());
                }
            }
            else if (m.equals("0"))
            {
                System.exit(0);
                done=true;
            }
            else 
            {
                JOptionPane.showMessageDialog(null, "You have not entered a valid command, try again.");
            }
        }
      out.close();
   }
}

ここに私が使っている学生クラスがあります。

class Student
{ 
 private int id;
 private String lName;
 private double gpa;

 public Student (int studentId, String studentLName, double studentGpa)
   { 
     id=studentId;
     lName=studentLName;
     gpa=studentGpa;
   }

 public int getId()
   { return id; }

 public String getLName()
   { return lName; }

 public double getGpa()
   { return gpa; }

 public void setId(int id)
   { this.id=id; }

 public void setLName(String lName)
   { this.lName=lName; }

 public void setGpa(double gpa)
   { this.gpa=gpa; }

}

助けてくれてありがとう=]

編集:これは今、プリントライターで動作するコードの新しいセクションです。すべての助けてくれてありがとう!

else if (m.equals("7"))
        {
            String outputFileName = JOptionPane.showInputDialog("Designate an output file for student information:");
            PrintWriter out = new PrintWriter(outputFileName);
            out.println("The students are listed below:");
            for (Student Stu:student)
            {
                out.println(Stu.getId()+" "+Stu.getLName()+" "+Stu.getGpa());
            }
            out.close();
        }
0
なぜあなたはSystem.exit(0)を持っていますか? doneをdoneに設定すると、プログラムが終了し、適切にoutfileを適切に閉じます。
追加された 著者 Ashwinee K Jha,

3 答え

問題は、out.closeの行が決して呼び出されないことです。

System.exitメソッドは、印刷ライターを閉じる前にアプリケーションを終了します。

あなたはリソースを閉じるためにtry finallyブロックを使うべきです。

また、System.exit呼び出しがwhileループではなくメソッドの最後にあった場合、コードがより明確になります。ループを終了するにはすでにブール値を使用していますので、終了して残りのコードを実行してください。

2
追加された
system.exit()を指摘してくれてありがとう。私はブール値に変更した後にそれを削除するのを忘れてしまった。私はまた私の問題を把握し、正確にループの中で出力ファイルの文字列を初期化するとき、私はプログラムの冒頭ではなく代わりに使用したい。
追加された 著者 Alec James,

出力ストリームを書き込んだ後、出力ストリームをフラッシュする必要があります:

out.flush();

さらに、ユーザーが書き込みオプション(7)を選択したときに、出力ストリームを作成する必要があります。それ以外の場合は、レコードを同じファイルに繰り返し書きます。だからこのような何か:

     } else if (m.equals("7")) {
        JOptionPane.showMessageDialog(null,
              "Output information to a .txt file");
        final PrintWriter out = new PrintWriter(outputFileName);
        out.println("The students' information is listed below:");
        for (Student Stu : student) {
           out.println(Stu.getId() + " " + Stu.getLName() + " "
                 + Stu.getGpa());
        }
        out.close();
     } 
1
追加された
finalを使って変数にタグを付けることで、コンパイラが特定の種類の最適化を行うことができるので、プログラムを向上させることができます。それはあなたがそれを残しても殺人者ではありません。
追加された 著者 Perception,
別の答えから私のコメントを続けるために、私はあなたが示した場所にout.close()を移動し、今はうまくいきます。私がout.closeを置いた場所だけであればidk、またはoutファイルの文字列の初期化を移動したためです。私はそれがうまくいったかの編集を投稿します
追加された 著者 Alec James,
しかし、PrintWriterがコードの実行方法に大きな違いをもたらす前に、「最終的な」ことを尋ねたいと思いますか?申し訳ありませんが、私は初心者であり、これはこの複合施設のプログラムへの私の最初の努力です。
追加された 著者 Alec James,

それを閉じる前にPrintWriterをフラッシュしてみましたか?

1
追加された
クローズするとライターがフラッシュされますが、クローズメソッドが呼び出されていないという問題があります。
追加された 著者 Michael Krussel,
確かに正しい - 私はその厄介なSystem.exit()に気付かなかった。
追加された 著者 Alessandro Santini,