0

我正在编写一个程序,该程序需要我写并读回我创建的对象。当我试图读回对象并对其进行反序列化时,我收到了Ilegal start of expression错误。我想知道是否有人可以告诉我这是什么以及如何解决它。

        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 对象首先读取一些整数和字符。我很感激帮助。谢谢

4

2 回答 2

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

此外,为了让生活更轻松,我很想创建一个代表您要存储在文件中的所有数据的类,然后 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();
于 2012-04-16T08:12:41.860 回答
0

您必须以与您编写数据的方式兼容的方式读取数据。

对象流具有特定格式。它有一个标头,并且丢失了您感兴趣的字节周围的字节。例如,如果您写一个Integer,它将占用 88 个字节。您不能只在对象流中读取并随机访问它的位或跳过字节期望它可以工作。

你是怎么写数据的?

于 2012-04-16T07:37:55.753 回答