我有一个文本文件:
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”取代“汗”。但是下一行的几个字母很少。 我得到的是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);
答案 0 :(得分:1)
您没有插入其他文字,而是在覆盖。
如果要插入文本,则没有捷径可以重写文件的其余部分。
因此可能不值得使用RandomAccessFile,因为这可能比使用更复杂。我只是将BufferedReader和PrintWriter用于该文件的副本。
答案 1 :(得分:1)
我不明白为什么在使用文本文件时使用RandomAccessFile
的对象。就像Peter Lawrey所说,我建议您使用BufferedReader
对象来阅读文件,而不是PrintWriter
。
编辑:
我在我的机器上检查了您的代码,它对我来说效果很好,但是通过此修改(lineData.length()-2
必须是lineData.length()-1)
:
while((lineData =raf.readLine()) != null){
pointer = raf.getFilePointer() - lineData.length()-1;
if(lineData.indexOf(match) > 0){
lineData = lineData.replace(match, replacingString+"\n");
raf.seek(pointer);
raf.writeBytes(lineData);
}
}
但是,尝试使用此代码时,它会使用BufferedReader
和PrintWriter
个对象执行相同的操作,从而创建一个名为the_new_file_with_replacing.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");
}
}
答案 2 :(得分:0)
我能理解的是,当你写回来时,你正在覆盖字节。
支票khan
是一个4个字母的单词,viswajit
是7个字母。当您替换连续的3个字节时也会被替换。即,您将丢失'my'
和换行符。
考虑这一点并操纵你的行动。