2010-09-08 41 views
9

Je veux copier les 10 derniers Mo d'un fichier éventuellement volumineux dans un autre fichier. Idéalement, j'utiliserais FileInputStream, skip() et ensuite read(). Cependant, je ne sais pas si les performances de skip() seront mauvaises. Est-ce que skip() est typiquement implémenté en utilisant un fichier de recherche en dessous ou est-ce qu'il lit et rejette des données?Est-ce que FileInputStream.skip() fait une recherche?

Je connais RandomAccessFile mais je suis intéressé de savoir si je pourrais utiliser FileInputStream à la place de cela (RandomAccessFile est embêtant car l'API n'est pas standard).

+0

J'ai oublié si je l'ai testé sur cette machine virtuelle Java Oracle ou Android, mais les contrôles FileInputStream.skip() pour les valeurs négatives. –

Répondre

15

dépend de votre machine virtuelle, mais voici la source FileInputStream.skip() pour une OpenJDK récente:

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

On dirait qu'il fait un seek(). Cependant, je ne vois pas pourquoi RandomAccessFile n'est pas standard. Cela fait partie du paquet java.io et a été depuis 1.0.

+1

Merci. Quand je dis que RandomAccessFile n'est pas standard, il n'est pas non plus un moyen d'obtenir un InputStream attendu par les bibliothèques utilitaires. Probablement juste la nature de ce qu'est une RAF. –

+0

Mon problème est après l'appel skip() j'utilise filechannel de fis.getChannel() pour obtenir la charsequence à appliquer à regex. Malheureusement le filechannel restaure juste l'entrée sautée – Dagon

+0

Le problème avec ceci est que nous devons nous appuyer sur cette implémentation particulière pour en déduire le fait qu'il fait une recherche car AFAIK l'information ne fait pas partie de l'interface/documentation. Ce n'est pas une bonne idée. Mais peut-être "jeter les octets sautés" comme il est indiqué signifie chercher sur eux à la position désirée. – lkuty

0

vous serez intéressé par cette LINK

il dire que Seek est plus rapide que sauter