我必须编辑一个文件的内容,并将编辑后的内容写入另一个文件。下面是我使用的代码:
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();
}
}
这就像一次读取一行并将其打印回文件。但是当我执行这段代码时,输出文件是空白的。你能给我提供一个示例代码,如何从文件中读取,更改内容并将整个文件写入新文件?
好吧,有几个问题:
- 你永远不会关闭你的输入或输出。关闭也会刷新——有可能有些东西没有被刷新。您应该在
finally
块中关闭基于流的资源,这样即使面对异常,它们最终也会关闭。(假设你的应该关闭,我也不会费心显式地刷新。只要确保关闭了顶层抽象——即out
(和br
)。 你正在捕捉 - 您使用的
FileWriter
和FileReader
不允许您指定输入/输出编码-不是这里的问题,但我个人喜欢对我使用的编码采取更多的控制。我建议使用FileInputStream
和FileOutputStream
包裹在InputStreamReader
和OutputStreamWriter
。 您正在调用
String.replace()
并忽略结果。字符串是不可变的——调用replace
不会改变现有的字符串。你想要的:line = line.replace("Javascript"," JAVA");
- 你永远不会使用你的
lines
变量,你的line
变量作为本地变量会更好。它只与方法本身相关,所以只有在方法中声明它。 - 你的代码将更容易遵循,如果它是更适当的缩进。如果你使用的是IDE,它应该能够为你做到这一点——它使在可读性上产生巨大的差异。
Exception
然后吞下它。很可能是抛出了一个异常,但您无法分辨,因为您已经吞下了它。您应该至少记录它,并可能在此停止。(我也建议捕捉IOException
而不是Exception
。)第一个是你当前问题的最有可能的原因,但当你过去的时候,其余的应该会有所帮助。(关于"替换"的问题可能是你的下一个问题…)
您缺少out.flush()
。
BufferedWriters不会写任何东西,除非你刷新它们,或者它们的缓冲区被填满。
在循环外关闭打印书写器
out.flush();
out.close();
此外,你正在写字符串到新行,如果你只是想用Java代替javascript,那么你可能还想写'n',下一行字符到新文件,旧文件包含新行。