2010-06-17 23 views
7

¿Hay alguna manera (sin almacenar en búfer todo el Inputstream) de tomar HttpServletRequest de un Servlet Java y escribirlo en un archivo usando todo NIO? ¿Vale la pena intentarlo? ¿Será una lectura más rápida de un flujo normal de java.io y se escribirá en un canal de java.nio o los dos realmente necesitan ser NIO puro para ver un beneficio? Gracias.Servlet Java NIO en el archivo

EDIT:

Así que acabo de hacer una referencia rápida y sucia, la lectura de un archivo de un disco y grabar en un disco diferente (por lo que estoy realmente probar el código y no el disco).

Averages: 
InputStream -> OutputStream : 321 ms. 
FileChannel -> FileChannel : 3 ms. 
InputStream -> FileChannel : 600 ms. 

En realidad obtuve un rendimiento peor al tratar de usar un híbrido java.io -> java.nio. El nio-> nio fue más rápido por MUCHO, pero estoy atrapado con el Servlet InputStream.

Respuesta

6

El principal beneficio de una solución de NIO pura es que puede evitar copiar datos de kernel a usuario y volver al espacio del kernel. Cuando utiliza una operación transferTo() o transferFrom(), esta sobrecarga puede evitarse y las transferencias entre canales pueden ser muy rápidas (dependiendo de la implementación subyacente).

Sin embargo, la API de Servlet no le permite acceder a una fuente Channel; cuando el servlet ve los datos, están en el espacio del usuario. Así que no esperaría un aumento en el rendimiento al escribir en un Channel.

1

HttpServletRequest le proporciona un flujo de entrada de "extracción" regular - no veo cómo el uso de NIO ayudará aquí.

+0

Esto es como la sensación que tuve, excepto que FileChannel puede usar DMA para escribir la secuencia en el disco, lo que podría mejorar el rendimiento. – Gandalf

0

Creo que no te preocupa nada. La velocidad promedio de la red (~ 1MB/s) no puede alcanzar la velocidad media del disco duro (~ 100MB/s) por lejos (incluso con los promedios más optimistas). Los canales de archivos no le darán ningún beneficio. El "legado" java.io es más que suficiente.

1

no se puede comparar seriamente el rendimiento con pruebas tan breves como milisegundos.

discos no girarán más rápido debido a la elección de la API. lo que sucedió en FileChannel-> FileChannel probablemente sea que la llamada se devolvió antes de que las escrituras se hayan enviado al disco.

nio podría ahorrar algo de uso de CPU/memoria. pero no mucho en tu situación. para guardar archivos cargados por los usuarios, por lo general tiene el formato de multipart/form-data, y el servidor debe leer la secuencia byte a byte para analizar la entrada y extraer el contenido del archivo, no puede simplemente volcar directamente la secuencia sin formato al archivo.