2015-09-23 1 views
0

Je suis en train de créer un proxy http de base qui peut avoir une certaine censure de texte. Lorsque je lisais à partir du flux d'entrée, j'espérais manipuler le texte (c'est-à-dire remplacer ou supprimer) du tableau d'octets et le transférer vers le flux de sortie pour le client. Cependant, la taille du flux d'entrée du serveur peut être très importante (> 100 Mo). Y a-t-il des moyens de le faire efficacement?Manipuler les données du flux d'entrée et l'envoyer efficacement au flux de sortie

Voici mon extrait (sans manipulation de données) lors de la lecture et de l'envoi de données du serveur au client.

int count = 0; 
byte[] buffer = new byte[102400]; 
while ((count = fromServer.read(buffer)) > 0){ 
    System.out.println(new String(buffer, "UTF-8")); 
    toClient.write(buffer, 0, count); 
    fos.write(buffer, 0, count); 
} 
fos.close(); 
server.close(); 
client.close(); 

fromServer est le courant d'entrée à partir du serveur, fos est le fichier à des fins de mise en cache et toClient est le flux de sortie vers le client.

Merci beaucoup!

+0

Vous voudrez probablement utiliser un BufferedReader. Puisque vous devrez décoder pour changer n'importe quel texte, puis réécrire/réencoder avec un autre BufferedWriter. Si vous essayez de lire octet [] puis décoder et modifier l'octet existant [], je ne pense pas que vous allez économiser beaucoup de performance, mais vous aurez un mal de tête énorme. – matt

Répondre

0

Je suis d'accord avec Matt ici. Sans la mise en mémoire tampon, chaque invocation de read() ou readLine() peut provoquer la lecture des octets du fichier, leur conversion en caractères, puis leur retour, ce qui peut s'avérer très inefficace.

Pour sans manipuler vos données, je suggère la

IOUtils.copy(inputStream, outputStream) 

suivant Le code suivant peut vous aider en cas de manipulation des données

  FileOutputStream fos = new FileOutputStream(new File("c:\\output.xml")); 
     BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("c:\\input.xml")), 32*1024*1024); 
     int bytesRead = -1; 
     byte[] buffer = new byte[4096]; 
     while ((bytesRead = bis.read(buffer)) != -1) { 
      String strFileContents = new String(buffer, 0, bytesRead); 
      System.out.println(strFileContents); 
      fos.write(buffer, 0, bytesRead); 
     } 
     fos.close(); 
     bis.close(); 

Manipulation dans une chaîne serait facile.