2013-11-20 51 views
1

使用BufferedWriter.write()何时创建文件?BufferedWriter何时创建文件?

我从文档知道,当缓冲区填满它会刷新到文件,这是否意味着:

的每次缓冲区充满不完整的文件会出现在我的文件系统上?

或该文件仅在BufferedWriter关闭时创建?

我的问题是我正在使用BufferedWriter将文件写入目录,另一个进程是轮询目录以查找新文件并读取它们。我不想要一个不完整的文件被创建并被另一个进程读取。

回答

3

使用BufferedWriter.write()何时创建文件?

从来没有。 BufferedWriter本身只是写入到另一个Writer。现在,如果您使用的是FileOutputStreamFileWriter(其中第一个可能会包含在OutputStreamWriter中),则在构建对象时(即在实际写入之前),该文件将被创建(如果该文件已存在,则将其打开)任何数据。

我担心的是我正在使用BufferedWriter将文件写入目录,另一个进程正在轮询目录以查找新文件并读取它们。我不想要一个不完整的文件被创建并被另一个进程读取。

处理此问题的一种典型方法是写入临时区域,然后将文件重命名为正确的位置,这通常是原子操作。甚至可以将文件写入正确的目录,但是使用轮询过程不会识别的文件扩展名 - 然后将文件重命名为最终文件名。

+0

我在'BufferedWriter'中包装了'FileWriter'。我传递了一个文件名作为'FileWriter'的构造函数,但没有创建新文件,即使文件已经存在,它也没有被覆盖。 'FileWriter'是否应该创建文件,如果它们不存在? – Ungeheuer

+0

@Ungeheuer:是的,它确实如此。说实话,我对你的说法持怀疑态度。这听起来像也许你期望在错误的地方创建文件 - 如果你使用相对文件名并且不知道当前工作目录是什么,那么很容易做到。 –

+0

在阅读您的回复后,我查看了我的代码,发现在写入之前一行内引发了异常。没有stacktrace打印,所以我不知道它。我会记住你的警告。 – Ungeheuer

1

BufferedWriter不会像Jon Skeet说的那样创建一个文件。并且您不能保证另一个进程在写入磁盘时不会读取不完整的文件。但有两件事你可以做:

  1. 锁定文件,以便其他进程不能读取它,然后写入完成。在这个网站上有关于Java文件锁定的几个问题(搜索“[java]锁定文件”)。
  2. 使用另一个文件名创建文件(即使用未被其他进程查找的扩展名),并在写入完成时对其进行重命名。