FileInputStream.skip() выполняет поиск?

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

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


person Mike Q    schedule 08.09.2010    source источник
comment
Я просто забыл, тестировал ли я это на Oracle JVM или Android, но FileInputStream.skip() проверяет отрицательные значения.   -  person bohdan_trotsenko    schedule 28.08.2015


Ответы (2)


Зависит от вашей 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.

person The Alchemist    schedule 08.09.2010
comment
Спасибо. Когда я говорю, что RandomAccessFile не является стандартным, это не так и не обеспечивает способ получения InputStream, который обычно ожидают библиотеки утилит. Вероятно, это просто природа RAF. - person Mike Q; 09.09.2010
comment
Моя проблема заключается в том, что после вызова skip() я использую файловый канал из fis.getChannel(), чтобы получить последовательность символов, которая будет применяться к регулярному выражению. К сожалению, файловый канал просто восстанавливает пропущенный ввод - person jerinho.com; 19.10.2014
comment
Проблема в том, что мы должны полагаться на эту конкретную реализацию, чтобы сделать вывод о том, что она выполняет поиск, поскольку, насколько мне известно, информация не является частью интерфейса/документации. Это не очень хорошая идея. Но, возможно, отбрасывание пропущенных байтов, как указано, означает их поиск в нужной позиции. - person Ludovic Kuty; 06.10.2016

вам будет интересна эта ССЫЛКА

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

person Bilel Boulifa    schedule 16.03.2014