2013-04-07 105 views
1

我正在閱讀一個文本文件,每個對象有五行信息,每行一個。沒有換行符。有了這些信息,我將它填充到一個ArrayList中。從那裏我可以修改它。就像添加新對象一樣,刪除並打印一組對象。該方法似乎是工作文件,因爲如果我放入一行來打印ArrayList,它將打印修改後的列表。如何回寫到.txt文件?

我無法保存的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(); 
    } 
} 
+0

在你的'save'方法中,你有'inputFile'的引用。是重新宣佈還是它是同一個對象? – christopher 2013-04-07 19:54:14

+0

爲什麼在while循環中關閉inputFile和outputFile?循環後你不應該關閉嗎? – Marcellus 2013-04-07 19:55:07

+0

我不確定......這是在我的筆記中。當我打字時,我不明白爲什麼它在那裏。 – trama 2013-04-07 19:56:27

回答

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. 
    } 
} 

類學生,方法的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); 
} 

我建議一個靜態方法到學生:(可以在以後重新分解成一廠)

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)); 
     } 
    } 
} 
+0

我應該使用迭代器嗎?或listIternator? – trama 2013-04-07 19:59:07

+0

通過提案修改的答案。 – Aubin 2013-04-07 20:01:36

+0

有沒有辦法做到這一點,而不寫另一種方法? – trama 2013-04-07 20:07:52

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(); 
    } 
} 
+0

for循環必須位於try-catch內部,因爲如果發現異常,則不能使用outputfile。 – Aubin 2013-04-07 20:20:37

+0

@Aubin,編輯。謝謝! – trama 2013-04-07 20:25:54

+0

已編輯:缺少outputFile的聲明和null的情況。 – Aubin 2013-04-07 20:28:47