Java erhalten Dateigröße
Beim Schreiben von Code müssen Sie heute die Funktion zum Erhalten der Dateigröße implementieren. Derzeit gibt es zwei Implementierungsmethoden. Eine ist die Länge () -Methode der Datei; Die andere besteht darin, die Methode von FileInputStreams verfügbar zu verwenden. Wenn InputStream keinen Lesevorgang ausführt, sollte die Größe von verfügbaren () der Dateigröße entsprechen. Im Umgang mit großen Dateien treten jedoch Probleme in letzterem auf. Schauen wir uns an:
Im Beispiel habe ich die Installationsbilddatei von CentOS 6.5 verwendet, hauptsächlich in Anbetracht der Tatsache, dass diese Datei groß genug ist (groß als 2 GB).
1. Verwenden Sie die Länge () -Methode der Datei
public static void main (String [] args) {Datei f = Neue Datei ("d: //centos-6.5-x86_64-bin-dvd1.iso"); if (f.exists () && f.isfile ()) {logger.info (f.length ()); } else {logger.info ("Datei existiert nicht oder ist keine Datei"); }}Schauen wir uns die Ausgabe an:
4467982336
Das Ergebnis ist 4,16 GB, was mit den auf Windows angezeigten Ergebnissen übereinstimmt.
Schauen wir uns als nächstes die Dateigröße an, die über FileInputStream erhalten wird:
public static void main (String [] args) {FileInputStream fis = null; try {Datei f = neue Datei ("d: //centos-6.5-x86_64-binin-dvd1.iso"); fis = new FileInputStream (f); logger.info (fis.available ()); } catch (Ausnahme e) {logger.Error (e); } endlich {if (null! = fis) {try {fis.close (); } catch (ioException e) {logger.Error (e); }}}}}Hier sind die laufenden Ergebnisse:
2147483647
Sieht dieses Ergebnis vertraut aus? Es ist ganzzahlig.max_Value, der maximale Wert, den eine signierte Ganzzahl darstellen kann.
Wenn Sie es also in eine vertraute Einheit konvertieren, wie groß ist die auf diese Weise erhaltene Dateigröße?
Es ist ungefähr 2 GB, was offensichtlich nicht das richtige Ergebnis ist.
Der Grund dafür ist, dass der Typ, der von der Dateimethode der Länge () zurückgegeben wird, lang ist, und der Maximalwert des positiven Werts, den der lange Typ darstellen kann, ist: 9223372036854775807. Die maximale Dateigröße, die in die maximale Unterstützung konvertiert werden kann: 8954730132868714 EB -BYTEs. Diese Größenordnung wird viele Jahre in der Geschichte der menschlichen IT -Entwicklung verwendet. Der Rückgabewert der Methode von FileInputStreams verfügbar () ist int. Der maximale Darstellungsbereich wurde zuvor eingeführt. Die maximale Dateigröße, die unterstützt werden kann, lautet: 1,99 GB, und wir können diese Größenordnung leicht erreichen.
Hinzugefügt am 31. März 2014:
Es ist nicht möglich, große Dateigrößen für Streaming -Methoden zu lesen, aber Sie können das herkömmliche Paket unter java.io.*nicht mehr verwenden. Hier müssen Sie das neue Tool unter java.nio verwenden.* - Filechannel. Schauen wir uns den folgenden Beispielcode an:
public static void main (String [] args) {filechannel fc = null; try {Datei f = neue Datei ("d: //centos-6.5-x86_64-binin-dvd1.iso"); if (f.exists () && f.isfile ()) {FileInputStream fis = new FileInputStream (f); fc = fis.getchannel (); logger.info (fc.size ()); } else {logger.info ("Datei existiert nicht oder ist keine Datei"); }} catch (FilenotFoundException e) {logger.Error (e); } catch (ioException e) {logger.Error (e); } endlich {if (null! = fc)) {try {fc.close (); } catch (ioException e) {logger.Error (e); }}}}}Die nach der Verwendung von Filechannel erhaltenen Ergebnisse stimmen mit dem ersten Fall überein und beschreiben die genaue Größe der Datei genau.
Dies erinnert auch alle technischen Kollegen daran, dass Sie beim Lesen großer Dateien in INT-Typ-Daten vorsichtig sein müssen, um versteckte Fehler zu vermeiden, und es ist schwierig, sie zu finden.
Danke fürs Lesen, ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung für diese Seite!