2010-09-08 9 views
9

Ich möchte die letzten 10 MB einer möglicherweise großen Datei in eine andere Datei kopieren. Idealerweise würde ich FileInputStream, skip() und dann read() verwenden. Ich bin mir jedoch nicht sicher, ob die Leistung von skip() schlecht ist. Wird skip() normalerweise mithilfe einer Dateisuche unterhalb der Datei implementiert oder werden Daten tatsächlich gelesen und verworfen?Führt FileInputStream.skip() eine Suche durch?

Ich weiß über RandomAccessFile, aber ich bin daran interessiert, ob ich FileInputStream anstelle von dem verwenden könnte (RandomAccessFile ist ärgerlich, da die API nicht-Standard ist).

+0

ich nur vergessen, wenn ich diese JVM auf Oracle getestet oder android, aber FileInputStream.skip() prüft, ob negative Werte. –

Antwort

15

Hängt von Ihrer JVM, aber hier ist die Quelle für FileInputStream.skip() für eine aktuelle 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); 
} 

Sieht aus wie es ist ein seek() tun. Ich sehe jedoch nicht, warum RandomAccessFile nicht Standard ist. Es ist Teil des java.io Pakets und ist seit 1.0.

+1

Danke. Wenn ich sage, dass RandomAccessFile kein Standard ist, bietet es keine Möglichkeit, einen InputStream zu erhalten, den Utility-Bibliotheken normalerweise erwarten. Wahrscheinlich nur die Art von was eine RAF ist. –

+0

Mein Problem ist nach Aufruf skip() Ich verwende Filechannel von fis.getChannel(), um Charsequenz auf Regex angewendet werden. Unglücklicherweise stellt der Filechannel nur die übersprungene Eingabe wieder her – Dagon

+0

Das Problem dabei ist, dass wir uns auf diese spezielle Implementierung verlassen müssen, um daraus abzuleiten, dass es eine Suche durchführt, da AFAIK die Information nicht Teil der Schnittstelle/Dokumentation ist. Das ist keine gute Idee. Aber "Verwerfen der übersprungenen Bytes", wie es angegeben ist, bedeutet, dass man über sie zu der gewünschten Position sucht. – lkuty

0

Sie mit diesem LINK

es interessiert sein sagen, die versuchen, schneller als

überspringen
Verwandte Themen