2012-04-16 50 views
0

我正在編寫一個程序,該程序要求我編寫和讀回我創建的對象。當我試圖讀取對象並將其反序列化時,我得到一個表達式的錯誤開始。我想知道是否有人能告訴我這是一個怎樣解決的問題。從文件中讀取序列化對象

 RandomAccessFile temp = new RandomAccessFile(fileSystemName,"r"); 
     this.numberOfDirectories= temp.readInt(); 
     this.fileSystemSize = temp.readInt(); 
     this.numberOfBlocks = temp.readInt(); 
     //Prepares and loads the bitMap 
     numberOfBytes = (numberOfBlocks/8)+1; 
     //directory = new Directory(numberOfDirectories); 
     bitMap = new byte[numberOfBytes]; 
     for(int i=0;i<numberOfBytes;i++)bitMap[i]=temp.readByte(); 
     temp.close(); 
     FileInputStream fin = new FileInputStream(fileSystemName); 
     ObjectInputStream ois = new ObjectInputStream(fin); 

     //File file = new File(fileSystemName); 
     System.out.println(bitMap.length); 
     offset = 12 + numberOfBytes; 
     //ois.skipBytes(offset); 
     //Read Directories 
     directory = <Directory> ois.readObject(); 

該偏移是因爲我第一次使用RandomAccessFile對象先讀取一些整數和字符。我很感激幫助。謝謝

+0

嘗試運行wihtout ois.skipBytes應用(偏移) – UVM 2012-04-16 05:50:58

+1

請問你的代碼編譯?聽起來像是一個語法錯誤。也許你錯過了某個支架? – Kai 2012-04-16 05:51:44

+0

您可以發佈堆棧跟蹤的一部分,以及寫入文件的代碼嗎?與這些特技通常與輸入 – 2012-04-16 05:53:33

回答

0

我會使用一個流,那麼你不需要擔心偏移,並確保你正在閱讀你正在寫的東西。例如,以下工作正常:

final String name = "tmp.data"; 
int numberOfDirectories = 2; 
int fileSystemSize = 4; 
byte[] bitMap = new byte[] { 0, 1, 0 }; 
File someObject = new File("."); 
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(name)); 
outputStream.write(numberOfDirectories); 
outputStream.write(fileSystemSize); 
outputStream.write(bitMap.length); 
outputStream.write(bitMap); 
outputStream.writeObject(someObject); 
outputStream.close(); 
// .... 
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(name)); 
System.out.println("numberOfDirectories:" + inputStream.read()); 
System.out.println("fileSystemSize:" + inputStream.read()); 
final int size = inputStream.read(); 
byte[] readBitMap = new byte[size]; 
inputStream.read(readBitMap); 
System.out.println("bitMap:" + readBitMap); 
System.out.println("someObject:" + inputStream.readObject()); 
inputStream.close(); 

此外,爲了讓生活更容易,我會忍不住創建一個代表所有你想要的文件中存儲數據的類,然後對象流需要照顧爲你的一切:

public static class Data { 
    private int numberOfDirectories; 
    private int fileSystemSize; 
    private byte[] bitMap; 
    private File someObject; 
    // getters and setters .... 
} 

final String name = "tmp.data"; 
Data data = new Data(); 
data.setNumberOfDirectories(2); 
data.setFileSystemSize(4); 
data.setBitMap(new byte[] { 0, 1, 0 }); 
data.setSomeObject(new File(".")); 
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(name)); 
outputStream.writeObject(data); 
outputStream.close(); 
// .... 
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(name)); 
Data readData = (Data) inputStream.readObject(); 
System.out.println("numberOfDirectories:" + readData.getNumberOfDirectories()); 
System.out.println("fileSystemSize:" + readData.getFileSystemSize()); 
System.out.println("bitMap:" + readData.getBitMap()); 
System.out.println("someObject:" + readData.getSomeObject()); 
inputStream.close(); 
+0

事情是這樣的,我必須保持我輸出這個恆定大小的尺寸。據我看,只有RandomAccessFile讓我這樣做。 – 2012-04-16 22:13:25

0

您必須以與您的編寫方式相兼容的方式讀取數據。

對象流具有特定的格式。它有一個頭文件,並且在你感興趣的字節周圍丟失了字節。如果你寫一個Integer它將需要88個字節。你不能只是在一個對象流中讀取數據,並且隨機訪問它的位或者跳過字節就可以使它工作。

你是怎麼寫數據的?

+0

你的意思是說,我必須確保我閱讀我先寫的內容​​,然後閱讀對象? – 2012-04-16 22:14:23

+0

我的意思是你必須以與你所寫的一致的方式閱讀。除非在寫作時使用跳過,否則在閱讀時不太可能知道跳到哪裏。 – 2012-04-17 06:52:57