7
votes

Java Nio Servlet to File

Y a-t-il un moyen (sans tamponner l'intégralité d'introuvream) de prendre le HTTPServletRequest à partir d'un servlet Java et de l'écrire dans un fichier à l'aide de tout Nio? Est-ce que ça vaut même la peine d'essayer? Sera-t-il une lecture plus rapide d'un flux de java.io normal et d'écrire dans un canal Java.nio ou des deux ont-ils vraiment besoin d'être pur nio pour voir un avantage? Merci.

Edit: p>

Donc, je viens de faire une référence rapide et sale, en lisant un fichier d'un disque et d'écrire sur un disque différent (donc je teste réellement le code et non le disque) . P>

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


0 commentaires

4 Réponses :


1
votes

httpServletReQuest vous donne un flux d'entrée "tirant" régulier - ne voyez pas comment utiliser Nio aidera ici.


1 commentaires

C'est un peu le sentiment que j'avais, à l'exception d'un Filechannel peut utiliser DMA pour écrire le flux sur disque - ce qui pourrait améliorer les performances.



0
votes

Je pense que vous vous inquiétez de rien. La vitesse de réseau moyenne (~ 1Mb / s) ne peut pas rattraper la vitesse moyenne du disque dur (~ 100 Mo / s) de loin (même avec les moyennes les plus optimistes). Les Filechannels ne vous donneront aucun avantage. Le "Legacy" java.io est plus que suffisant.


0 commentaires

7
votes

L'avantage principal d'une solution de Nio pure est que vous pourrez peut-être éviter de copier des données de noyau à l'utilisateur et à son retour à l'espace du noyau. Lorsque vous utilisez un transfert to () ou transfertFrom () opération, cette suspension peut être évitée et les transferts entre les canaux peuvent être très rapides (en fonction de la mise en œuvre sous-jacente).

Cependant, l'API de servlet ne vous permet pas d'accéder à une source canal ; Au moment où votre servlet voit les données, ils sont dans l'espace utilisateur. Donc, je ne m'attendrais pas à ce qu'une performance augmente d'écrire sur un canal .


0 commentaires

1
votes

Vous ne pouvez pas comparer sérieusement la performance avec des tests aussi courts que millisecondes.

Les disques ne tourneront pas plus rapidement à cause du choix de l'API. Ce qui s'est passé dans FileChannel-> Filechannel est probablement que l'appel renvoyé avant que les écrivies soient réellement engagées sur le disque.

NIO pourrait enregistrer une utilisation de la CPU / de la mémoire. Mais pas beaucoup dans votre situation. Pour enregistrer des fichiers téléchargés par les utilisateurs, il est généralement au format des données multipartières / formes, et le serveur doit lire l'octet-byte-octet de flux pour analyser le contenu de fichier d'entrée et extraire, il ne peut pas simplement vider directement le flux brut.


0 commentaires