2011-11-11 6 views
1

私はインデックスを渡すことによって構造化されたバイナリファイルのセクションを読んでする必要があります。ただし、DataInputStreamはマーク/リセットをサポートしていません。私は何をしたいのですか?私はこれを簡単に達成できる他のクラスはありますか?DataInputStreamをリセット/マークをサポートしていない場合は、再度バイナリファイルの一部の読み方

import java.io.*; 
import java.io.DataOutputStream; 
import java.io.DataInputStream; 
import java.io.FileOutputStream; 
import java.io.FileInputStream; 

class Test { 
    public static int getInt(DataInputStream stream, int index) throws IOException { 
    int offset = index * 4; // size of int 
    stream.reset(); 
    stream.skip(offset); 
    return stream.readInt(); 
    } 

    public static void main(String[] args) { 
    String filename = "test.data"; 
    try { 
     DataOutputStream ostream = new DataOutputStream(new FileOutputStream(filename)); 
     for (int i=0; i<10; i++) { 
     ostream.writeInt(i); 
     } 
     ostream.close(); 

     DataInputStream istream = new DataInputStream(new FileInputStream(filename)); 
     istream.mark(0); 
     int i0 = getInt(istream, 0); 
     int i3 = getInt(istream, 3); 
     int i5 = getInt(istream, 5); 
     System.out.printf("i0 = %d, i3 = %d, i5 = %d\n", i0, i3, i5); 
     istream.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 
+0

私が本当に必要なのあなたが順序でデータを読んでいると、リセット/マークを必要としていないようにRandomAccessFile – user1040876

+0

であることがわかりました。私は物事を必要以上に複雑にしません。 –

答えて

1

それはところで、あなたのマーク・コールはリセットが起こるまで、あなたが読むことを期待するバイトの量を与えるべきであるマーク

を実装にBufferedInputStreamでラップ。あなたはマークが無効になるという過去を読み、リセット

を投げたりRandomAccessFile

3

を使用する場合はマーク/リセットをサポートしていませんDataInputStreamのではありません。 DataInputStreamのは、単に参加者は、呼び出しは/マーク(この場合のFileInputStreamに)基本となるストリームにリセットします。ただし、FileInputStreamはマーク/リセット操作(iirc)をサポートしていません。この問題を解決するには、最初のDataInputStreamに渡す前にBufferedInputStreamでのFileInputStreamをラップすることです。これにより、目的の操作を使用できるようになります。つまり、

DataInputStream istream = new DataInputStream(new BufferedInputStream(new FileInputStream(filename))); 

また、私は完全にはわかりませんが、マークの引数を誤って使用していることがわかっているからです。 JavaDocによれば、引数は以下を意味します。

マーク位置が無効になる前に読み取ることができる最大限のバイト数。

したがって、引数0でマークを呼び出すことは特に有用ではありません。

関連する問題