0

我有一个查询,请参阅下面的代码:

        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”没有被“ARE”替换,我不知道哪个部分错了,请指教,谢谢!

4

4 回答 4

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 不会改变输入字符串...您必须分配结果,或以任何其他方式使用它,例如将其传递给函数...

于 2013-10-11T15:32:42.887 回答
1

字符串是最终的和不可变的,这也是一样的。

所以f.replace("are","ARE");必须插入一个新的或非变量。

f = f.replace("are","ARE");
于 2013-10-11T15:33:23.327 回答
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

于 2013-10-11T15:33:02.500 回答
0

字符串是不可变的。因此,您不能在对象 f 上运行 replace 方法并期望其值被更改,因为 string 对象的 replace 方法将简单地返回一个新的 String 对象。

要么使用 StringBuilder ,要么使用:

f = f.replace

另一方面, StringBuilder 对象是可变的。因此,如果您选择该路由,则可以直接在对象上运行 StringBuilder 版本的 replace 方法。

于 2013-10-11T15:34:01.897 回答