2 回答

TA貢獻1828條經驗 獲得超3個贊
正如GhostCat和uaraven已經提到的,重置并不是你所期望的,你應該看看關于序列化的教程,也許可以考慮使用sth。否則,如果這不適合您的用例。
如果創建新的 FileOutputStream,您的代碼可能如下所示:
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class SerializationTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
String path = "EmpObject.ser";
ArrayList<Employee> empList = new ArrayList<>();
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
empList.add(emp1);
empList.add(emp2);
oos.writeObject(empList);
empList.add(emp3);
// Create a new FileOutputStream to override the files content instead of appending the new employee list
oos = new ObjectOutputStream( new FileOutputStream(path));
oos.writeObject(empList);
ObjectInputStream objectinputstream = new ObjectInputStream(new FileInputStream(path));
List<Employee> readCase = (List<Employee>) objectinputstream.readObject();
System.out.println(readCase);
}
}

TA貢獻1831條經驗 獲得超9個贊
您的代碼會發生什么情況:
您將列表寫入文件,其中包含兩個條目
您重置流
你再次寫列表,有三個條目
因此,您的文件包含兩個值,是的。兩個列表,一個包含 2 個,一個包含 3 個條目。
換句話說:不會重置已寫入文件的內容!您編寫了一個包含兩個條目的列表。您只是在重置有關存儲對象的信息,以便再次完全序列化 emp1 和 emp2。如果沒有對重置的調用,JVM 將理解它不需要再次完全序列化 emp1 和 emp2。reset()
含義:默認情況下,JVM 壓縮要傳輸的數據量。它記住哪些對象已經寫入,而不是重復寫入它們,它只將類似“之前序列化的對象X再次出現”之類的東西寫入流中。
所以:我認為你根本不理解方法的意義。解決方案:閱讀一個小教程,就像教程點中的一樣。reset()
根據OP的最新評論進行編輯:
你所要求的東西以這種方式是不可能的。您正在編寫列表對象。這意味著此時該列表的所有條目都將寫入文件。JVM 記住“該列表已經寫好了”,所以即使其內部狀態在此期間發生了變化,它也不會再寫它。
添加回答
舉報