16 Stimmen

Führt FileInputStream.skip() einen Suchlauf durch?

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 sein wird. Ist skip() typischerweise mit einem Dateisuchlauf darunter implementiert oder werden tatsächlich Daten gelesen und verworfen?

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

0 Stimmen

Ich habe gerade vergessen, ob ich das auf der Oracle JVM oder Android getestet habe, aber FileInputStream.skip() prüft auf negative Werte.

19voto

The Alchemist Punkte 3352

Das hängt von Ihrer JVM ab, aber hier ist die Quelle für FileInputStream.skip() für ein aktuelles 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 so aus, als würde es eine seek() . Ich sehe jedoch nicht ein, warum RandomAccessFile ist nicht standardisiert. Es ist Teil der java.io Paket und das schon seit 1.0.

0voto

Bilel Boulifa Punkte 186

Das wird Sie interessieren LINK

es heißt, dass Suchen schneller ist als Überspringen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X