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 .

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top