如何在java中替换现有文本文件中的单词

top*_*309 1 java file ioexception filereader bufferedreader

我想将一个单词替换为现有文本文件中的另一个单词.我认为我的代码是正确的,但每当我运行程序时,所有文本都会在文本文件中被删除.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test {
    public static void main(String ar[]) throws IOException{

         String getText, putText;
         File f = new File("Test.txt");
         FileReader fr ;
         BufferedReader br ;
         BufferedWriter bw;
         if(f.exists()){
             try{
                 fr = new FileReader(f);
                 br = new BufferedReader(fr);
                 bw = new BufferedWriter(new FileWriter(f));
                 while((getText = br.readLine()) != null){
                     System.out.println(getText);
                     if(getText != null){
                         putText = getText.replaceFirst("Dog", "Cat");
                         bw.write(putText);
                     }   
                 }
                bw.close();
                br.close();
             }
             catch(IOException e){
                 e.printStackTrace();
             }
         }else{
             System.out.println("No File exists!");
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

Gho*_*ica 5

您根本不应该在同一时间点读取/写入同一文件.

相反:从文件A中读取; 并写入一些文件A.tmp.

如果你绝对要,你仍然可以删除一个,并将其重命名A.tmp一个到底.

最后,只是为了记录:如果你的目标真的那么; 要替换某些文本文件中的某些字符串,更合理的答案是查看sed等工具(或Windows操作系统中存在的一些替代方法).

要仅替换某些字符串的第一次出现,您必须添加一些标记,告诉您是否已经替换,例如:

boolean replacingRequired = true;
while ( ... reading ...) 
  if (replacingRequired) {
     putText = getText.replaceFirst("Dog", "Cat")
     if (! putText.equals(getText)) {
       // when they are different, you replaced something!
       replacingRequired = false;
     }
  ...
Run Code Online (Sandbox Code Playgroud)

最后决定:正如你现在要求取代最后一次出现 ......那么,这是一个完全不同和更难的问题.您看,您当前的方法是逐行读取该输入文件,更新该行,并将其写入新文件.但是:逐行编码的代码怎么可能知道这一行...是最后一个带有你想要替换的模式的?简答:它不能.

这里简单的解决方案; 除非你的文件非常大,否则它很好用:

  1. 所有行读入字符串列表(例如,使用此方法)
  2. 然后向后走过那个列表; 并替换该列表中的第一个事件(当向后行走时是最后一个!)
  3. 更新的列表写入您的文件