Pregunta

Quiero copiar el último 10 MB de un archivo grande, posiblemente en otro archivo. Lo ideal sería utilizar FileInputStream, saltar () y luego leer (). Sin embargo no estoy seguro si el rendimiento del salto () será malo. Se skip () implementa normalmente usando un archivo de buscar debajo o es lo que realmente leer y datos de descarte?

Yo sé de RandomAccessFile pero estoy interesado en saber si podía usar FileInputStream en lugar de eso (RandomAccessFile es molesto ya que la API no es estándar).

¿Fue útil?

Solución

Depende de su JVM, pero aquí está la fuente de FileInputStream.skip() para un OpenJDK reciente:

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);
}

Parece que está haciendo un seek(). Sin embargo, no veo por qué RandomAccessFile no es estándar. Es parte del paquete java.io y ha sido desde 1.0.

Otros consejos

Usted estará interesado con este ENLACE

opinan que buscan es más rápido que el salto

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top