Java中的字符串替换和输出

时间:2013-10-11 15:30:02

标签: java string printwriter

我收到了疑问,请参阅以下代码:

        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 个答案:

答案 0 :(得分: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|$)字符串是一个正则表达式,具有匹配所有内容的含义,以字符串^的开头或非字符({{1}开头)开头}),字符串\\W,以非单词字符或行尾(are)结尾...

由于扫描程序将空格作为默认分隔符,因此使用$可能会更好,但这两种方法都将使用单个空格((^|\\s)are(\\s|$))替换“ARE”之前和之后的空格。 ..

另外,请记住,String.replace不会改变输入字符串...您必须分配结果,或者以任何其他方式使用它,例如将其传递给函数...

答案 1 :(得分:1)

String是final和immutable,它是相同的。

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

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

答案 2 :(得分:0)

我不明白你为什么这样做。这是另一种方法:

  1. 获取BufferedReader来阅读该文件。
  2. 虽然文件中有数据,但请阅读这些行。
  3. 如果line.contains("are")line = line.replace("are","ARE")
  4. println(line)

  5. 至于为什么你的代码不起作用:
    在这一行中,f.replace("are","ARE");您忘记了输出 这样做:message = f.replace("are","ARE");

    <小时/> 另一种选择是使用StringBufferStringBuilder

答案 3 :(得分:0)

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

使用StringBuilder,或使用:

f = f.replace

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