1

オブジェクトごとに 1 行に 1 つずつ、合計 5 つの情報を含むテキスト ファイルを読み込んでいます。改行なし。そして、その情報を ArrayList に入力します。そこから変更できます。新しいオブジェクトを追加したり、オブジェクトのグループを削除したり、印刷したりします。ArrayList を出力する行を入力すると、変更されたリストが出力されるため、そのメソッドはファイルで動作するようです。

ArrayList を新しい .txt ファイルに保存するのに問題があります。新しいファイルが作成されますが、空白です。私が言ったように、メソッドを選択して ArrayList を変更するたびに、その新しいリストが返されるため、その理由はわかりません。

.txt ファイルを読み込む方法。

public void loadData(File fileName) {

Scanner inputFile = null;

    try {
        inputFile = new Scanner (new File("textImport.txt"));
    }

    catch (Exception FileNotFoundException) {
        System.out.println("ERROR: " + FileNotFoundException.getMessage());
        System.exit(1);
    }

    while (inputFile.hasNext()) {
        String fileName = inputFile.nextLine();
        String fileGrade = inputFile.nextLine();
        String fileMajor = inputFile.nextLine();
        int fileYear = Integer.parseInt(inputFile.nextLine());
        double fileId = Double.parseDouble(inputFile.nextLine());
        Student stu = new Student (fileName , fileGrade , fileMajor , 
                fileYear , fileId );
        studentList.add(stu) ;
    }
}

ファイルをエクスポートしようとしています。

public void save() {

    PrintWriter outputFile = null;
    try {
        outputFile = new PrintWriter("textExport.txt");
    } 

    catch (IOException e) {
        e.printStackTrace();
    }

    while (inputFile.hasNextLine()) {
        String line = inputFile.nextLine();
        outputFile.write(line);
        outputFile.close();
    }
}
4

2 に答える 2

1

保存のループは、入力ファイルではなく、リストを中心に構築する必要があります。

ファイルを完全に書き直す必要があります。削除操作があるため、ファイルに追加することはできません。

public void save() {
   try( PrintWriter outputFile = new PrintWriter("textExport.txt")) {
      for( Student s : studentList ) {
         s.writeTo( outputFile );
      }
      outputFile.close(); // Optional, try() close it in any case.
   }
}

クラス Student、メソッド writeTo():

public void writeTo( PrintWriter outputFile ) throws IOException {
   outputFile.println( this.fileName );
   outputFile.println( this.fileGrade );
   outputFile.println( this.fileMajor );
   outputFile.println( this.fileYear );
   outputFile.println( this.fileId );
}

Student への静的メソッドを提案します: (後で Factory にリファクタリングされる可能性があります)

public static Student readFrom( Scanner source ) {
   this.fileName  = source.nextLine();
   this.fileGrade = source.nextLine();
   this.fileMajor = source.nextLine();
   this.fileYear  = Integer.parseInt( source.nextLine());
   this.fileId    = Double.parseDouble( source.nextLine());
   return new Student( fileName, fileGrade, fileMajor,  fileYear, fileId );
}

ローダーは次のようになります。

public void loadData( File fileName ) {
   try( Scanner scanner = new Scanner( new File( "textImport.txt" ))) {
      while( scanner.hasNext()) {
            studentList.add( Student.readFrom( scanner ));
      }
   }
}
于 2013-04-07T19:56:31.277 に答える
0

オービンのアイデアの助けを借りて、私にとって何がうまくいったか:

public void save() {
   PrintWriter outputFile = null;
   try {
      outputFile = new PrintWriter("exportFile.txt");
      for ( Student stu : studentList) {
         outputFile.println(stu);
      }
   } 
   catch (IOException e) {
      e.printStackTrace();
   }
   if( outputFile != null ) [
      outputFile.close();
   }
}
于 2013-04-07T20:19:30.220 に答える