我想将一个可能很大的文件的最后 10MB 复制到另一个文件中。理想情况下,我会使用 FileInputStream、skip(),然后 read()。但是我不确定skip()的性能是否会很差。 Skip() 通常是使用下面的文件查找来实现的,还是实际上读取并丢弃数据?
我知道 RandomAccessFile 但我感兴趣的是我是否可以使用 FileInputStream 来代替它(RandomAccessFile 很烦人,因为 API 是非标准的)。
取决于你的 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 开始。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)