Question
Existe-t-il un langage plus concis / standard (par exemple, une méthode JDK) pour "tuyauterie"? une entrée dans une sortie en Java que la suivante?
public void pipe(Reader in, Writer out) { CharBuffer buf = CharBuffer.allocate(DEFAULT_BUFFER_SIZE); while( in.read(buf) >= 0 ) { out.append(buf.flip()); buf.clear(); } }
[EDIT] Veuillez noter que Lecteur
et Writer
sont indiqués . La réponse correcte montrera comment prendre dans
et sur
et former un canal (de préférence avec pas plus de 1 ou 2 appels de méthode). J'accepterai les réponses où dans
et sur
sont un InputStream
et un OutputStream
(de préférence avec une conversion de / vers Lecteur
/ Writer
). Je n'accepterai pas les réponses où dans
ou sur
est une sous-classe de Reader
/ InputStream
ou Writer
/ OutputStrem
.
La solution
IOUtils du projet Apache Commons contient un certain nombre de utilement des méthodes qui font exactement ce dont vous avez besoin.
IOUtils.copy (entrée, sortie)
effectuera une copie en mémoire tampon de toutes les entrées de la sortie. S'il existe plusieurs emplacements dans votre base de code nécessitant la gestion de Stream
ou Reader
/ Writer
, l'utilisation de IOUtils pourrait être une bonne idée.
Autres conseils
Consultez java.io.PipedInputStream et PipedOutputStream , ou PipedReader / PipedWriter du même package.
Dans la documentation de PipedInputStream:
Un flux d'entrée canalisé doit être connecté à un flux de sortie canalisé; le flux d'entrée canalisé fournit alors quels que soient les octets de données écrits dans le flux de sortie canalisé. En règle générale, les données sont lues à partir d'un objet PipedInputStream par un thread et les données sont écrites dans le PipedOutputStream correspondant par un autre thread. Tenter d'utiliser les deux objets à partir d'un seul thread n'est pas recommandé, car cela pourrait bloquer le thread. Le flux d'entrée canalisé contient un tampon, découplant les opérations de lecture des opérations d'écriture, dans certaines limites. Un tuyau est dit cassé si un thread qui fournissait des octets de données au flux de sortie raccordé connecté n’est plus en vie.
La seule optimisation disponible consiste à utiliser FileChannels dans l'API NIO: Lit , Écrit . La machine virtuelle Java peut optimiser cet appel pour déplacer les données d'un fichier vers un canal de destination sans avoir à déplacer préalablement les données vers l'espace noyau. Voir cet article pour plus de détails.