代码之家  ›  专栏  ›  技术社区  ›  Mike Q

fileinputstream.skip()是否执行查找?

  •  12
  • Mike Q  · 技术社区  · 14 年前

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

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

    2 回复  |  直到 10 年前
        1
  •  17
  •   The Alchemist    14 年前

    取决于您的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开始。

        2
  •  0
  •   Bilel Boulifa    10 年前

    你会对这个感兴趣的 LINK

    据说搜寻比跳跃快