La forma más rápida de leer relativamente grandes bytes de archivos en Java

¿Cuál es la forma más rápida de leer archivos relativamente grandes con los métodos de E / S de Java? Mi solución actual usa el almacenamiento BufferedInputStream en una matriz de bytes con 1024 bytes asignados. Cada búfer se guarda en un ArrayList para su uso posterior. Todo el proceso se llama a través de un hilo separado (interfaz invocable).

No es muy rápido.

  ArrayList outputArr = new ArrayList(); try { BufferedInputStream reader = new BufferedInputStream(new FileInputStream (dir+filename)); byte[] buffer = new byte[LIMIT]; // == 1024 int i = 0; while (reader.available() != 0) { reader.read(buffer); i++; if (i <= LIMIT){ outputArr.add(buffer); i = 0; buffer = null; buffer = new byte[LIMIT]; } else continue; } System.out.println("FileReader-Elements: "+outputArr.size()+" w. "+buffer.length+" byte each."); 

Yo usaría un archivo mapeado de memoria que es lo suficientemente rápido para hacer en el mismo hilo.

 final FileChannel channel = new FileInputStream(fileName).getChannel(); MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()); // when finished channel.close(); 

Esto supone que el archivo es más pequeño que 2 GB y tardará 10 milisegundos o menos.

No use available() : no es confiable. Y no ignore el resultado del método read() : le dice cuántos bytes se leyeron realmente. Y si quiere leer todo en la memoria, use un ByteArrayOutputStream en lugar de usar un List :

 ByteArrayOutputStream baos = new ByteArrayOutputStream(); int read; while ((read = reader.read(buffer)) >= 0) { baos.write(buffer, 0, read); } byte[] everything = baos.toByteArray(); 

Creo que 1024 es un poco pequeño como un tamaño de búfer. Yo usaría un buffer más grande (algo así como 16 KB o 32KB)

Tenga en cuenta que Apache commons IO y Guava tienen métodos de utilidad que hacen esto por usted, y que ya se han optimizado.

Eche un vistazo a la API Java NIO (entrada / salida no bloqueada). Además, esta pregunta podría ser útil.

No tengo mucha experiencia con IO, pero he escuchado que NIO es una forma mucho más eficiente de manejar grandes conjuntos de datos.