Java 文件中替换特定字符串的反射
我有一个文本文件:Java 文件中替换特定字符串的反射,java,string,file,Java,String,File,我有一个文本文件: my name is abhi my name is khan my name is koushik 现在我想用“viswajit”替换“khan”,我已经为它编写了一个代码。我的预期产出是: my name is abhi my name is viswajit my name is koushik 我的代码实际上是用“Viswajit”替换“khan”。但是翻译下一行的几个字母。 我收到的O/P为: my name is abhi my name is viswaji
my name is abhi
my name is khan
my name is koushik
现在我想用“viswajit”替换“khan”,我已经为它编写了一个代码。我的预期产出是:
my name is abhi
my name is viswajit
my name is koushik
我的代码实际上是用“Viswajit”替换“khan”。但是翻译下一行的几个字母。
我收到的O/P为:
my name is abhi
my name is viswajit
name is koushik.
最后一行缺少“我的”字。
请检查一下,给我一些想法。
这是我的密码:
public static void replaceStringInFile(String fileName, String match, String replacingString){
try {
File file = new File(fileName);
RandomAccessFile raf = new RandomAccessFile(file, "rw");
long pointer = raf.getFilePointer();
String lineData = "";
while((lineData =raf.readLine()) != null){
pointer = raf.getFilePointer() - lineData.length()-2;
if(lineData.indexOf(match) > 0){
lineData = lineData.replace(match, replacingString+"\n");
raf.seek(pointer);
raf.writeBytes(lineData);
你没有插入额外的文本,你写得太多了 如果要插入文本,则没有捷径可以重新写入文件的其余部分
因此,可能不值得使用RandomAccessFile,因为这可能比有用的更复杂。我只需要使用BufferedReader和PrintWriter来复制文件。我能理解的是,当您写回时,您正在覆盖字节 check
khan
是一个4个字母的单词,viswajit
是7个字母。替换时,连续的3个字节也被替换。例如,您将丢失一个'my'
和换行符
考虑这一点并操纵您的操作。我不明白您在使用文本文件时为什么要使用
RandomAccessFile
的对象。正如Peter Lawrey所说,我建议您使用BufferedReader
对象来读取文件和PrintWriter
编辑:
我在我的机器上检查了您的代码,它对我来说运行良好,但通过此编辑(lineData.length()-2
必须是lineData.length()-1)
:
但是,请尝试此代码,它执行相同的操作,但使用BufferedReader
和PrintWriter
对象,创建一个名为的新文件,并使用替换.txt创建新文件:
public static void replaceStringInFile(String fileName, String match, String replacingString){
try {
FileReader file = new FileReader(fileName);
BufferedReader br = new BufferedReader(file);
PrintWriter pw = new PrintWriter(new FileWriter("the_new_file_with_replacing.txt"));
String lineData = "";
while((lineData = br.readLine()) != null){
pw.println(lineData.replaceAll(match,replacingString));
}
file.close();
br.close();
pw.close();
}
catch(Exception e){
System.out.println("exception");
}
}
您可能只需将整个文件读入一个字符串,执行string.replace并将替换的字符串写回即可。或者你们正在读一个很大的文件,并且担心内存问题?正如Peter所说,若你们想更新这个方法,只需重写文件的其余部分。但是,您可以考虑删除整个行的其他方法,然后将新的字符串附加到文件。
public static void replaceStringInFile(String fileName, String match, String replacingString){
try {
FileReader file = new FileReader(fileName);
BufferedReader br = new BufferedReader(file);
PrintWriter pw = new PrintWriter(new FileWriter("the_new_file_with_replacing.txt"));
String lineData = "";
while((lineData = br.readLine()) != null){
pw.println(lineData.replaceAll(match,replacingString));
}
file.close();
br.close();
pw.close();
}
catch(Exception e){
System.out.println("exception");
}
}