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

我有一个包含 20 个文件的文件夹,从“myFile1.txt”到“myFile20.txt”。一个程序,我们称之为“WRITER”,可能会写入这些文件。

现在,我想使用Apache commons 的 FileUtils复制 Java 中的文件夹,更具体地说是FileUtils.copyDirectoryToDirectory()方法。但是,我担心如果我使用该方法,我会在复制过程中锁定文件,使得“WRITER”程序无法再写入文件。

有谁知道 FileUtils 中的方法是否锁定了文件?复制时如何防止锁定原始文件(如果是这样的话)?

谢谢!

编辑:我正在使用 Windows


狐的传说
浏览 184回答 2
2回答

浮云间

我的理解是,所有基于 Linux 的锁本质上都是建议性的。调用者必须检查锁。从这个意义上说,这不是一个万无一失的解决方案。由于重命名同一目录中的文件是原子操作,因此最好的方法可能是将文件重命名为某个随机名称,复制到新目录并删除旧文件。如果您可以控制文件的读取者和写入者,则可以使用 nio.FileChannel 和它提供的锁定功能。读取器和写入器都必须在访问之前检查锁。

MYYA

我有一堆 Paradox DB 文件,我需要在不锁定它们的情况下复制它们。我今天从https://www.baeldung.com/java-copy-file测试了这种方法。我使用了 256 * 1024 的缓冲区,因为我的测试产生了最佳速度。我用于测试的文件大约有 240 MBpublic 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();        }    } }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java