2016-08-03 2 views
3

Je diffuse de très grandes quantités de données de InputStreams à OutputStreams. La méthode que je me sers ressemble à ceci:Recherche/Remplacement entre InputStream et OutputStream

public static void forwardStream(InputStream in, OutputStream out) throws IOException 
{ 
    byte[] buffer = new byte[1024]; 
    int bytesRead; 

    while ((bytesRead = in.read(buffer)) != -1) { 
     out.write(buffer, 0, bytesRead); 
    } 
} 

Maintenant je dois effectuer une recherche/remplacement des opérations sur le contenu du flux avant son écrit. Le chargement du flux entier dans une chaîne, puis l'exécution d'un String.replace() n'est pas une option en raison de la grande taille des données transmises.

Mon idée serait d'envelopper l'InputStream dans une sorte de classe d'aide héritant d'InputStream et d'effectuer les opérations de remplacement pendant que son contenu est lu. Y a-t-il des solutions éprouvées?

+0

est, un InputStream est un groupe d'octets, donc jusqu'à ce que vous ne lisiez pas tous les octets, vous n'avez pas de "chaîne traduite". Peut-être que vous devriez essayer d'enquêter pour lire un flux d'entrée tronqué, mais je pense que vous aurez toujours le même problème. quelque chose comme ça . http://www.java2s.com/Code/Java/File-Input-Output/AnInputStreamthatimplementsHTTP11chunking.htm – duardito

+0

Cela ressemble à un travail pour les flux java8. Recherchez des tutoriels comme [ici] (http://www.tutorialspoint.com/java8/java8_streams.htm) ou [ici] (http://winterbe.com/posts/2014/07/31/java8-stream- tutorial-examples /). – ArcticLord

+3

Au niveau du flux, c'est une chose difficile (fait une fois, mais c'est délicieusement difficile). Cela devient plus simple si vous avez un certain type de délimiteur (c'est-à-dire s'il s'agit de caractères, tamponnez chaque ligne, et effectuez une recherche/remplacement sur une ligne). Sinon, vous devez le faire manuellement, c'est-à-dire, lire un tas d'octets, voir s'il y a une correspondance OU une correspondance partielle. S'il y a une correspondance partielle, relisez jusqu'à ce que vous puissiez décider si vous devez remplacer, puis donnez à votre interlocuteur le nombre d'octets qu'il a demandé, et mettez en tampon ce que vous avez lu ... @ ArticLord1: ceci est très statefull. Difficile avec les cours d'eau! – GPI

Répondre

0

Je connais peu de gens sur le type de filtrage dont vous avez besoin. Mais un nombre de solutions possibles est d'étendre java.io.FilterInputStream et là remplacer read() et read (byte [] b)