【问题标题】:File Write - PrintStream append文件写入 - PrintStream 追加
【发布时间】:2011-12-24 00:12:03
【问题描述】:

我正在尝试将一些信息附加到文本文件中,但该文件仅显示最后写入的元素。

有很多Engineers,但它只将最后一个读取的元素打印到文件中。

例如:

Engineer e = new Engineer(firstName,surName,weeklySal);
PrintStream writetoEngineer = new PrintStream(new File ("Engineer.txt"));

//This is not append. Only print. Overwrites the file on each item.
writetoEngineer.append(e.toString() + " "  + e.calculateMontly(weeklySal));

【问题讨论】:

  • PrintStream.append 不是这个意思;它没有声称要附加到文件(它甚至不知道它正在处理文件)。您正在使用的方法的文档通常是相关的。
  • 另请注意,您似乎正在编写程序的一个实例中的所有工程师。如果是这种情况,您甚至可能不需要附加文件,而是可以将您的 PrintStream 创建移到迭代工程师的循环之外。

标签: java file-io append


【解决方案1】:

我看不到你在哪里关闭文件。我也没有看到你在读任何东西。

我假设您想附加到文件而不是每次都覆盖它。在这种情况下,您需要使用 FileOutputStream 的 append 选项,因为这不是默认行为。

PrintStream writetoEngineer = new PrintStream(
     new FileOutputStream("Engineer.txt", true)); 

顺便说一句:e.toString() + " "e + " " 几乎相同,只是如果 e 为 null 则不会引发异常。

【讨论】:

  • 它没有附加新文件(“Engineer.txt”),但我附加了 FileOutputStream 文件和文件输出流有什么区别:S
  • @Mert: File 没有构造函数,您可以像 Peter 使用的 FileOutputStream 构造函数一样指定追加。显然,如果您在后者中指定false,它将不会附加。 FileFileOutputStream 有什么区别?它们是完全不相交的。当您将File 传递给PrintStream 时,它将在后台创建FileOutputStream,但处于非附加模式。它只是为了方便。同样,您可以将File 传递给FileOutputStream,但为了方便起见,它也需要一个字符串。
【解决方案2】:

由于给定代码 sn-p 的代码不是一个自包含的可编译示例(虽然它很简单),我只能猜测 PrintStream 是在循环内创建的,每次迭代 Engineer 集合。这将导致文件被截断,如 PrintStream 的构造函数 javadoc 中所示:

参数:

file - 用作此打印流目标的文件。如果文件存在,那么它将被截断为零大小;否则,将创建一个新文件。输出将被写入文件并被缓冲。

试试这个示例代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;


public class PrintEngineers {

    public static class Engineer {
    
        private final String firstName;
        private final String surName;
        private final int weeklySal;
    
        public Engineer(String firstName, String surName, int weeklySal) {
            super();
            this.firstName = firstName;
            this.surName = surName;
            this.weeklySal = weeklySal;
        }

        public int calculateMonthly() {
            return weeklySal * 4; // approximately
        }
    
        @Override
        public String toString() {
            return firstName + " " + surName;
        }
    }

    /**
     * @param args
     * @throws FileNotFoundException 
     */
    public static void main(String[] args) throws FileNotFoundException {
    
        Engineer e1 = new Engineer("first1", "sur1", 100);
        Engineer e2 = new Engineer("first2", "sur2", 200);
        Engineer e3 = new Engineer("first3", "sur3", 300);

        List<Engineer> engineers = new ArrayList<>(3);
        engineers.add(e1);
        engineers.add(e2);
        engineers.add(e3);

        // instanciate PrintStream here, before the loop starts
        PrintStream writetoEngineer = new PrintStream(new File("Engineer.txt"));
        for (Engineer engineer : engineers) {
            // new PrintStream(...) here truncates the file (see javadoc)               //This is not append.Only print.Refresh file on each item 
            writetoEngineer.append(engineer.toString()).append(' ')
                        .append("" + engineer.calculateMonthly()).append('\n'); 
        
        }
    }

}

【讨论】:

    猜你喜欢
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 2011-06-14
    • 2013-08-15
    • 2017-04-02
    • 1970-01-01
    相关资源
    最近更新 更多