为了账号安全,请及时绑定邮箱和手机立即绑定

在Java中复制文件而不锁定原始文件

在Java中复制文件而不锁定原始文件

狐的传说 2022-05-25 17:42:21
我有一个包含 20 个文件的文件夹,从“myFile1.txt”到“myFile20.txt”。一个程序,我们称之为“WRITER”,可能会写入这些文件。现在,我想使用Apache commons 的 FileUtils复制 Java 中的文件夹,更具体地说是FileUtils.copyDirectoryToDirectory()方法。但是,我担心如果我使用该方法,我会在复制过程中锁定文件,使得“WRITER”程序无法再写入文件。有谁知道 FileUtils 中的方法是否锁定了文件?复制时如何防止锁定原始文件(如果是这样的话)?谢谢!编辑:我正在使用 Windows
查看完整描述

2 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

我的理解是,所有基于 Linux 的锁本质上都是建议性的。调用者必须检查锁。从这个意义上说,这不是一个万无一失的解决方案。由于重命名同一目录中的文件是原子操作,因此最好的方法可能是将文件重命名为某个随机名称,复制到新目录并删除旧文件。

如果您可以控制文件的读取者和写入者,则可以使用 nio.FileChannel 和它提供的锁定功能。读取器和写入器都必须在访问之前检查锁。


查看完整回答
反对 回复 2022-05-25
?
MYYA

TA贡献1868条经验 获得超4个赞

我有一堆 Paradox DB 文件,我需要在不锁定它们的情况下复制它们。我今天从https://www.baeldung.com/java-copy-file测试了这种方法。我使用了 256 * 1024 的缓冲区,因为我的测试产生了最佳速度。我用于测试的文件大约有 240 MB


public void givenIoAPI_whenCopied_thenCopyExistsWithSameContents(String original, String copied) 

  throws IOException {

    File original = new File(original);

    File copied = new File(copied);

    

    try (

      InputStream in = new BufferedInputStream(

        new FileInputStream(original));

      OutputStream out = new BufferedOutputStream(

        new FileOutputStream(copied))) {

 

        byte[] buffer = new byte[262144];

        int lengthRead;

        while ((lengthRead = in.read(buffer)) > 0) {

            out.write(buffer, 0, lengthRead);

            out.flush();

        }

    }

 

}


查看完整回答
反对 回复 2022-05-25
  • 2 回答
  • 0 关注
  • 183 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号