0

我尝试过使用 BufferWriter 格式以及 FileWriter 和 PrintWriter,每个都带有一个 boolean true 语句,但它们的行为就像我只是使用一个简单的新文件一样。每次程序运行结束时,我都会调用写入要附加的已保存数据的函数。最终发生的是它覆盖了最后保存的数据。我还有其他代码块也可以处理该文本文件,并且重新格式化它们也无济于事。

//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);
    }
} 
4

3 回答 3

2

默认情况下,构造函数PrintWriter(File)会截断输出文件。PrintWriter' 方法被调用的事实append()并不意味着它改变了正在打开的文件的模式。的行为 描述append为:

形式为 out.append(csq) 的此方法的调用与调用的行为方式完全相同

 out.write(csq.toString()) 

在这里,您可以使用构造函数PrintWriterFileOutputStream追加

PrintWriter output = 
   new PrintWriter(new FileOutputStream(userFile, true /* append = true */)); 
于 2013-02-09T21:54:37.760 回答
1

默认的 PrintWriter 会截断所有现有数据。正如其他答案所建议的那样,要追加您可以向构造函数添加一个“true”参数,表示“append = true”

但是,使用 java.nio.file 可以更优雅地完成此操作。文件连同 java.nio.file。StandardOpenOption,您可以在其中指定StandardOpenOption.APPEND而不是StandardOpenOption.TRUNCATE_EXISTING 您还可以指定诸如StandardOpenOption.CREATE如果文件不存在则创建文件之类的内容。

此外,请记住将您的output.close()语句放在一个finally块中,或使用 try-with-resources。否则,如果程序的流程被中断(即抛出异常),output将保持未关闭状态。我个人使用 try-with-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...");
}

这使用了一个 try-with-resources 语句来声明和创建一个BufferedWriterusing java.nio.file.Files,它接受StandardOpenOption参数,以及一个来自 resultant 的自动刷新PrintWriter(在构造函数中用“true”表示)BufferedWriterPrintWriterprintln()方法,然后可以调用写入文件。

此代码中使用的StandardOpenOption参数:打开文件进行写入,仅追加到文件,如果文件不存在则创建文件。

Paths.get("path here")new File("path here").toPath()如果您只使用File对象(即,如果您正在使用JFileChooser.getSelectedFile()) ,则可以替换为并且Charset.forName("charset name")可以修改以适应所需的Charset.

于 2013-07-25T20:48:17.893 回答
1

您必须创建PrintWriter附加模式。否则,当它第一次打开文件时,它会清除它。您可以使用以下命令以附加模式打开它:

new PrintWriter(new FileWriter(userFile,true)) // the `true` argument opens it in append mode
于 2013-02-09T21:54:36.610 回答