[英]Efficient copy from one file to another
我正在用Java构建一个系统,该系统必须将文件的子集复制到另一个文件中(不一定要复制到文件的开头)。 即我有以下参数:
File srcFile, File dstFile, long srcFileOffset, long dstFileOffset, long length
多个线程可能正在从同一个源文件读取并同时写入同一个目标文件(尽管偏移量不同),因此我需要该过程具有线程安全性(即,防止在线程处于运行状态时在文件中寻找其他线程)写入/读取)。
您将如何实施? 我应该使用RandomAccessFile还是Java NIO? 我需要获得哪种锁? 例如,RandomAccessFile-instance是否自动获取文件的系统范围内的锁定,还是我需要单独保留该锁定?
编辑:看起来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();
}
}
您只需在srcFile上打开FileInputStream,然后跳过(srcFileOffset)并从那里读取。 但是要以一定的偏移量写入目标文件,您将需要RandomAccessFile。
至于锁定,您可以使用单例从文件读取/写入并同步对象上的读取/写入方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.