我想将一个可能较大的文件的最后10MB复制到另一个文件中。理想情况下,我将使用FileInputStream,skip(),然后使用read()。但是我不确定skip()的性能是否会变差。是通常使用下面的文件查找来实现skip()还是实际上是读取和丢弃数据?
我了解RandomAccessFile,但对是否可以使用FileInputStream代替它感兴趣(RandomAccessFile令人讨厌,因为API是非标准的)。
最佳答案
取决于您的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);
}
看起来它正在执行
seek()
。但是,我不明白为什么RandomAccessFile
是非标准的。它是java.io
包的一部分,自1.0开始。