如何在 java 中替换现有文本文件中的单词
How to replace a word in an exisiting text file in java
我想将现有文本文件中的一个词替换为另一个词。我认为我的代码是正确的,但是每当 I 运行 程序时,文本文件中的所有文本都会被删除。
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!");
}
}
}
你根本不应该在同一时间点读写from/to同一个文件。
改为:从文件 A 中读取;并写入某个文件 A.tmp。
如果你真的想,你仍然可以删除 A,并将 A.tmp 重命名为 A最后.
最后,郑重声明:如果你的目标真的只是那个;要替换某些文本文件中的某些字符串,更合理的答案是研究 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 发生的事情......好吧,这是一个完全不同的 harder问题。您看,您当前的方法是逐行读取该输入文件,更新该行,然后将其写入新文件。但是:逐行执行的代码如何知道 this 行 ... 是最后一个包含您要替换的模式的行?!简短回答:不能。
这里是简单的解决方案;除非您的文件非常大,否则效果很好:
- 将所有行读入字符串列表(例如使用这个method)
- 然后向后遍历该列表;并替换该列表
中的第一次出现(向后走时是最后一个!)
- 将更新的列表写入您的文件
您应该尝试复制您的文件,而不是在同一个文件中读写
试试这个,
....
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()
我想将现有文本文件中的一个词替换为另一个词。我认为我的代码是正确的,但是每当 I 运行 程序时,文本文件中的所有文本都会被删除。
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!");
}
}
}
你根本不应该在同一时间点读写from/to同一个文件。
改为:从文件 A 中读取;并写入某个文件 A.tmp。
如果你真的想,你仍然可以删除 A,并将 A.tmp 重命名为 A最后.
最后,郑重声明:如果你的目标真的只是那个;要替换某些文本文件中的某些字符串,更合理的答案是研究 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 发生的事情......好吧,这是一个完全不同的 harder问题。您看,您当前的方法是逐行读取该输入文件,更新该行,然后将其写入新文件。但是:逐行执行的代码如何知道 this 行 ... 是最后一个包含您要替换的模式的行?!简短回答:不能。
这里是简单的解决方案;除非您的文件非常大,否则效果很好:
- 将所有行读入字符串列表(例如使用这个method)
- 然后向后遍历该列表;并替换该列表 中的第一次出现(向后走时是最后一个!)
- 将更新的列表写入您的文件
您应该尝试复制您的文件,而不是在同一个文件中读写
试试这个,
....
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()