ディスクに保存したいファイルを受け取りました。これが最も優先されます。しかし、このストリームを他の 2 つの操作で「分割」/「共有」したいと考えています。
これまでの私のアプローチは、MainStream のバッファーから読み取るサブストリームを作成できる MainStream を持つことでした。
これが適切なアプローチである場合、サブストリームがストリーム内のどこにあるかを判断する何らかの方法が必要です。どうやってやるの?
それとも、私の主な問題を解決するためのより良い方法ですか?
ディスクに保存したいファイルを受け取りました。これが最も優先されます。しかし、このストリームを他の 2 つの操作で「分割」/「共有」したいと考えています。
これまでの私のアプローチは、MainStream のバッファーから読み取るサブストリームを作成できる MainStream を持つことでした。
これが適切なアプローチである場合、サブストリームがストリーム内のどこにあるかを判断する何らかの方法が必要です。どうやってやるの?
それとも、私の主な問題を解決するためのより良い方法ですか?
I/O がボトルネックでない場合は、マルチスレッド書き込みファイルを使用できます。
以下のコードは単なる例です。
/**
* @author lichengwu
* @version 1.0
* @created 2013-01-08 12:11 AM
*/
public class MultiWrite {
private static final int SIZE = 1024 * 1024 * 1024;
ExecutorService exec = Executors.newFixedThreadPool(5);
public void start() {
final File source = new File("");
long size = source.length();
final File store = new File("");
for (long position = 0; position < size; position = position + SIZE) {
exec.execute(new WriteTask(source, store, position));
}
}
public class WriteTask implements Runnable {
private final File store;
private final File source;
private final long position;
public WriteTask(File source, File store, long position) {
this.store = store;
this.position = position;
this.source = source;
}
public void run() {
try {
RandomAccessFile in = new RandomAccessFile(source, "r");
// lock part of store
RandomAccessFile out = new RandomAccessFile(store, "rw");
FileChannel channel = out.getChannel();
FileLock lock;
while (true) {
try {
lock = channel.tryLock(position, SIZE, false);
break;
} catch (Exception e) {
// deal with
}
}
out.seek(position);
in.seek(position);
byte[] data = new byte[SIZE];
in.read(data);
out.write(data);
// release
lock.release();
channel.close();
out.close();
in.close();
} catch (IOException e) {
// deal with
}
}
}
}