16

おそらく大きなファイルの最後の 10MB を別のファイルにコピーしたいと考えています。理想的には、FileInputStream、skip()、read() の順に使用します。ただし、skip() のパフォーマンスが悪いかどうかはわかりません。skip() は通常、その下にあるファイル シークを使用して実装されますか、それとも実際にデータを読み取って破棄しますか?

RandomAccessFile については知っていますが、その代わりに FileInputStream を使用できるかどうかに興味があります (API が非標準であるため、RandomAccessFile は面倒です)。

4

2 に答える 2

19

JVM によって異なりますがFileInputStream.skip()、最近の openjdkのソースは次のとおりです。

JNIEXPORT jlong JNICALL
Java_java_io_FileInputStream_skip(JNIEnv *env, jobject this, jlong toSkip) {
    jlong cur = jlong_zero;
    jlong end = jlong_zero;
    FD fd = GET_FD(this, fis_fd);
    if (fd == -1) {
        JNU_ThrowIOException (env, "Stream Closed");
        return 0;
    }
    if ((cur = IO_Lseek(fd, (jlong)0, (jint)SEEK_CUR)) == -1) {
        JNU_ThrowIOExceptionWithLastError(env, "Seek error");
    } else if ((end = IO_Lseek(fd, toSkip, (jint)SEEK_CUR)) == -1) {
        JNU_ThrowIOExceptionWithLastError(env, "Seek error");
    }
    return (end - cur);
}

を行っているようseek()です。RandomAccessFileただし、非標準である理由がわかりません。java.ioこれはパッケージの一部であり、 1.0 以降です。

于 2010-09-08T16:48:23.283 に答える
0

あなたはこのリンクに興味を持つでしょう

シークはスキップよりも速いと言われています

于 2014-03-16T12:40:28.997 に答える