Java obtient la taille du fichier
Aujourd'hui, lors de l'écriture de code, vous devez implémenter la fonction d'obtention de la taille du fichier. Il existe actuellement deux méthodes de mise en œuvre. L'une consiste à utiliser la méthode de longueur du fichier (); L'autre consiste à utiliser la méthode disponible () de FileInputStream. Lorsque InputStream n'effectue pas de fonctionnement de lecture, la taille de disponible () doit être égale à la taille du fichier. Mais lorsqu'il s'agit de fichiers volumineux, des problèmes se produisent dans ce dernier. Jetons un coup d'œil:
Dans l'exemple, j'ai utilisé le fichier d'image d'installation de CentOS 6.5, considérant principalement que ce fichier est suffisamment grand (grand que 2 Go).
1. Utilisez la méthode de la longueur du fichier ()
public static void main (String [] args) {file f = new file ("d: //centos-6.5-x86_64-bin-dvd1.iso"); if (f.exists () && f.isfile ()) {logger.info (f.length ()); } else {logger.info ("Le fichier n'existe pas ou n'est pas un fichier"); }}Regardons la sortie:
4467982336
Le résultat est de 4,16 Go, ce qui est cohérent avec les résultats affichés sur Windows.
Ensuite, jetons un coup d'œil à la taille du fichier obtenu via FileInputStream:
public static void main (String [] args) {fileInputStream fis = null; try {file f = new File ("d: //centos-6.5-x86_64-bin-dvd1.iso"); fis = new FileInputStream (f); logger.info (fis.available ()); } catch (exception e) {logger.error (e); } enfin {if (null! = fis) {try {fis.close (); } catch (ioException e) {logger.Error (e); }}}}}Voici les résultats en cours:
2147483647
Ce résultat semble-t-il familier? C'est Integer.max_value, qui est la valeur maximale qu'un entier signé peut représenter.
Donc, si vous le convertissez en une unité familière, quelle est la taille de la taille du fichier obtenu de cette manière?
C'est environ 2 Go, ce qui n'est évidemment pas le résultat correct.
La raison en est que le type renvoyé par la méthode du fichier LONGUEUR () est long, et la valeur maximale de la valeur positive que le type long peut représenter est: 922337203685475807. La taille maximale du fichier qui peut être convertie en support maximum est: 8954730132868714 Bédites EB. Cet ordre de grandeur sera utilisé pendant de nombreuses années dans l'histoire du développement informatique humain. La valeur de retour de la méthode disponible () de fichierInputStream est int. La plage de représentation maximale a été introduite auparavant. La taille maximale du fichier qui peut être prise en charge est: 1,99 Go, et nous pouvons facilement atteindre cet ordre de grandeur.
Ajouté le 31 mars 2014:
Il n'est pas possible de lire des tailles de fichiers grandes pour les méthodes de streaming, mais vous ne pouvez plus utiliser le package traditionnel sous java.io. *. Ici, vous devez utiliser le nouvel outil sous java.nio. * - FileChannel. Jetons un coup d'œil à l'exemple de code suivant:
public static void main (String [] args) {fileChannel fc = null; try {file f = new File ("d: //centos-6.5-x86_64-bin-dvd1.iso"); if (f.exists () && f.isfile ()) {fileInputStream fis = new FileInputStream (f); fc = fis.getChannel (); logger.info (fc.size ()); } else {logger.info ("Le fichier n'existe pas ou n'est pas un fichier"); }} catch (filenotFoundException e) {logger.Error (e); } catch (ioException e) {logger.Error (e); } enfin {if (null! = fc)) {try {fc.close (); } catch (ioException e) {logger.Error (e); }}}}}Les résultats obtenus après l'utilisation de FileChannel sont cohérents avec le premier cas, décrivant avec précision la taille exacte du fichier.
Cela rappelle également à tous les collègues techniques que lors de la lecture de fichiers volumineux, vous devez faire attention aux données de type int pour éviter les bogues cachés et il est difficile de les localiser.
Merci d'avoir lu, j'espère que cela peut vous aider. Merci pour votre soutien à ce site!