我想將可能大文件的最後10MB複製到另一個文件中。理想情況下,我會使用FileInputStream,skip(),然後讀取()。不過,我不確定skip()的性能會不好。跳過()通常是使用文件查找在下面執行還是實際讀取並丟棄數據?FileInputStream.skip()是否在尋找?
我知道關於RandomAccessFile,但我感興趣的是我是否可以使用FileInputStream來代替(RandomAccessFile令人討厭,因爲API是非標準的)。
我想將可能大文件的最後10MB複製到另一個文件中。理想情況下,我會使用FileInputStream,skip(),然後讀取()。不過,我不確定skip()的性能會不好。跳過()通常是使用文件查找在下面執行還是實際讀取並丟棄數據?FileInputStream.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開始。
謝謝。當我說RandomAccessFile是非標準的時候,它不是也沒有提供獲得公用程序庫通常期望的InputStream的方法。可能只是英國皇家空軍的性質。 – 2010-09-09 11:13:39
我的問題是在調用skip()之後,我使用fis.getChannel()中的filechannel將charsequence應用於正則表達式。不幸的是,filechannel只是恢復跳過的輸入 – Dagon 2014-10-19 11:14:14
這樣做的問題是,我們不得不依賴於特定的實現來推斷它執行搜索的事實,因爲AFAIK信息不是接口/文檔的一部分。這不是一個好主意。但是,如上所述,也許「丟棄跳過的字節」意味着將它們搜索到期望的位置。 – lkuty 2016-10-06 09:02:32
你會有興趣與此LINK
它說,追求的是比跳過
如果我測試了在Oracle JVM或Android我只是忘得更快,但FileInputStream.skip()檢查負值。 – 2015-08-28 12:35:05