在调用FileOutputStream的close方法之后立刻移动或操作文件会遇到文件被占用的问题

来源:互联网 发布:ctf flag.php 编辑:程序博客网 时间:2024/05/26 22:58

在通过FileOutputStream进行文件输出,尤其是文件内容较大的输出完成之后都需要关闭文件,正常情况下都会通过调用close方法关闭输出流。然后在某些特殊情况下,我们需要在关闭输出流之后对文件进行移动或者其他转换之类的操作,而此时你可能会遇到“文件被占用”的错误。这意味着你要操作的文件正在被另一个程序使用。我们既然已经调用了close方法,为何文件依然被占用呢?

因为文件的输出对程序而言并不是实时的,通常为了匹配软件的速度差,内容在被写入物理文件之前通常会被保存在缓存中,然后在逐步写入物理文件,当我们需要写入文件的内容输出完成后只是意味着所有内容已经被部分写入了物理文件,部分内容还位于缓存中,close方法执行完成后,缓存中的内容还在陆续写入物理文件,在这个步骤完成之前,文件依然处于被程序占用的状态,所以close方法调用之后并不能立刻对文件进行操作。那么怎么办呢?

很简单,就是等到缓存中的内容全部写入物理文件之后再进行操作。如何等到内容全部写完呢?通过FileOutputStream的对象调用getFD()方法得到一个FileDescriptor的对象,然后调用该对象中的sync方法就表示等待所有内容同步到物理文件的过程。示例代码如下:

FileOutputStream out = new FileOutputStream(....);

while(....) {

out.write(....);

}

out.close();

out.getFD().sync();

move file...

1 0
原创粉丝点击