我想用java程序删除一些文件内容,如下所示。这是在同一文件中替换的write方法,还是应该复制到另一个文件中。
但它删除了文件的所有内容。
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();
}
}
答案 0 :(得分:12)
我会先关闭读者,然后冲洗作家:
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();
}
}
答案 1 :(得分:9)
接受的答案很棒。但是,有一种更简单的方法可以使用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
需要由应用程序相应地捕获和处理。
答案 2 :(得分:3)
同时读取+写入同一个文件是不行的。
编辑:改写并更正确和具体 - 在同一个线程中读取和写入同一文件,而不正确关闭阅读器(并刷新编写器)是不行的。
答案 3 :(得分:2)
请务必:
close
任何流truncate
该文件,以确保如果你写的比它少,它会缩小。toString
。flush
和close
!如果使用缓冲 IO,则必须确保最后刷新缓冲区,否则可能会丢失数据!
答案 4 :(得分:0)
我可以看到三个问题。
首先,您要写入out
,我假设它是System.out,而不是文件的输出流。
其次,如果您写入文件的输出流,则需要将其关闭。
第三,toString()
上的ArrayList
方法不会像您期望的那样编写文件。循环遍历列表并一次写入String
个。问问自己是否还需要编写换行符。
答案 5 :(得分:0)
接受的答案有点不对劲。这是正确的代码。
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();
}
}