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.
4 Réponses :
httpServletReQuest vous donne un flux d'entrée "tirant" régulier - ne voyez pas comment utiliser Nio aidera ici. p>
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.
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 code> est plus que suffisant. P>
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 Cependant, l'API de servlet ne vous permet pas d'accéder à une source transfert to () code> ou
transfertFrom () code> 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). p>
canal code>; 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
code>. P>
Vous ne pouvez pas comparer sérieusement la performance avec des tests aussi courts que millisecondes. P>
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. p>
NIO code> 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. p>