2011-12-21 1 views
2

Lecture du fichier en utilisant java et jcifs sur windows. J'ai besoin de déterminer la taille du fichier, qui contient des caractères multi-octets ainsi que des caractères ASCII.comment déterminer la taille du fichier en terme de nombre de caractères?

Comment puis-je l'obtenir efficacement OU toute API existante dans Java?

Merci,

+1

Vous devez connaître le codage de caractères pour la question même de sens. * Est-ce que * vous connaissez l'encodage? –

+0

La taille du fichier elle-même? 'nouveau RandomAccessFile (...). getChannel(). size()'? – fge

+0

@fge, ceci est correct à condition qu'il n'y ait pas de caractères multi-octets. –

Répondre

1

Pour obtenir le nombre de caractères, vous devez lire le fichier. En spécifiant le codage de fichier correct, vous vous assurez que Java lit correctement chaque caractère de votre fichier.

BufferedReader.read() renvoie le caractère Unicode lu (en tant qu'int compris entre 0 et 65535). Ainsi, la manière simple de le faire serait comme ceci:

int countCharsSimple(File f, String charsetName) throws IOException { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f), charsetName)); 
    int charCount = 0; 
    while(reader.read() > -1) { 
     charCount++; 
    } 
    reader.close(); 
    return charCount; 
} 

Vous obtiendrez des performances plus rapides en utilisant Reader.read(char[]):

int countCharsBuffer(File f, String charsetName) throws IOException { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f), charsetName)); 
    int charCount = 0; 
    char[] cbuf = new char[1024]; 
    int read = 0; 
    while((read = reader.read(cbuf)) > -1) { 
     charCount += read; 
    } 
    reader.close(); 
    return charCount; 
} 

Pour l'intérêt, je benchmarkée ces deux et la version nio proposée dans la réponse de Andrey. J'ai trouvé le deuxième exemple ci-dessus (countCharsBuffer) pour être le plus rapide.

(Notez que tous ces exemples comprennent des caractères de séparation de ligne dans leurs comptes.)

+0

@thanks sudocode, un code similaire a été écrit.mais j'étais douteux, donc je veux vérifier d'autres options. Vos commentaires ont vraiment aidé. – Sach

2

Pas de doute, pour obtenir le nombre exact de caractères que vous devez le lire avec un codage correct. La question est de savoir comment lire les fichiers efficacement. Java NIO est le moyen le plus rapide de le faire.

FileChannel fChannel = new FileInputStream(f).getChannel(); 
    byte[] barray = new byte[(int) f.length()]; 
    ByteBuffer bb = ByteBuffer.wrap(barray); 
    fChannel.read(bb); 

puis

String str = new String(barray, charsetName); 
str.length(); 

lecture dans le tampon d'octets est fait avec une vitesse proche de maximum disponible (pour moi, il était comme 60 Mb/s en test de vitesse du disque donne environ 70-75 Mb/s

+1

Cela ne va pas être un peu une explosion de la mémoire si vous essayez de lire un gros fichier? – sudocode

+1

De même, 'new String (ByteBuffer, String)' ne compile pas. – sudocode

+0

@sudocode Merci pour vos commentaires. Tu as tout à fait raison. L'algorithme fonctionnera seulement pour les fichiers qui peuvent tenir dans la mémoire (convient pour 99.99% des tâches pratiques) Mais c'est un bon commentaire. À propos de "new String (ByteBuffer, String)" vous avez encore raison. Je l'ai corrigé à "new String (barray, String)". Merci! – andrey

Questions connexes