用JAVA搜索和替换文件中的内容
我必须编辑一个文件的内容,并将编辑的内容写入另一个文件。以下是iam使用的代码用JAVA搜索和替换文件中的内容,java,file,file-writing,fileupdate,Java,File,File Writing,Fileupdate,我必须编辑一个文件的内容,并将编辑的内容写入另一个文件。以下是iam使用的代码 import java.io.*; import java.util.*; public class TestRef { ArrayList<String> lines = new ArrayList<String>(); String line= null; public void printThis(){
import java.io.*;
import java.util.*;
public class TestRef {
ArrayList<String> lines = new ArrayList<String>();
String line= null;
public void printThis(){
try{
FileReader fr = new FileReader("C:\\Users\\questions.txt");
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter("C:\\Users\\questions_out.txt");
BufferedWriter out = new BufferedWriter(fw);
while((line=br.readLine()) != null) {
if(line.contains("Javascript"))
line.replace("Javascript"," JAVA");
lines.add(line);
out.write(line);
}
}
catch(Exception e){}
}
public static void main(String [] args){
TestRef tr = new TestRef();
tr.printThis();
}
}
import java.io.*;
导入java.util.*;
公共类TestRef{
ArrayList行=新的ArrayList();
字符串行=null;
public void printThis(){
试试{
FileReader fr=新的FileReader(“C:\\Users\\questions.txt”);
BufferedReader br=新的BufferedReader(fr);
FileWriter fw=新的FileWriter(“C:\\Users\\questions\u out.txt”);
BufferedWriter out=新的BufferedWriter(fw);
而((line=br.readLine())!=null){
if(line.contains(“Javascript”))
替换(“Javascript”、“JAVA”);
行。添加(行);
写出(行);
}
}
捕获(例外e){}
}
公共静态void main(字符串[]args){
TestRef tr=新的TestRef();
tr.printThis();
}
}
这就像一次读取一行,然后将其打印回文件。但是当我执行这段代码时,输出文件是空的。?你能给我一个示例代码吗?如何从文件中读取、更改内容并将整个文件写入新文件?你缺少
out.flush()
BufferedWriter在您刷新它们或它们的缓冲区填满之前不会写入任何内容。好吧,有几个问题:
- 您永远不会关闭输入或输出。关闭也将刷新-可能只是没有刷新某些内容。您应该在
块中关闭基于流的资源,这样即使遇到异常,它们也会被关闭。(考虑到您应该关闭,我也不需要显式刷新。只需确保您关闭顶级抽象,即finally
(和out
)br
- 您正在捕获
,然后将其吞下。很可能是抛出了异常,但您无法判断,因为您吞下了异常。您至少应该记录它,并可能在该点停止。(我还建议捕获异常
,而不是IOException
)异常
- 您使用的是
和FileWriter
,这不允许您指定输入/输出编码-这不是问题所在,但我个人喜欢对我使用的编码进行更多控制。我建议使用FileReader
和FileInputStream
包装在FileOutputStream
中,并且<代码>输出流编写器InputStreamReader
- 您正在调用
并忽略结果。字符串是不可变的-调用String.replace()
不会更改现有字符串。您想要:replace
line = line.replace("Javascript"," JAVA");
- 您从不使用
变量,而行
变量最好作为局部变量。它只与方法本身相关,因此只在方法中声明它行
- 如果代码的缩进更合适,代码就更容易理解。如果您使用的是IDE,它应该能够为您做到这一点——它在可读性方面有很大的不同
第一个问题最有可能是您当前问题的原因,但其他问题在您解决问题后会有所帮助。(关于“替换”的问题可能是您的下一个问题…关闭打印机,在循环之外
out.flush();
out.close();
此外,您正在将字符串写入新行,如果您只是想用Java替换javascript,那么您可能还想将“\n”,下一行字符写入新文件,其中旧文件包含新行。不要捕获异常,什么也不做!您可能正在使用异常-至少添加一个e.printStackTrace()顺便说一句,Java不是缩写词,它只是“Java”,而不是“Java”@JamesClark:是的。不知道我从哪里得到的。Will edit-谢谢你发现了它。不,PrintWriter在那里,它后来被编辑了。我第一次读代码时看到了它@JonSkeet@Zohaib:好的,谢谢你确认我没有发疯。我认为5分钟的编辑宽限期不出现只对答案有意义,但也许吧ps不是。我也有一个疑问,那就是在阅读和写作的过程中如何看待uTF-8字符file@chinchu:当您在FileInputStream上构造InputStreamReader,在FileOutputStream上构造OutputStreamWriter时,通过显式指定编码。您只需关闭即可自动刷新。