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オブジェクトを使用して、最初にいくつかの整数と文字を読み取るためです。私は助けに感謝します。ありがとう

4

2 に答える 2

0

あなたはそれを書いた方法と互換性のある方法でデータを読む必要があります。

オブジェクトストリームには特定の形式があります。ヘッダーがあり、関心のあるバイトの周りのバイトが失われています。たとえば、ヘッダーを作成Integerすると、88バイトかかります。オブジェクトストリーム内を読み取ってそのビットにランダムにアクセスしたり、バイトをスキップしたりすることはできません。

どのようにデータを書きましたか?

于 2012-04-16T07:37:55.753 に答える
0

私は1つのストリームを使用するので、オフセットについて心配する必要はなく、書いているものを読んでいることを確認してください。たとえば、次は正常に機能します。

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();
于 2012-04-16T08:12:41.860 に答える