2013-02-09 3 views
0

Я пробовал использовать формат BufferWriter, а также FileWriter и PrintWriter, каждый из которых имеет логический оператор true, но оба они ведут себя так же, как если бы я просто использовал простой новый файл. Каждый раз, когда я заканчиваю свою программу, я вызываю функцию, которая записывает сохраненные данные для добавления. В результате происходит перезапись последних сохраненных данных. У меня также есть другие блоки кода, которые также обрабатывают этот текстовый файл, и их реформирование тоже ничего не изменило.Выходные файлы продолжают получать сообщения в Java

//saves user information to "Users.txt" which will be called in the finally block after choice switch 
public void writeUsers() 
{ 
    try{ 

     File userFile = new File("Users.txt"); 
     PrintWriter output = new PrintWriter(userFile); 
     for(User i: userList) {  
     output.append("Name:");  
     output.println(i.getrealName()); 
     output.append("UID:"); 
     output.println(i.getidName()); 
     output.append("Password:"); 
     output.println(i.getpassword()); 
     output.println(" "); 
     } 
     output.close(); 
     System.out.print("Information has been saved to Users.txt\n"); 


    } 
    catch(FileNotFoundException fnf) { 
     System.err.println("FileNotFoundException: File Users.txt does not exist " + fnf); 
    } 
    catch(IOException eyeoh) { 
     System.err.println("IOException: Error writing to Users.txt " + eyeoh); 
    } 
} 

ответ

1

Вы должны создать PrintWriter в режиме добавления. В противном случае, когда он сначала откроет файл, он очистит его. Вы можете открыть его в режиме добавления с помощью:

new PrintWriter(new FileWriter(userFile,true)) // the `true` argument opens it in append mode 
2

Конструктор PrintWriter(File) обрезает выходной файл по умолчанию. Тот факт, что вызван метод PrintWriterappend(), не означает, что он изменяет режим открываемого файла. Поведение для append является described как:

Вызов этого метода формы out.append (CSQ) ведет себя точно так же, как вызов

out.write(csq.toString()) 

Здесь вы могли бы использовать конструктор для PrintWriter, который принимает FileOutputStream для добавления

PrintWriter output = 
    new PrintWriter(new FileOutputStream(userFile, true /* append = true */)); 
1

PrintWriter по Дефье alt обрезает все существующие данные. Чтобы добавить, вы можете, как и другие ответы, добавить «истинный» аргумент в конструктор, который обозначает «append = true»,

Однако это сделано более элегантно, используя java.nio.file. Files вместе с java.nio.file. StandardOpenOption, в котором вы можете указать StandardOpenOption.APPEND, а не StandardOpenOption.TRUNCATE_EXISTING Вы также можете указать такие вещи, как StandardOpenOption.CREATE, который создает файл, если он не существует.

Кроме того, не забудьте либо поместить свой оператор output.close() в блок finally, либо использовать try-with-resources. В противном случае, если поток программы прерывается (т. Е. Исключение выбрасывается), output останется незамкнутым. Я лично использую try-in-resources, так как это меньше хлопот: просто объявите все свои ресурсы, и они автоматически закрываются для вас, независимо от того, нарушен ли поток программы.

Кроме того, в качестве общего наконечника, печати или передать фактический Exception объект в вашем catch блоке, в отличии от просто «пользовательской строки», чтобы не потерять первоначальное содержание Exception брошенных. Затем вы можете конкатенировать это с любой строкой, которую вы также хотите распечатать.

try(BufferedWriter bufWriter = 
     Files.newBufferedWriter(Paths.get("Users.txt"), 
      Charset.forName("UTF8"), 
      StandardOpenOption.WRITE, 
      StandardOpenOption.APPEND, //Makes this BufferedWriter append to the file, not truncate 
      StandardOpenOption.CREATE); 
    PrintWriter output = new PrintWriter(bufWriter, true);) 
{ 

    output.println("Text to be appended."); 

}catch(FileNotFoundException e){ 
    System.err.println(e + "Custom string"); 
}catch(IOException e){ 
    System.err.println(e + "Something eyeoh occurred..."); 
} 

Это использует примерочный с-ресурсов заявление объявить и создать BufferedWriter с помощью java.nio.file.Files, который принимает StandardOpenOption параметров, и авто-промывка PrintWriter (обозначается «истинный» в конструкторе) из полученного BufferedWriter , PrintWriter 's println(), может быть вызван для записи в файл.

Параметры, используемые в этом коде: открывает файл для записи, только присоединяется к файлу и создает файл, если он не существует.

Paths.get("path here") можно заменить new File("path here").toPath(), если вы работаете исключительно с File объектов (то есть, если вы используете JFileChooser.getSelectedFile()) И Charset.forName("charset name") могут быть изменены для обеспечения желаемого Charset.

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