由于未知原因,寫入相同的objectOutputStream實體和單獨撰寫的實體(如果我objectOutputStream在每次迭代中打開)都創建了兩個不同的檔案。
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(filepath1));
for (User user : users)
{
objectOutputStream.writeObject(user);
}
objectOutputStream.close();
for (User user : users)
{
objectOutputStream = new ObjectOutputStream(new FileOutputStream(filepath2, true));
objectOutputStream.writeObject(user);
objectOutputStream.close();
}
因此,當我在這樣的回圈中讀取檔案時,它僅適用于第一個檔案。
for( int i = 0; i< users.length; i )
{
readUsers[i] = (User)objectInputStream.readObject();
}
讀取第二個檔案給了我一個正確讀取的用戶,然后是一個 Exception java.io.StreamCorruptedException: invalid type code: AC。我檢查了這些檔案的內容,似乎第二個記錄的每條記錄開頭都有過多的資料(它占用的空間幾乎是第一個記錄的兩倍)。那么如何結合第二種方式將實體寫入檔案并隨后在一個簡單的回圈中讀取它們呢?
uj5u.com熱心網友回復:
由 實作的 Java 序列化,Object{Output,Input}Stream除了每個物件的元資料和資料外,還有一個流標頭,它只出現一次,而不是每個物件。通常在一個檔案中,這相當于一個檔案頭。如果要將多個流放在一個檔案中,則必須自己管理流邊界:
//nopackage
import java.io.*;
public class SO71319428MultipleSerial {
public static void main (String[] args) throws Exception {
User[] a = { new User("Alice",1), new User("Bob",2), new User("Carol",3) };
for( User u : a )
try( ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(filename,true)) ){
oo.writeObject(u);
}
System.out.println("reading " new File(filename).length());
try( InputStream fi = new FileInputStream(filename) ){
for( int i = 0; i < 3; i ){
ObjectInputStream oi = new ObjectInputStream(fi);
System.out.println( oi.readObject() );
// DON'T close because that closes the underlying FileInputStream; just leak instead
}
}
}
public static String filename = "SO71319428.out";
static class User implements Serializable {
String name; int id;
public User(String name, int id){ this.name=name; this.id=id; }
public String toString(){ return name " is #" id; }
}
}
->
reading 283
Alice is #1
Bob is #2
Carol is #3
這不如單流(具有多個物件)方法靈活,因為這允許您撰寫任何物件序列,其型別和結尾可以在讀取時識別而無需任何幫助;使用多流方法,您的代碼必須能夠確定流何時結束并需要重新啟動。
uj5u.com熱心網友回復:
您不能輕松地將來自兩個不同 ObjectOutputStream的資料寫入同一個檔案。
意義:
- 要么您想寫入不同的檔案,要么
- 您使用相同的ObjectOutputStream 將所有物件寫入該單個檔案。
這是具有隱式布局的二進制資料結構,相應的協議根本不期望在完全處理完第一個物件序列后,另一個序列化位元組流出現在檔案中 - 除非您“按摩”進入的確切內容該檔案(有關詳細資訊,請參閱其他答案)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/435903.html
上一篇:如何回傳具有特定字符的陣列串列
