2

ディスクに保存したいファイルを受け取りました。これが最も優先されます。しかし、このストリームを他の 2 つの操作で「分割」/「共有」したいと考えています。

これまでの私のアプローチは、MainStream のバッファーから読み取るサブストリームを作成できる MainStream を持つことでした。

これが適切なアプローチである場合、サブストリームがストリーム内のどこにあるかを判断する何らかの方法が必要です。どうやってやるの?
それとも、私の主な問題を解決するためのより良い方法ですか?

4

1 に答える 1

0

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
        }
    }
}
}
于 2013-01-07T16:38:36.003 に答える