java file stream server

JAVA: Transmita cualquier archivo al navegador correctamente



file stream (2)

Al leer desde un BufferedInputStream puede permitir que su ''búfer maneje el almacenamiento en búfer, no hay razón para leer todo en un byte[] (y ciertamente no un byte[] de todo el archivo). Lea un byte a la vez y confíe en el búfer interno de la transmisión. Algo como,

FileInputStream fis = new FileInputStream(f); BufferedInputStream bis = new BufferedInputStream(fis); int abyte; while ((abyte = bis.read()) != -1 ){ write(abyte); }

Así que he creado mi propio servidor HTTP personal en Java desde cero. Hasta ahora está funcionando bien, pero con un defecto importante. Cuando intento pasar archivos grandes al navegador, aparece un error de Java Heap Space . Sé cómo solucionar este error a través de JVM, pero estoy buscando la solución a largo plazo para esto.

//declare an integer for the byte length of the file int length = (int) f.length(); //start the fileinput stream. FileInputStream fis = new FileInputStream(f); //byte array with the length of the file byte[] bytes = new byte[length]; //write the file until the bytes is empty. while ((length = fis.read(bytes)) != -1 ){ write(bytes, 0, length); } flush(); //close the file input stream fis.close();

De esta manera, envía el archivo al navegador con éxito y lo transmite perfectamente, pero el problema es que estoy creando una matriz de bytes con la longitud del archivo. Cuando el archivo es muy grande, aparece el error Heap Space.

Eliminé este problema al usar un búfer como se muestra a continuación y ya no recibo errores de Heap Space. PERO el camino que se muestra a continuación no transmite los archivos en el navegador correctamente. Es como si los bytes del archivo se barajan y se envían al navegador todos juntos.

final int bufferSize = 4096; byte buffer[] = new byte[bufferSize]; FileInputStream fis = new FileInputStream(f); BufferedInputStream bis = new BufferedInputStream(fis); while ( true ) { int length = bis.read( buffer, 0, bufferSize ); if ( length < 0 ) break; write( buffer, 0, length ); } flush(); bis.close(); fis.close();

NOTA 1:

Todos los encabezados de respuesta correctos se envían perfectamente al navegador.

Nota 2:

Ambas formas funcionan perfectamente en un navegador de computadora , pero solo la primera forma funciona en el navegador de un teléfono inteligente (pero a veces me da un error de Heap Space ). Si alguien sabe cómo enviar correctamente los archivos a un navegador y transmitirlos correctamente, sería un hombre muy feliz.

¡Gracias de antemano! :)


Emm ... Como puedo ver, tratas de usar trozos en tu código de todos modos, como puedo recordar, incluso la solución apache HttpClient + FileUpload tiene un límite de tamaño de archivo de <= 2.1GB o algo así ( corrígeme si me equivoco ) entonces es algo difícil ...

Todavía no he probado la solución, pero como prueba puede usar java.io.RandomAccessFile en combinación con File (Input / Output) Stream en el cliente y el servidor para no leer y escribir todo el archivo a la vez, sino una secuencia de cambios. por ejemplo, bloques <= 30MB para evitar los molestos errores de memoria; Puede encontrar un ejemplo del uso de RandomAccessFile aquí https://examples.javacodegeeks.com/core-java/io/randomaccessfile/java-andomaccessfile-example/

Pero todavía das menos detalles :( Quiero decir, ¿tu cliente supone que es una aplicación Java común o no?

Si tiene alguna información adicional, por favor hágamelo saber

Buena suerte :)