2013-10-11 58 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版本的替换方法。