FileInputStream.skip () выполняет поиск? - PullRequest
12 голосов
/ 08 сентября 2010

Я хочу скопировать последние 10 МБ, возможно, большого файла в другой файл.В идеале я бы использовал FileInputStream, skip () и затем read ().Однако я не уверен, будет ли производительность skip () плохой.Skip () обычно реализуется с использованием поиска файлов внизу или действительно читает и отбрасывает данные?

Я знаю о RandomAccessFile, но меня интересует, могу ли я использовать FileInputStream вместо этого (RandomAccessFile раздражает какAPI нестандартный).

Ответы [ 2 ]

17 голосов
/ 08 сентября 2010

Зависит от вашей JVM, но вот источник FileInputStream.skip() для недавнего 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);
}

Похоже, он делает seek().Однако я не понимаю, почему RandomAccessFile нестандартно.Он входит в пакет java.io и существует с 1.0.

0 голосов
/ 16 марта 2014

вас заинтересует эта ССЫЛКА

говорят, что поиск быстрее, чем пропустить

...