2016-08-03 87 views
3

我將很大量的數據從InputStreams傳輸到OutputStreams。該方法我使用看起來像這樣:在InputStream和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); 
    } 
} 

現在我需要執行搜索/在其書面前的數據流內容的替換操作。由於流式數據的大小很大,因此將整個流加載到String中,然後執行String.replace()不是一個選項。

我的想法是將InputStream包裝在某種繼承InputStream的助手類中,並在讀取內容時執行替換操作。有沒有經過驗證的解決方案?

+0

問題是,InputStream是一組字節,所以直到不讀取所有字節,你沒有「翻譯字符串」。也許你應該嘗試調查以讀取chuncked輸入流,但我認爲你仍然會遇到同樣的問題。像這樣的東西。 http://www.java2s.com/Code/Java/File-Input-Output/AnInputStreamthapleplementsHTTP11chunking.htm – duardito

+0

聽起來像java8流的工作。查找一些教程,如[here](http://www.tutorialspoint.com/java8/java8_streams.htm)或[here](http://winterbe.com/posts/2014/07/31/java8-stream-教程實例/)。 – ArcticLord

+3

在河流層面,這是一件很難的事情(一次就完成了,但這很詭異)。如果您有某種分隔符(即,如果這是字符,緩衝每行,並在一行上執行搜索/替換),它會變得更簡單。 否則,您必須手動完成,即讀取一堆字節,查看是否存在匹配或部分匹配。如果存在部分匹配,請再次閱讀,直到您可以決定是否必須替換爲止,然後爲您的調用者提供他請求的字節數,並緩衝您讀過的內容...... @ ArticLord1:這是高度穩定。流很難! – GPI

回答

0

我不知道你需要什麼樣的過濾。但是可能的解決方案是擴展java.io.FilterInputStream並覆蓋read()和read(byte [] b)