2012-05-02 56 views
6

我想接收一個巨大的文本文件作爲輸入流,並且想要將字符串段與另一個字符串進行轉換。我非常困惑如何做到這一點,如果我將整個輸入流轉換爲一個字符串,我不想讓一些內容丟失,那麼效果很好。任何人都可以請幫助如何做到這一點? 例如 如果我有一個文件的內容是「這是需要修改的測試字符串」。我想接受這個字符串作爲輸入流,並且想將內容修改爲「這是被修改的測試字符串」(通過用is替換'needs to be')。從輸入流中替換字符串段

public static void main(String[] args) { 
     String string = "This is the test string which needs to be modified"; 
     InputStream inpstr = new ByteArrayInputStream(string.getBytes()); 
      //Code to do 


    } 

在此我想要的輸出:這是測試字符串被修改

請多關照。

+0

我讀線輸入流(throuh一個BufferedReader),並執行在發送到輸出之前在整行上進行替換。更優雅的方式,從BufferedReader子類我的WholeLineChangerInputStream,重寫readLine()方法(應用替代),並使用^^ – BigMike

+0

基本上你需要這個:http://tutorials.jenkov.com/java-howto/replace-strings- in-streams-arrays-files.html,然後將其應用於輸入流 – bvdb

回答

2

可能是我理解你錯了,但我認爲你應該建立一個堆棧機器。我的意思是你可以使用一個小字符串堆棧來收集文本並檢查替換條件。

如果剛收集的堆棧已經與您的條件不匹配,只需刷新堆棧以輸出並再次收集。

如果您的堆棧與條件類似,請繼續收集它。

如果您的堆棧符合您的條件,請進行修改並刷新修改後的堆棧以輸出。

+0

+1。我喜歡堆棧概念 – BigMike

+0

感謝您的建議..我會嘗試並更新我放置的代碼.. – ranjan

+1

我找到了類似的東西,隨時可以使用(對我有用,耶!)http://tech.joshuacummings.com/ 2012/02/search-and-replace-input-stream.html –

4

如果要被改變文本將始終處於一個邏輯行配合,因爲我在評論說,我會用簡單的線條去閱讀使用類似(如果applyable):

public class InputReader { 
    public static void main(String[] args) throws IOException 
    { 
     String string = "This is the test string which needs to be modified"; 
     InputStream inpstr = new ByteArrayInputStream(string.getBytes()); 

     BufferedReader rdr = new BufferedReader(new InputStreamReader(inpstr)); 
     String buf = null; 
     while ((buf = rdr.readLine()) != null) { 
      // Apply regex on buf 

      // build output 
     } 
    } 
} 

不過我一直都很喜歡使用繼承所以我定義這個地方:

class MyReader extends BufferedReader { 
    public MyReader(Reader in) 
    { 
     super(in); 
    } 

    @Override 
    public String readLine() throws IOException { 
     String lBuf = super.readLine(); 
     // Perform matching & subst on read string 
     return lBuf; 
    } 
} 

而且在地方標準的BufferedReader保持隱藏ReadLine方法內部置換的使用MyReader。

優點:替代邏輯是在指定的Reader中,代碼非常標準。 缺點:它隱藏了邏輯替代給調用者(有時這也是一個親,仍然這取決於使用情況)

HTH

+0

感謝它幫助..但問題是當我有一個字符串與前一行中的一些部分和一些部分在下一行..我面臨一個模式問題匹配..我試圖解決它.. – ranjan

+0

在這種情況下,更好地使用尼古拉建議的堆棧機。我會將它嵌入到一個自定義的InputStream(或BufferedReader)中。可以寫一點點,但會覆蓋99%的案例。 – BigMike

+0

@BigMike解決方案只覆蓋'readLine()'方法,仍然是'read()'和'read(char [])'保留未替換的數據源。我正在尋找正確的解決方案,但即使是Apache Commons IO也沒有正確的實施(https://issues.apache.org/jira/browse/IO-218於2013年加入)。 –