我想用下面的Java程序删除文件的某些内容。 这是在同一个文件替换写入方法或者它应该被复制到另一个文件。
但其删除文件的所有内容。
class FileReplace
{
ArrayList<String> lines = new ArrayList<String>();
String line = null;
public void doIt()
{
try
{
File f1 = new File("d:/new folder/t1.htm");
FileReader fr = new FileReader(f1);
BufferedReader br = new BufferedReader(fr);
while (line = br.readLine() != null)
{
if (line.contains("java"))
line = line.replace("java", " ");
lines.add(line);
}
FileWriter fw = new FileWriter(f1);
BufferedWriter out = new BufferedWriter(fw);
out.write(lines.toString());
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
public statc void main(String args[])
{
FileReplace fr = new FileReplace();
fr.doIt();
}
}
我会关闭的读者,和冲洗器开始:
public class FileReplace {
List<String> lines = new ArrayList<String>();
String line = null;
public void doIt() {
try {
File f1 = new File("d:/new folder/t1.htm");
FileReader fr = new FileReader(f1);
BufferedReader br = new BufferedReader(fr);
while ((line = br.readLine()) != null) {
if (line.contains("java"))
line = line.replace("java", " ");
lines.add(line);
}
fr.close();
br.close();
FileWriter fw = new FileWriter(f1);
BufferedWriter out = new BufferedWriter(fw);
for(String s : lines)
out.write(s);
out.flush();
out.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void main(String args[]) {
FileReplace fr = new FileReplace();
fr.doIt();
}
}
接受的答案是伟大的。 但是,使用Apache的替换文件中的内容更简单的方法commons-io
库( commons-io-2.4.jar
-你可以使用任何最新版本)
private void update() throws IOException{
File file = new File("myPath/myFile.txt");
String fileContext = FileUtils.readFileToString(file);
fileContext = fileContext.replaceAll("_PLACEHOLDER_", "VALUE-TO-BE-REPLACED");
FileUtils.write(file, fileContext);
}
注:时抛出IOException
需要被捕获并应用相应的处理。
读+写同一个文件simulatenously也不行。
编辑:改变措辞,并更正确,更具体 - 读取和写入同一个文件,在同一个线程,没有正确关闭的读者(和flusing作家)也不行。
确保:
-
close
任何流,当你不再需要他们 - 特别是前重新打开它进行写入。
-
truncate
该文件,以确保如果你写不到它有它收缩。 - 然后写入输出
- 写个人的线条,不靠
toString
。 -
flush
和close
,当你写完!
如果您使用缓冲 IO,你总是要确保缓冲区在年底刷新,或可能造成数据丢失!
我可以看到三个问题。
首先你写out
,我认为是System.out的,而不是一个输出流的文件。
其次,如果你写的输出流的文件,你需要关闭它。
三, toString()
上的方法ArrayList
是不会写的文件中像你期望。 遍历列表,并写出每个String
每次一个。 问问自己,你是否需要写换行符也是如此。
接受的答案是稍有不妥。 下面是正确的代码。
public class FileReplace {
List<String> lines = new ArrayList<String>();
String line = null;
public void doIt() {
try {
File f1 = new File("d:/new folder/t1.htm");
FileReader fr = new FileReader(f1);
BufferedReader br = new BufferedReader(fr);
while ((line = br.readLine()) != null) {
if (line.contains("java"))
line = line.replace("java", " ");
lines.add(line);
}
fr.close();
br.close();
FileWriter fw = new FileWriter(f1);
BufferedWriter out = new BufferedWriter(fw);
for(String s : lines)
out.write(s);
out.flush();
}
out.close();
catch (Exception ex) {
ex.printStackTrace();
}
}