2013-10-11 92 views
0

輸出我有一個問題,請參見下面的代碼:替換字符串和Java中

 public void readFile(String path,String pathName,int num){ 
      try{ 
     PrintWriter out2=new PrintWriter(new PrintWriter(path)); 
     File a=new File(pathName); 
     Scanner b=new Scanner(a); 


     while(b.hasNextLine()){ 
     String message=b.nextLine(); 
     Scanner h=new Scanner(message); 

     while(h.hasNext()){ 
      String f=h.next(); 
      if (f.equals("are")){ 
       f.replace("are","ARE"); 

      } 

      } 

    out2.printf("%s",message); 
    out2.println(); 
    ....... 

的掃描器讀取的文件內容是

who are you? 
    how are you? 
    what is up! 

然而,當我運行上面的代碼和輸出到新文件與輸入文件相同,這意味着「是」不會被「ARE」取代,我不知道哪個部分是錯誤的,請告知,謝謝你們!

+2

你在調用'String.replace'並忽略輸出。字符串在Java中是不可變的。 –

+0

@JonSkeet是對的。你應該看看文檔:) –

回答

3

此行只輸出消息未更改到新文件。

out2.printf("%s",message); 

此外,循環也很奇怪:爲什麼你逐字讀取它,然後使用String.replace()?您可以通過線做線,採用String.replaceAll():

while(h.hasNextLine()){ 
     String message=b.nextLine(); 
     out2.printf("%s",message.replaceAll("(^|\\W)are(\\W|$)"," ARE ")); 
    } 

(^|\\W)are(\\W|$)字符串是一個正則表達式,具有意義的所有內容,與任何作爲字符串^開始啓動匹配,或者非字字符(\\W),字符串are,並與非字字符或線($)結束時結束......

由於掃描儀具有空格作爲默認的分隔符,它可能是有史以來更好地使用(^|\\s)are(\\s|$),但是這兩個將在「ARE」之前和之後用單個空格替換空格()...

此外,請記住,String.replace不會改變輸入字符串...您必須分配結果,或以任何其他方式使用它,如將它傳遞給函數.. 。

+0

感謝ppeterka,很好的幫助,所以在這種情況下,我需要創建一個循環逐字閱讀? –

+0

當你想做一些更復雜的事情,而不僅僅是換一個詞。或者,例如zou有一個輸入,總是像'',並且您希望每個第3個標記都可以通過Scanner.nextInt()讀取以得到一個整數......(但是就我們所說,這將是可能的也得到一個正則表達式...) – ppeterka

+0

嗨ppeterka,所以如果我想要使用charAt或indexOf單個單詞或字母處理,我需要創建循環逐字閱讀,對吧? –

0

我不明白你爲什麼這樣做。以下是一種替代方法:

  1. 獲取BufferedReader來讀取文件。
  2. 當文件中有數據時,請閱讀這些行。
  3. 如果line.contains("are")然後line = line.replace("are","ARE")
  4. println(line)

至於爲什麼你的代碼沒有工作:
在這一行,f.replace("are","ARE");你忘了得到的輸出。
讓它這樣:message = f.replace("are","ARE");


另一種選擇是使用 StringBufferStringBuilder

1

字符串是最終的和不可改變的,這是相同的。

所以f.replace("are","ARE");必須插入一個新的或不變量。

f = f.replace("are","ARE"); 
0

字符串是不可變的。因此,您不能在對象f上運行replace方法,並希望更改它的值,因爲字符串對象的替換方法只會返回一個新的String對象。

要麼使用StringBuilder代替,或使用:

f = f.replace 

在另一方面,StringBuilder的對象是可變。因此,如果您選擇該路由,則可以直接在對象上運行StringBuilder版本的替換方法。