文件写入 - PrintStream追加

19

我试图将一些信息追加到文本文件中,但是文件只显示最后一个被写入的元素。

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

例如:

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));

1
这不是 PrintStream.append 的意思;它并没有声称要附加到文件(它甚至不知道自己正在处理一个文件)。你使用的方法的文档通常是相关的。 - Mark Peters
还要注意的是,看起来你正在编写程序的一个实例中的所有工程师。如果是这种情况,你甚至可能不需要文件追加,而是可以将你的PrintStream创建移动到迭代你的工程师的循环之外。 - Mark Peters
2个回答

54

我看不到你关闭文件的地方。我也没有看到你读取任何内容。

我假设你想每次在文件末尾添加内容而不是覆盖它。在这种情况下,你需要使用FileOutputStream的追加选项,因为这不是默认行为。

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

顺便提一下: e.toString() + " "e + " " 几乎是相同的,只是如果 e 为 null,前者不会抛出异常。


它不是使用 new File("Engineer.txt") 进行附加,而是使用 FileOutputStream 进行附加。文件和 FileOutputStream 之间有什么区别呢?:S - snnlankrdsm
2
@Mert:File没有构造函数可以像Peter使用的FileOutputStream构造函数一样指定追加。显然,如果在后者中指定false,它将不会追加。FileFileOutputStream之间有什么区别?它们是完全不同的。当您将File传递给PrintStream时,它会在幕后创建一个非追加模式的FileOutputStream,但这只是为了方便而已。同样,您也可以将File传递到FileOutputStream中,但出于方便考虑,它还接受一个字符串。 - Mark Peters

3
由于给出的代码片段不是一个自包含可编译示例(尽管它很简单),我只能猜测每次迭代工程师集合时,PrintStream都会在循环内部创建。这将导致文件被截断,如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'); 
        
        }
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接