2010-09-08 15 views
9

Quiero copiar los últimos 10 MB de un archivo posiblemente grande en otro archivo. Idealmente, usaría FileInputStream, skip() y luego read(). Sin embargo, no estoy seguro si el rendimiento de skip() será malo. ¿Es skip() típicamente implementado usando una búsqueda de archivos debajo o realmente lee y descarta datos?¿FileInputStream.skip() hace una búsqueda?

Conozco RandomAccessFile pero estoy interesado en si podría usar FileInputStream en lugar de eso (RandomAccessFile es molesto ya que la API no es estándar).

+0

simplemente me olvidaba si probado esto en JVM Oracle o androide, pero FileInputStream.skip() comprueba si los valores negativos. –

Respuesta

15

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 se está haciendo un seek(). Sin embargo, no veo por qué RandomAccessFile no es estándar. Es parte del paquete java.io y lo ha sido desde 1.0.

+1

Gracias. Cuando digo que RandomAccessFile no es estándar, no proporciona una manera de obtener un InputStream que las bibliotecas de utilidades suelen esperar. Probablemente solo la naturaleza de lo que es un RAF. –

+0

Mi problema es después de la llamada skip() utilizo filechannel de fis.getChannel() para que charsequence se aplique a regex. Lamentablemente, el canal de archivos solo restaura la entrada omitida – Dagon

+0

. El problema es que tenemos que confiar en esa implementación particular para deducir el hecho de que realiza una búsqueda, ya que AFAIK la información no es parte de la interfaz/documentación. No es una buena idea. Pero tal vez "descartar los bytes omitidos" como se indica significa buscarlos en la posición deseada. – lkuty

0

usted estará interesado con este LINK

es decir que buscan es más rápido que salte

Cuestiones relacionadas