Java Get Tamaño del archivo
Hoy, al escribir código, debe implementar la función de obtener el tamaño del archivo. Actualmente hay dos métodos de implementación. Uno es usar el método de longitud () de archivo; El otro es usar el método () disponible () de FileInputStream. Cuando InputStream no realiza la operación de lectura, el tamaño de disponible () debe ser igual al tamaño del archivo. Pero cuando se trata de archivos grandes, los problemas ocurren en este último. Echemos un vistazo:
En el ejemplo, utilicé el archivo de imagen de instalación de CentOS 6.5, principalmente considerando que este archivo es lo suficientemente grande (grande que 2GB).
1. Use el método de longitud () de archivo
public static void main (string [] args) {archivo f = nuevo archivo ("d: //centos-6.5-x86_64-bin-dvd1.iso"); if (f.exists () && f.isFile ()) {logger.info (f.length ()); } else {logger.info ("El archivo no existe o no es un archivo"); }}Veamos la salida:
4467982336
El resultado es 4.16 GB, lo que es consistente con los resultados que se muestran en Windows.
A continuación, echemos un vistazo al tamaño del archivo obtenido a través de FileInputStream:
public static void main (string [] args) {fileInputStream fis = null; Pruebe {archivo f = nuevo archivo ("d: //centos-6.5-x86_64-bin-dvd1.iso"); fis = nuevo fileInputStream (f); logger.info (Fis.available ()); } capt (excepción e) {logger.error (e); } finalmente {if (null! = fis) {try {fis.close (); } catch (ioException e) {logger.error (e); }}}}}Aquí están los resultados de ejecución:
2147483647
¿Este resultado parece familiar? Es integer.max_value, que es el valor máximo que puede representar un entero firmado.
Entonces, si lo convierte en una unidad familiar, ¿qué tan grande es el tamaño del archivo de esta manera?
Se trata de 2 GB, que obviamente no es el resultado correcto.
La razón es que el tipo devuelto por el método de archivo Long () es largo, y el valor máximo del valor positivo que puede representar el tipo largo es: 92233772036854775807. El tamaño máximo de archivo que puede convertirse en el soporte máximo es: 8954730132868714 bytes EB. Este orden de magnitud se utilizará durante muchos años en la historia del desarrollo de TI humano. El valor de retorno del método () disponible () de FileInputStream es int. El rango de representación máximo se introdujo antes. El tamaño máximo de archivo que se puede soportar es: 1.99GB, y podemos alcanzar fácilmente este orden de magnitud.
Agregado el 31 de marzo de 2014:
No es factible leer tamaños de archivos grandes para los métodos de transmisión, pero ya no puede usar el paquete tradicional en java.io.*. Aquí debe usar la nueva herramienta en Java.nio.* - Filechannel. Echemos un vistazo al siguiente código de muestra:
public static void main (string [] args) {filechannel fc = null; Pruebe {archivo f = nuevo archivo ("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 ("El archivo no existe o no es un archivo"); }} Catch (FileNotFoundException e) {logger.error (e); } catch (ioException e) {logger.error (e); } finalmente {if (null! = fc)) {try {fc.close (); } catch (ioException e) {logger.error (e); }}}}}Los resultados obtenidos después de usar Filechannel son consistentes con el primer caso, describiendo con precisión el tamaño exacto del archivo.
Esto también recuerda a todos los colegas técnicos que al leer archivos grandes, debe tener cuidado con los datos de tipo INT para evitar errores ocultos y es difícil localizarlos.
Gracias por leer, espero que pueda ayudarte. ¡Gracias por su apoyo para este sitio!