1

ストリームから必要なバイト数をスキップするFilterInputStreamクラスのskipメソッドを使用したかったのです。ただし、skipメソッドのドキュメントには http://docs.oracle.com/javase/1.4.2/docs/api/java/io/FilterInputStream.html#skip(long)と記載されています。

スキップして、入力ストリームからnバイトのデータを破棄します。skipメソッドは、さまざまな理由で、いくつかの少数のバイト(場合によっては0)をスキップしてしまう可能性があります。スキップされた実際のバイト数が返されます。

特定の位置を探す目的でスキップメソッドを使用するのは本当に安全ですか?

4

2 に答える 2

1

FilterInputStreamは基礎となるの単なるラッパーであるため、基礎InputStreamとなる動作によって異なりInputStream.skipます。

たとえば、原資産InputStreamがである場合、次のように記述されているAPIFileInputStreamを参照する必要があります。FileInputStream#skip

public long skip(long n) throws IOException

スキップしてn、入力ストリームからデータのバイトを破棄します。

このskipメソッドは、さまざまな理由で、いくつかの少数のバイト(場合によってnは0)をスキップすることになります。負の場合、スーパークラスのメソッドはこの場合何もしませんが、IOExceptionがスローされます。スキップされた実際のバイト数が返されます。skipInputStream

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

この説明からFileInputStream.skip、私には信頼できないようです。

于 2013-02-18T11:04:25.780 に答える
1

また、このAPIには少し問題があります。それは特定の実装にあまりにも多くの自由を残します:

1)ストリームが終了した場合に何が起こるかは明確ではありません

2)ストリームが空でない場合、skipを繰り返し呼び出すと、最終的に正の数が返されるかどうかは不明です。

nがストリームの終わりを超えていないことがわかっていて、(2)が成り立つと仮定すると、次のコードが役立つ場合があります。

public static void skipSecure(InputStream is, long n) throws IOException {
    while (n >= 0) {
        long skipped = is.skip(n);
        n -= skipped;
    }
}
于 2013-02-18T11:19:59.957 に答える