我有一个包含20个文件的文件夹,“ myFile1.txt”到“ myFile20.txt”。一个名为“ WRITER”的程序可能会写入这些文件。
现在,我想使用FileUtils by Apache commons,更具体地说是方法FileUtils.copyDirectoryToDirectory()在Java中复制文件夹。但是,如果使用该方法,恐怕会在复制过程中锁定文件,以使“ WRITER”程序无法再写入文件。
有人知道FileUtils中的方法是否锁定文件吗?如何防止复制时锁定原始文件(即使是这样)?
谢谢!
编辑:我正在使用Windows
答案 0 :(得分:1)
我的理解是,所有基于Linux的锁本质上都是建议性的。呼叫者必须检查锁。从这个意义上讲,这不是万无一失的解决方案。由于在同一目录中重命名文件是一项原子操作,因此最好的方法可能是将文件重命名为某个随机名称,然后复制到新目录中并删除旧文件。
如果您同时控制文件的读取器和写入器,则可以使用nio.FileChannel并锁定文件提供的功能。读写者都必须在访问前检查锁。
答案 1 :(得分:0)
我有一堆 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();
}
}
}