16

我想将一个可能很大的文件的最后 10MB 复制到另一个文件中。理想情况下,我会使用 FileInputStream、skip() 和 read()。但是我不确定 skip() 的性能是否会很差。skip() 通常是使用下面的文件搜索实现的,还是实际上读取和丢弃数据?

我知道 RandomAccessFile,但我对是否可以使用 FileInputStream 代替它感兴趣(RandomAccessFile 很烦人,因为 API 是非标准的)。

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

你会对这个LINK感兴趣

它说 seek 比 skip 快

于 2014-03-16T12:40:28.997 回答