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

在Java中复制文件而不锁定原始文件,java,copy,locking,Java,Copy,Locking,我有一个包含20个文件的文件夹,“myFile1.txt”到“myFile20.txt”。一个程序,让我们称之为“WRITER”,可能会写入这些文件 现在,我想用Java复制文件夹,更具体地说是使用方法。但是,我担心如果我使用这个方法,我会在复制过程中锁定文件,这样“WRITER”程序就不能再写入文件了 有人知道FileUtils中的方法是否会锁定文件吗?复制时如何防止锁定原始文件(如果是这样的话) 谢谢大家! 编辑:我正在使用Windows我的理解是,所有基于Linux的锁本质上都是建议性的。

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

现在,我想用Java复制文件夹,更具体地说是使用方法。但是,我担心如果我使用这个方法,我会在复制过程中锁定文件,这样“WRITER”程序就不能再写入文件了

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

谢谢大家!


编辑:我正在使用Windows

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


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

我有一堆Paradox DB文件,需要复制而不锁定它们。我今天从一个实验室测试了这个方法。 我使用了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();
        }
    }
 
}

我更新了我的问题,提到我正在使用Windows。你能解释一下重命名文件是什么意思吗?我将研究nio.FileChannel类,谢谢!