2010-09-08 9 views
9

Voglio copiare gli ultimi 10 MB di un file possibilmente grande in un altro file. Idealmente userei FileInputStream, skip() e poi read(). Tuttavia non sono sicuro che le prestazioni di skip() saranno negative. Skip() è in genere implementato utilizzando un file di ricerca o in realtà legge e scartare i dati?FileInputStream.skip() esegue una ricerca?

Conosco RandomAccessFile ma sono interessato a utilizzare FileInputStream al posto di quello (RandomAccessFile è fastidioso in quanto l'API non è standard).

+0

ho solo dimenticato se ho provato questo su JVM Oracle o Android, ma FileInputStream.skip() controlla per i valori negativi. –

risposta

15

dipende dalla vostra JVM, ma qui è la fonte per FileInputStream.skip() per un recente 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); 
} 

sembra che sta facendo un seek(). Tuttavia, non vedo perché RandomAccessFile non sia standard. Fa parte del pacchetto java.io ed è stato dal 1,0.

+1

Grazie. Quando dico che RandomAccessFile non è standard, non è né fornisce un modo per ottenere un InputStream che di solito le librerie di utilità si aspettano. Probabilmente solo la natura di ciò che è un RAF. –

+0

Il mio problema è dopo la chiamata skip() uso il filechannel da fis.getChannel() per ottenere l'applicazione di charsequence su regex. Sfortunatamente il filechannel ripristina solo l'input saltato – Dagon

+0

Il problema con questo è che dobbiamo fare affidamento su quella particolare implementazione per dedurre il fatto che fa una ricerca dal momento che AFAIK l'informazione non fa parte dell'interfaccia/documentazione. Non è una buona idea. Ma forse "scartare i byte saltati", come si afferma, significa cercarli sopra nella posizione desiderata. – lkuty

0

voi saranno interessati a questo LINK

è dire che cercano è più veloce di saltare

Problemi correlati