2010-06-17 15 views
7

C'è un modo (senza buffering tutta InputStream) per prendere il HttpServletRequest da una Servlet Java e scrivere in un file utilizzando tutti NIO? Vale la pena provare? Sarà una lettura più veloce da un normale flusso java.io e la scrittura su un canale java.nio o entrambi dovrebbero davvero essere NIO puri per vedere un vantaggio? Grazie.Java Servlet NIO su file

EDIT:

Così ho appena fatto un punto di riferimento rapido e sporco, la lettura di un file da un disco e la scrittura su un disco diverso (quindi sono in realtà testando il codice e non il disco).

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

In realtà ho ottenuto prestazioni peggiori cercando di utilizzare un java.io ibrido -> java.nio. Il nio-> nio era più veloce di A LOT, ma io sono bloccato con l'InputStream di Servlet.

risposta

6

Il vantaggio principale di una soluzione NIO pura è che si può essere in grado di evitare la copia dei dati dal kernel per l'utente e verso lo spazio del kernel. Quando si utilizza un'operazione transferTo() o transferFrom(), questo overhead può essere evitato e i trasferimenti tra i canali possono essere molto veloci (a seconda dell'implementazione sottostante).

Tuttavia, l'API Servlet non consente di accedere a una fonte Channel; quando il servlet vede i dati, sono nello spazio dell'utente. Quindi non mi aspetto un aumento delle prestazioni scrivendo su un Channel.

1

HttpServletRequest ti dà un flusso regolare "tirare" input - non vedo come utilizzare NIO aiuterà qui.

+0

Questo è il tipo di sensazione che ho avuto, ad eccezione di un FileChannel può utilizzare DMA per scrivere il flusso su disco - che potrebbe migliorare le prestazioni. – Gandalf

0

Penso che tu ti stia preoccupando di nulla. La velocità media della rete (~ 1 MB/s) non può raggiungere la velocità media del disco rigido (~ 100 MB/s) di gran lunga (anche con le medie più ottimistiche). I filechannels non ti daranno alcun vantaggio. Il "legacy" java.io è più che sufficiente.

1

non è possibile confrontare seriamente le prestazioni con test brevi come millisecondi.

I dischi non gireranno più velocemente a causa della scelta dell'API. cosa è successo in FileChannel-> FileChannel è probabilmente la chiamata restituita prima che le scritture vengano effettivamente trasferite sul disco.

nio potrebbe risparmiare un po 'di utilizzo della CPU/memoria. ma non molto nella tua situazione. per salvare i file caricati dagli utenti, di solito è nel formato di multipart/form-data, e il server deve leggere il flusso byte per byte per analizzare l'input ed estrarre il contenuto del file, non può semplicemente scaricare direttamente il flusso raw sul file.