簡體   English   中英

從文件讀取序列化對象

[英]Reading a Serialized object from file

我正在編寫一個程序,要求我寫和讀回我創建的對象。 當我嘗試讀回對象並將其反序列化時,出現了非法的表達式開始錯誤。 我想知道是否有人可以告訴我這是一種解決方法。

        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對象首先讀取一些整數和字符。 感謝您的幫助。 謝謝

您必須以兼容的方式讀取數據,以及如何編寫數據。

對象流具有特定格式。 它有一個標頭,並且在您感興趣的字節周圍丟失了字節。例如,如果您寫一個Integer ,它將占用88個字節。 您不能只在對象流中讀取並隨機訪問它的位或跳過字節以期望它能工作。

您是如何寫入數據的?

我將使用一個流,那么您不必擔心偏移量,並確保您正在閱讀正在編寫的內容。 例如以下工作正常:

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

此外,為了使生活更輕松,我很想創建一個類,該類代表您要存儲在文件中的所有數據,然后Object流會為您處理所有事情:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM