gpt4 book ai didi

java - 从一个文件高效复制到另一个文件

转载 作者:行者123 更新时间:2023-11-30 01:39:43 25 4
gpt4 key购买 nike

我正在用Java构建一个系统,它必须将一个文件的子集复制到另一个文件中(不一定复制到文件的开头)。 IE。我有以下参数:

文件 srcFile、文件 dstFile、长 srcFileOffset、长 dstFileOffset、长长度

多个线程可以同时从同一个源文件读取并写入同一个目标文件(尽管具有不同的偏移量),因此我需要该进程是线程安全的(即防止其他线程在文件中查找)线程正在写入/读取)。

您将如何实现这一点?我应该使用 RandomAccessFile 还是 Java NIO?我需要获取什么样的锁?例如。 RandomAccessFile 实例是否会自动获取文件的系统范围锁定,还是我需要单独保留该锁定?

编辑:看起来randomAccessFile.getChannel().tryLock()获取了系统范围的锁,但它是由VM而不是调用线程持有的。因此,如果我使用它,那么我还需要获取线程的锁(或者实际上是两个锁,因为我需要锁定源文件和目标文件)。

最佳答案

我编写了一个小测试代码。似乎在 WinXP 上工作没有问题:

import java.io.RandomAccessFile;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MultiRAF {
public static void main(String[] args) throws Exception {
RandomAccessFile raf = new RandomAccessFile("testraf.dat", "rw");
raf.setLength(4096);
raf.close();
ExecutorService exec = Executors.newCachedThreadPool();
for (int k = 0; k < 4; k++) {
final int offset = k * 1024;
final int kid = k;
exec.submit(new Runnable() {
public void run() {
try {
RandomAccessFile raf = new RandomAccessFile(
"testraf.dat", "rw");
for (int j = 0; j < 100; j++) {
System.out.printf("%d accessing%n", kid);
byte[] data = new byte[1024];
for (int i = 0; i < data.length; i++) {
data[i] = (byte)i;
}
raf.seek(offset);
raf.write(data);
System.out.printf("%d done%n", kid);
}
raf.close();
} catch (Exception ex) {
System.err.printf("%d failed%n", kid);
ex.printStackTrace();
}

};
});
}
exec.shutdown();
}
}

关于java - 从一个文件高效复制到另一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1133678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com