FileInputStream.skip() 是否执行搜索?

2022-09-03 06:42:23

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

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


答案 1

这取决于你的JVM,但这里是最近openjdk的源代码:FileInputStream.skip()

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);
}

看起来它正在做一个.但是,我不明白为什么是非标准的。它是软件包的一部分,从1.0开始就一直存在。seek()RandomAccessFilejava.io


答案 2

你会对此链接感兴趣

它说寻找比跳过更快


推荐