我想重写一个文件的内容。

到目前为止我所想到的是:

  1. 保存文件名
  2. 删除现有文件
  3. 创建一个名称相同的新空文件
  4. 将所需内容写入空文件
  5. 这是最好的方法吗?或者是否有更直接的方式,即不必删除和创建文件,只需更改内容?

有帮助吗?

解决方案

使用FileOutputStream覆盖文件foo.log:

File myFoo = new File("foo.log");
FileOutputStream fooStream = new FileOutputStream(myFoo, false); // true to append
                                                                 // false to overwrite.
byte[] myBytes = "New Contents\n".getBytes(); 
fooStream.write(myBytes);
fooStream.close();

或使用FileWriter:

File myFoo = new File("foo.log");
FileWriter fooWriter = new FileWriter(myFoo, false); // true to append
                                                     // false to overwrite.
fooWriter.write("New Contents\n");
fooWriter.close();

其他提示

我强烈建议使用Apache Common的FileUtil。我发现这个包非常宝贵。它易于使用,同样重要的是,当您稍后返回时,它易于阅读/理解。

//Create some files here
File sourceFile = new File("pathToYourFile");
File fileToCopy = new File("copyPath");

//Sample content
org.apache.commons.io.FileUtils.writeStringToFile(sourceFile, "Sample content");

//Now copy from source to copy, the delete source.
org.apache.commons.io.FileUtils.copyFile(sourceFile, fileToCopy);
org.apache.commons.io.FileUtils.deleteQuietly(sourceFile);

更多信息可在以下网址找到: http://commons.apache.org/io /api-release/org/apache/commons/io/FileUtils.html

请参阅: java.io.RandomAccessFile

您需要打开文件读写,所以:

RandomAccessFile raf = new RandomAccessFile("filename.txt", "rw");
String tmp;
while (tmp = raf.readLine() != null) {
    // Store String data
}
// do some string conversion
raf.seek(0);
raf.writeChars("newString");

除非您只是在最后添加内容,否则以这种方式执行是合理的。如果您要添加,请尝试使用 FileWriter 追加构造函数。

稍微好一点的顺序是:

  1. 生成新文件名(例如foo.txt.new)
  2. 将更新的内容写入新文件。
  3. 从foo.txt.new进行原子重命名为foo.txt
  4. 不幸的是,renameTo 无法保证进行原子重命名。

在下面的示例中,“false”表示“false”。导致文件被覆盖,true会导致相反的情况。

File file=new File("C:\Path\to\file.txt");
DataOutputStream outstream= new DataOutputStream(new FileOutputStream(file,false));
String body = "new content";
outstream.write(body.getBytes());
outstream.close(); 

有些时候,人们可能希望保留一个巨大的空文件,以避免在需要的基础上分配空间的额外成本。这通常由数据库,虚拟机以及处理和写入批量数据的批处理程序完成。这将显着提高应用程序的性能。在这些情况下,编写新文件并重命名它不会真正有用。相反,必须填写空文件。那是必须采用覆盖模式的时候。

番石榴 File.write "覆盖a具有字节数组内容的文件“:

Files.write(bytes, new File(path));
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top