在Java中打开并关闭现有文件。

5

在Java中,是否可以多次打开一个文件并追加数据,然后再关闭。例如:

 //---- psuedocode
      //class variable declaration 
      FileWriter writer1 = new FileWriter(filename);

      fn1:

         writer.append(data - title);

      fn2:
       while(incomingdata == true){
         writer.append(data)
         writer.flush();
         writer.close()
        }

问题出在while循环中。文件已经关闭,无法再次打开。有人能帮我解决吗?

你可以每次重新打开它吗? - user684934
一旦流被关闭,您将无法访问该流。 - Anantha Krishnan
1
那就不要关闭它?这里有什么问题? - user207421
我创建的文件必须保存。为此,我需要关闭它以更新时间戳。这时文件才能实时同步。 - Siddharthan
@Siddhartan 可能是缓存问题,即操作系统未针对每次刷新重新读取文件并更新其时间戳或文件大小,但实际上文件已经更新。在Windows中,在资源管理器中查看或使用dir命令时肯定是这种情况。 - Kennet
显示剩余2条评论
4个回答

3

建议不要在每次操作时关闭和重新打开文件,这是正确的做法。

但是,如果您一定要这样做(我并不确定您需要这样做),那么您可以每次创建一个新的FileWriter。在构造FileWriter时,将true作为第二个参数传递,以获取附加到文件而不是替换文件的FileWriter。例如:

FileWriter writer1 = new FileWriter(filename, true); 

那么我可以假设文件不会被新文件替换掉吗? - Siddharthan
那就是第二个参数给你的。如果需要更多细节,请查看FileWriter的javadoc。 - Dawood ibn Kareem

2

一旦流被关闭,进一步的write()或flush()调用会导致抛出IOException异常。然而,关闭先前已关闭的流没有任何效果。

 while(incomingdata == true){
         writer.write(data)
 }
 writer.close()

不需要每次刷新。因为在关闭流之前,调用close()会先刷新数据。

更新于

我创建的文件必须保存。因此,我应该关闭它以更新时间戳。这时候文件就可以实时同步了。

使用方法如下

while(incomingdata == true){
             writer.append(data);
             writer.flush();
}
writer.close();

如果我再次进入循环怎么办?是否可以再次打开文件?因为我已经在循环结束时关闭了它。 - Siddharthan
它会抛出IOException。仅在将所有数据写入流后关闭流。 - Anantha Krishnan

1

我不建议尝试关闭文件,然后再重新打开它。打开文件是一项昂贵的操作,您做得越少,对于代码快速运行来说就越好。

打开一次文件,在完成写入后关闭文件。这应该在循环之外进行。


1

一旦文件被关闭,您需要重新打开它。调用writer.flush()将清空流。因此,基本上,您将从while循环内删除writer.close()。这将允许您在完成后关闭文件。

所以您有两个选项,要么从while循环中删除writer.close(),要么在循环开始时创建一个新的FileWriter实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接