1

私は次のコードを実行しています:

public class SkipTest {
    public static void main(String[] args) throws IOException {
        FileOutputStream fileout = new FileOutputStream("./foo");
        DataOutputStream output = new DataOutputStream( fileout );
        output.writeLong(12345678L);
        output.writeLong(87654321L);
        output.writeInt(1234);
        output.flush();
        output.close();

        FileInputStream input = new FileInputStream("./foo");
        DataInputStream datain = new DataInputStream(input);

        System.out.println(datain.readLong());
        System.out.println(datain.readLong());

        long skipped = datain.skip(8);
        System.out.printf("Attempting to skip 8 bytes, actually skipped %d.\n", skipped);

        datain.close();
    }
}

ドキュメントによると、の戻り値.skip()は実際にスキップされたバイト数であり、要求された数よりも少ない場合があります。ファイルが外部でわずか20バイトであることを確認しましたが、上記のコードを実行すると、次の出力が得られます。

12345678
87654321
Attempting to skip 8 bytes, actually skipped 8.

それで、これはバグですか、それとも私は何か間違ったことをしていますか?ファイルに4バイトしか残っていない場合、どうすれば8バイトをスキップできますか?

4

2 に答える 2

4

DataInputStreamは、スキップの実装について次のことを要求するFileInputStreamを通過します。

「このメソッドは、バッキングファイルに残っているバイト数よりも多くのバイトをスキップする可能性があります。これにより例外は発生せず、スキップされるバイト数には、バッキングファイルのEOFを超えたバイト数が含まれる可能性があります。スキップした後にストリームから読み取ろうとしています終了すると、ファイルの終了を示す-1になります。」

于 2012-07-16T19:37:03.757 に答える
1

FileInputStream明らかに何も読み取らずに、の任意のバイト数をスキップできます。カーソルの位置を変更するだけで、次の読み取りは失敗します。試してみてくださいdatain.skip(Integer.MAX_VALUE)

于 2012-07-16T19:35:53.930 に答える