Java 文件写入-打印流附加

Java 文件写入-打印流附加,java,file-io,append,Java,File Io,Append,我试图将一些信息附加到文本文件中,但该文件仅显示最后写入的元素 有许多Engineers,但它只将读取的最后一个元素打印到文件中 例如: Engineer e = new Engineer(firstName,surName,weeklySal); PrintStream writetoEngineer = new PrintStream(new File ("Engineer.txt")); //This is not append. Only print. Overwrites the f

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

有许多
Engineer
s,但它只将读取的最后一个元素打印到文件中

例如:

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

我看不出你在哪里关闭文件。我也没看到你在读什么

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

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

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

因为给定的代码片段不是一个自包含的可编译示例(尽管很简单),我只能猜测PrintStream是在循环中创建的,工程师集合中的每次迭代。这将导致文件被截断,如PrintStream的构造函数javadoc所示:

参数:

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

请尝试以下示例代码:

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

}
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.io.PrintStream;
导入java.util.ArrayList;
导入java.util.List;
公营印刷工程师{
公共静态类工程师{
私有最终字符串名;
私人姓氏;
私人最终国际周;
公共工程师(字符串名、字符串姓氏、int weeklySal){
超级();
this.firstName=firstName;
this.姓氏=姓氏;
this.weeklySal=weeklySal;
}
public int calculateMonthly(){
返回weeklySal*4;//大约
}
@凌驾
公共字符串toString(){
返回firstName+“”+姓氏;
}
}
/**
*@param args
*@抛出FileNotFoundException
*/
公共静态void main(字符串[]args)引发FileNotFoundException{
工程师e1=新工程师(“第一名”、“第二名”和“第100名”);
工程师e2=新工程师(“第一名2”,“第二名”,200);
工程师e3=新工程师(“第一名3”,“第三名”,300);
工程师名单=新阵列列表(3);
增加(e1);
增加(e2);
增加(e3);
//在循环开始之前,在此处实例化PrintStream
PrintStream writetoEngineer=新的PrintStream(新文件(“Engineer.txt”);
适用于(工程师:工程师){
//此处的new PrintStream(…)截断文件(请参见javadoc)//这不是追加。仅在每个项上打印.Refresh文件
writetoEngineer.append(engineer.toString()).append(“”)
.append(“+engineer.calculateMonthly()).append('\n');
}
}
}

这不是PrintStream.append的意思;它并不声称要附加到文件中(它甚至不知道它正在处理一个文件)。你正在使用的方法的文档通常是相关的。还要注意的是,你似乎在一个程序实例中编写所有的工程师。如果是这种情况,您甚至可能不需要文件附加,而是可以将
PrintStream
创建移动到迭代工程师的循环之外。它不会附加新文件(“Engineer.txt”)但我附加了FileOutputStream文件和FileOutputStream之间的区别:S@Mert:
File
没有一个构造函数,您可以像Peter使用的
FileOutputStream
构造函数那样指定要追加。显然,如果在后者中指定
false
,它将不会追加。
文件
文件输出流
之间有什么区别?它们完全不相交。当您将
文件
传递给
打印流
时,它将在引擎盖下创建一个
文件输出流
,但处于非附加模式。只是为了方便。类似地,您可以将
文件
传递到
文件输出流
中,但为了方便起见,它还需要一个字符串。