我们可以同时将多个FileWriter流打开到同一文件吗?我写了一些代码来测试这一点,显然可以实现。这让我迷迷糊糊。由于如果我打开文件编写器来关闭文件,并且在关闭文件之前,我尝试删除该文件,所以我不能。那么,如何以及为什么一次可以打开多个FileWriter流到同一文件?这是我尝试的
private static final int SIZE = 1000;
public static void main(String[] args) throws IOException, InterruptedException {
File file = new File("C:\\dev\\harry\\data.txt");
FileWriter fileWriter = new FileWriter(file, true);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
for (int i = 0; i < SIZE; i++) {
bufferedWriter.write("1\n");
Thread.sleep(100);
}
if (bufferedWriter != null) bufferedWriter.close();
if (fileWriter != null) fileWriter.close();
}
Run Code Online (Sandbox Code Playgroud)
我有另一个过程,做的事情完全相同,但是写2出来了,我在数据文件中得到了1和2。
我们可以同时打开多个 FileWriter 流到同一个文件吗?
是的,这很有可能。
那么如何以及为什么我可以同时打开多个 FileWriter 流到同一个文件呢?
您已经演示了如何打开多个 FileWriter 实例,因此我将坚持说明为什么它是可能的。在 Java 中,所有基于文件或设备的操作通常都依赖于平台的功能。您可以将java.io其他相关包视为实际执行此功能的 JVM 中本机代码的瘦包装器。
在 Java 1.4(NIO 出现时)之前,文件锁定在 Java 中是不可能的,因为 JVM 没有进行适当的特定于平台的系统调用来锁定文件或文件内的范围。NIO 改变了这一点,NIO 已在java.nio软件包中提供。在FileChannel类的文档中,您会注意到以下内容:
除了熟悉的字节通道的读、写和关闭操作之外,该类还定义了以下特定于文件的操作:
...
文件的某个区域可能被锁定以防止其他程序访问。
正如您所猜到的那样,这种行为是由于 JVM 进行了必要的特定于平台的调用。如果底层平台不支持这一点,则不会发生文件锁定。
至于为什么 FileWriter 存在这种行为,原因很简单。NIO 是一组新的 I/O 类,但它并没有取代java.io. 因此,您可以继续使用java.ioFileOutputStream 和 FileWriter 等类,但您永远无法在写入操作期间让 JVM 锁定文件。
| 归档时间: |
|
| 查看次数: |
8366 次 |
| 最近记录: |