【问题标题】:How to replace a word in an exisiting text file in java如何在java中替换现有文本文件中的单词
【发布时间】:2017-03-29 08:41:47
【问题描述】:

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

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!");
         }
    }
}

【问题讨论】:

  • 您在阅读时覆盖同一个文件...所以是的,无论如何if(getText != null){ 根据 while 循环将始终为真
  • 然而 puText 与 getText 相同,但 dog 被替换,因此它应该仍然有效。是 bw 到底在哪里写的问题。它是写到第一个空行还是写在哪里?

标签: java file bufferedreader filereader ioexception


【解决方案1】:

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

改为:从文件 A 中读取;并写入某个文件A.tmp

如果你绝对想要,你仍然可以删除A,最后将A.tmp重命名为A。 p>

最后,记录一下:如果你的目标真的是这样的话;要替换某些文本文件中的某些字符串,更合理的答案是研究诸如 sed 之类的工具(或 Windows 操作系统存在的一些替代方法)。

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

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;
     }
  ...

Final finally:正如您现在询问替换 last 发生...嗯,这是一个完全不同且 更难 的问题。您会看到,您当前的方法是逐行读取该输入文件,更新该行,然后将其写入新文件。但是:逐行运行的代码怎么会知道 this 行 ... 是包含您希望替换的模式的最后一行?!简短的回答:不能。

这里的简单解决方案;除非您的文件非常大,否则效果很好:

  1. 所有行读入字符串列表(例如使用method
  2. 然后向后遍历该列表;并替换该列表中的第一次出现(向后走时是最后一个!)
  3. 更新的列表写入您的文件

【讨论】:

  • 我想要相同的文件名。是否可以创建一个临时文件并删除现有文件并将临时文件重命名为现有文件?
  • 成功了!!我想再问一个问题,即我只想更改“Dog”的第一次出现,而是将所有“Dog”更改为“Cat”,因为有 4 行,所以每次循环工作时它都会替换。所以有什么办法我可以只改变“狗”的第一次出现吗?
  • 我添加了 一些 代码来帮助您。当然,您必须确保以合理的方式将其添加到现有代码中。
  • 我正在尝试最后一次出现“Dog”,我为它做了一个方法link,但问题是它只充当replaceFirst。但是如果我尝试从 end 开始,那么最后一行将首先打印,所以这也行不通。我该如何解决这个问题?
  • 我在我的答案中添加了另一个更新。但请理解,这不是 SO 应该如何工作。我们不会与您坐下来牵手并指导您完成作业的每一步。特别是,您不应该回来就解决原始问题的答案提出更多问题。严肃地说:如果你想学习编程,那么你应该做这些事情......更多的是你自己。学习的一个核心方面是问自己“我怎么能做到这一点”……只要需要。避免“让我们问别人”的弯路!
【解决方案2】:

你应该尝试复制你的文件,而不是在同一个文件中读写

【讨论】:

    【解决方案3】:

    试试这个,

          ....
         StringBuilder fullText =new StringBuilder();
          while((getText = br.readLine()) != null){
                putText = ""; 
                if(getText != null){
                    putText = getText.replaceFirst("Dog", "Cat"); 
                }   
                fullText.append(putText);
            } 
        br.close();
        bw.write(putText);
        bw.close()
    

    【讨论】:

      猜你喜欢
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 2023-03-25
      • 1970-01-01
      相关资源
      最近更新 更多