Façon la plus efficace d'écrire le Fichier de ServletOutputStream
ServletOutputStream output = response.getOutputStream();
output.write(byte[]);
Quel est le moyen le plus efficace d'écrire le Fichier de javax.servlet.ServletOutputStream?
EDIT:
ce ne sera pas plus efficace si le NIO a été utilisé?
nio n'est pas une balle magique qui rend tout le io base plus rapide. en fait, nio est généralement utile si vous avez besoin pour rendre votre code plus évolutive (p. ex. moins de threads de traitement de plus de connexions). pour single threaded code, io est presque toujours aussi bonne ou meilleure que (exception à cette règle peut être un fichier de transfert de fichier).
OriginalL'auteur IAdapter | 2011-01-10
Vous devez vous connecter pour publier un commentaire.
Où
in
est le FileInputStream etout
est leSocketOutputStream
.IOUtils est un utilitaire de Commons IO module dans Apache Commons.
IOUtils.closeQuitely(..)
il a utilisé pour être appelé Jakarta Commons il y a plusieurs années 🙂
cela ne fonctionne pas pour moi, je ne veux pas ajouter Commons IO pot juste pour cette fonctionnalité.
ce ne sera pas plus efficace si le NIO a été utilisé?
Bozho il a un très gros inconvénient, je devrai me battre avec mon patron, à cause de cela. j'ai plutôt réinventer la roue que de combattre avec lui.
OriginalL'auteur AlexR
Vous avez un ServletOutputStream. La seule façon que vous pouvez écrire c'est via java.io.*. Vous ne pouvez pas utiliser NIO à tous les (autres que par l'intermédiaire d'un emballage avec
Channels
, ce qui est inutile: c'est toujours unOutputStream
dessous et vous êtes tout simplement en ajoutant de traitement sur le dessus). Les e/S réelles est liées au réseau, et de vos écritures sont tamponnés de toute façon par le conteneur de servlet (de sorte qu'il puisse définir la Longueur du Contenu) de la tête alors à la recherche de réglages de performance ici est inutile.Oui, vous pouvez utiliser NIO canaux si vous utilisez des Canaux.newChannel(OutputStream). Qui enveloppe le flux de sortie dans un canal. C'est encore de parler à un sous-jacent ByteArrayOutputStream. Il n'y a pas de gain d'efficacité dans cette situation. Il est inutile.
il est possible d'utiliser NIO à l'aide de NIO Canaux.
Je addessed que dans les commentaires cinq ans et demi et ont attiré 5 commentaire votes pour l'avoir fait. Look.
OriginalL'auteur user207421
Tout d'abord, ceci est sans rapport avec les servlets. Cela s'applique à Java IO en général. Vous avez, après tout juste un
InputStream
et unOutputStream
.De la réponse, vous n'êtes pas le seul qui se demande à ce sujet. Sur les interwebs, vous pouvez en trouver d'autres, qui s'interroge sur le même, mais a pris l'effort de test et de référence en eux-mêmes:
En général, un
FileChannel
avec un 256K tableau d'octets qui est lu par le biais d'un enveloppéByteBuffer
et écrit directement à partir du tableau d'octets est le moyen le plus rapide. En effet, NIO.La différence est en effet minime. L'OP est cependant en demandant "efficace" n'est pas "efficace". 8K est toujours rapide mais le moins la consommation de mémoire dans le cas d'un site très fréquenté.
Que penser de l'utilisation des canaux et Canaux.transferTo ?
En général, l'utilisation de
transferTo()
offrira les meilleures performances; malheureusement, la Servlet API ne pas exposer leSocketChannel
, de sorte que l'optimisation n'est pas disponible.OriginalL'auteur BalusC
Si vous ne voulez pas ajouter de pot de votre application, puis vous avez à le copier à la main. Il suffit de copier la méthode de la mise en œuvre à partir d'ici: http://svn.apache.org/viewvc/commons/proper/io/trunk/src/main/java/org/apache/commons/io/IOUtils.java?revision=1004358&view=markup:
mettre ces 2 méthodes dans l'une de vos classes d'aide et vous êtes bon pour aller.
j'ai eu des résultats mitigés avec nio :). Il pourrait être mieux ou il ne pourrait pas. Le code est certainement un peu plus complexe et vous avez vraiment besoin de tester les résultats sur votre machine pour vous assurer que c'est assez bon. Regardez ici pour un peu de code: thomaswabner.wordpress.com/2007/10/09/...
+1 ymmv, mais j'ai eu du mal à faire le nio version plus rapide que le bon vieux flux
OriginalL'auteur Mihai Toader