2012-04-16 13 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(offset) – UVM

+1

コードはコンパイルされますか?構文上の誤りのように聞こえます。あなたはどこかで括弧を逃したでしょうか? – Kai

+0

スタックトレースの一部と、ファイルに書き込むコードを投稿できますか?これらは、多くの場合、入力 –

答えて

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

これは、一定のサイズを出力するサイズを維持しなければならないということです。私が見た限り、RandomAccessFileだけがこれを可能にします。 –

0

あなたは書いた方法とコンパクトな方法でデータを読む必要があります。

オブジェクトストリームには特定の形式があります。ヘッダーがあり、興味のあるバイトの周りにバイトが失われています。 Integerを書くと88バイトかかるでしょう。オブジェクトストリーム内を読み込んでランダムにビットにアクセスすることはできません。また、スキップするバイトは動作すると予想されます。

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

+0

あなたは私が最初に書いたものを読んでから、オブジェクトを読んでいることを確認しなければなりませんか? –

+0

あなたが書いたものと一貫して読む必要があるということです。あなたが書くときにスキップを使用しない限り、読んでいるときにスキップする場所を知ることはほとんどありません。 –

関連する問題