2 回答

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

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();
}
}
}
添加回答
举报