2013-04-07 4 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

+0

Почему вы закрываете inputFile и outputFile в цикле while? Разве вы не должны закрываться после цикла? – Marcellus

+0

Я не уверен ... Это было в моих заметках. Я действительно не понимал, почему он был там, когда я набрал его. – trama

ответ

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: (могут быть повторно учтены позже в заводе)

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

+0

Ответ исправлен с предложением. – Aubin

+0

Есть ли способ сделать это, не называя другого метода? – trama

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, потому что если вы поймаете исключение, вы не сможете использовать выходной файл. – Aubin

+0

@Aubin, под редакцией. Благодаря! – trama

+0

Отредактировано: Отсутствует объявление outputFile и случай null. – Aubin

Смежные вопросы