【问题标题】:PrintWriter append method not appendingPrintWriter 追加方法未追加
【发布时间】:2011-11-21 10:54:12
【问题描述】:

以下方法只写出我添加的最新项目,它不会附加到以前的条目。我做错了什么?

public void addNew() {
    try {
        PrintWriter pw = new PrintWriter(new File("persons.txt"));
        int id = Integer.parseInt(jTextField.getText());
        String name = jTextField1.getText();
        String surname = jTextField2.getText();
        Person p = new Person(id,name,surname);
        pw.append(p.toString());
        pw.append("sdf");
        pw.close();
    } catch (FileNotFoundException e) {...}
}

【问题讨论】:

    标签: java printwriter


    【解决方案1】:

    PrintWriter 的方法被称为append() 并不意味着它改变了打开文件的模式。

    您还需要以附加模式打开文件:

    PrintWriter pw = new PrintWriter(new FileOutputStream(
        new File("persons.txt"), 
        true /* append = true */)); 
    

    另请注意,文件将以系统默认编码写入。这并不总是需要的,并且可能会导致互操作性问题,您可能需要明确指定文件编码。

    【讨论】:

    • 这就像唤醒沉睡的线程,很抱歉。但我有一个疑问。如果仅给定 File 对象,并且不允许使用 Stream 类(例如 FileOutputStream 等),我将如何在文件中进行附加操作。我被允许的是:Printwriter pw = new PrintWriter(file); : 我试过 append()、write()、print()。在这种情况下是否有任何现成的附加方法。
    • 澄清一下,PrintWriter 的 'append()' 方法是指它附加到 Writer 本身,即它自己的输出流,而不是文件。
    • 参考@user1707035 的问题,不,看起来你不能使用 PrintWriter 来追加而不用 OutputStream 对象构造它。这是因为 PrintWriter 在实例化时打开流,并且唯一支持 File 或文件名作为参数的构造函数通过在内部构造不带“append”参数的 OutputStream 对象来打开 File。参考(文档):docs.oracle.com/javase/7/docs/api/java/io/…
    【解决方案2】:
    PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"),true));
    

    true 是附加标志。见documentation

    【讨论】:

      【解决方案3】:

      以追加模式打开文件,如下代码:

       PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"), true)); 
      

      【讨论】:

        【解决方案4】:

        恕我直言,接受的答案没有考虑意图是写字符的事实。 (我知道这个话题很老了,但是因为在寻找相同的话题时我在找到建议的解决方案之前偶然发现了这篇文章,所以我在这里发帖。)

        FileOutputStream docs 开始,当您想打印字节时使用FileOutputStream

        FileOutputStream 用于写入原始字节流,例如 图像数据。对于写入字符流,请考虑使用 文件编写器。

        另外,来自BufferedWriter docs

        除非需要提示输出,否则建议包装一个 BufferedWriter 围绕其 write() 操作可能是的任何 Writer 成本高,例如 FileWriters 和 OutputStreamWriters。

        最后,答案如下(如in this other StackOverFlow post 所述):

        PrintWriter out = null;
        try {
            out = new PrintWriter(new BufferedWriter(new FileWriter("writePath", true)));
            out.println("the text");
        }catch (IOException e) {
            System.err.println(e);
        }finally{
            if(out != null){
                out.close();
            }
        } 
        

        此外,从 Java 7 开始,您可以使用 try-with-resources 语句。不 finally 块是关闭声明的资源所必需的,因为 它是自动处理的,而且也不那么冗长:

        try(PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("writePath", true)))) {
            out.println("the text");
        }catch (IOException e) {
            System.err.println(e);
        }
        

        【讨论】:

          【解决方案5】:

          您不需要像所有其他答案中所示的那样加倍缓冲。 你可以简单地做

          PrintWriter pw = new PrintWriter(new FileWriter("persons.txt",true));
          

          【讨论】:

            猜你喜欢
            • 2014-10-31
            • 2015-06-12
            • 1970-01-01
            • 2013-04-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多