Frage

Ich mag die letzte 10MB einer möglicherweise großen Datei in einer anderen Datei kopieren. Idealerweise würde ich Fileinputstream verwenden, überspringen () und dann (lesen). Ich bin jedoch nicht sicher, ob die Leistung der skip () schlecht sein wird. Ist überspringen () in der Regel implementiert, um eine Datei mit sucht unter oder ist es tatsächlich gelesen und Verwerfungsdaten?

Ich weiß, über Random aber ich bin daran interessiert, ob ich Fileinputstream anstelle desjenigen nutzen könnte (Random ist ärgerlich, da die API Nicht-Standard ist).

War es hilfreich?

Lösung

Abhängig 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 tut eine seek(). Allerdings sehe ich nicht, warum RandomAccessFile ist Nicht-Standard. Es ist Teil des java.io Pakets und ist seit 1.0.

Andere Tipps

werden Sie mit diesem LINK interessiert sein

es sagen, die versuchen, schneller als Sprung

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top