2

ファイル サイズが 8k を超える場合、LAST Byte read = 0 になるのはなぜですか?

private static final int GAP_SIZE = 8 * 1024;

public static void main(String[] args) throws Exception{
    File tmp = File.createTempFile("gap", ".txt");
    FileOutputStream out = new FileOutputStream(tmp);
    out.write(1);
    out.write(new byte[GAP_SIZE]);
    out.write(2);
    out.close();
    BufferedInputStream in = new BufferedInputStream(new FileInputStream(tmp));
    int first = in.read();
    in.skip(GAP_SIZE);
    int last = in.read();
    System.out.println(first);
    System.out.println(last);
}
4

2 に答える 2

2

InputStream API によると、skip メソッドは、さまざまな理由で、より少ない数のバイトをスキップしてしまう可能性があります。これを試して

...
long n = in.skip(GAP_SIZE);
System.out.println(n);
...

予想される 8192 の代わりに 8191 を出力します。これは BufferedInputStream の実装の詳細に関連しており、削除しても (この具体的なケースではパフォーマンスが向上しません)、予想される結果が得られます。

...
InputStream in = new FileInputStream(tmp);
...

出力

1
2
于 2013-06-01T03:36:55.937 に答える
1

Perception が言ったように、 の戻り値を確認する必要がありますskip。チェックを追加して補正すると、問題が修正されます。

long skipped = in.skip(GAP_SIZE);
System.out.println( "GAP: " + GAP_SIZE + " skipped: " + skipped ) ;
if( skipped < GAP_SIZE)
{
   skipped = in.skip(GAP_SIZE-skipped);
}

skipのセクションで述べたようにFileInputStream:

skip メソッドは、さまざまな理由で、より少ない数のバイト (場合によっては 0) をスキップしてしまう可能性があります。

于 2013-06-01T03:34:33.097 に答える