2015-09-23 1 views
0

В настоящее время я создаю базовый http-прокси, который может иметь текстовую цензуру. Когда я читал из входного потока, я надеялся манипулировать текстом (то есть заменить или удалить) массива байтов и передать его в выходной поток для клиента. Однако размер входного потока с сервера может быть очень большим (> 100 МБ). Есть ли способы сделать это эффективно?Манипулировать данными потока потока и эффективно отправлять его в выходной поток

Вот мой фрагмент (без обработки каких-либо данных) при чтении и отправке данных с сервера на клиент.

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 является входным потоком от сервера, FOS является файлом для целей кэширования и toClient является выходным потоком к клиенту.

Большое спасибо!

+0

Возможно, вы захотите использовать BufferedReader. Так как вам придется декодировать, чтобы изменить любой текст, а затем переписать/переписать с другим BufferedWriter. Если вы попытаетесь прочитать байт [], тогда декодируйте и измените существующий байт [], я не думаю, что вы сэкономите большую производительность, но у вас будет огромная головная боль. – matt

ответ

0

Я согласен с Мэттом здесь.

Без буферизации каждый вызов read() или readLine() может привести к чтению байтов из файла, преобразованию в символы и возврату, что может быть очень неэффективным.

Ибо без манипулирования данные, которые я хотел бы предложить следующее

IOUtils.copy(inputStream, outputStream) 

Следующего фрагмент кода может помочь вам в случае манипулирования данных

  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(); 

Манипуляция в строке будет легко.