2010-09-08 32 views
9

我想將可能大文件的最後10MB複製到另一個文件中。理想情況下,我會使用FileInputStream,skip(),然後讀取()。不過,我不確定skip()的性能會不好。跳過()通常是使用文件查找在下面執行還是實際讀取並丟棄數據?FileInputStream.skip()是否在尋找?

我知道關於RandomAccessFile,但我感興趣的是我是否可以使用FileInputStream來代替(RandomAccessFile令人討厭,因爲API是非標準的)。

+0

如果我測試了在Oracle JVM或Android我只是忘得更快,但FileInputStream.skip()檢查負值。 – 2015-08-28 12:35:05

回答

15

取決於你的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開始。

+1

謝謝。當我說RandomAccessFile是非標準的時候,它不是也沒有提供獲得公用程序庫通常期望的InputStream的方法。可能只是英國皇家空軍的性質。 – 2010-09-09 11:13:39

+0

我的問題是在調用skip()之後,我使用fis.getChannel()中的filechannel將charsequence應用於正則表達式。不幸的是,filechannel只是恢復跳過的輸入 – Dagon 2014-10-19 11:14:14

+0

這樣做的問題是,我們不得不依賴於特定的實現來推斷它執行搜索的事實,因爲AFAIK信息不是接口/文檔的一部分。這不是一個好主意。但是,如上所述,也許「丟棄跳過的字節」意味着將它們搜索到期望的位置。 – lkuty 2016-10-06 09:02:32

0

你會有興趣與此LINK

它說,追求的是比跳過