Java 异步流上的多个操作

Java 异步流上的多个操作,java,asynchronous,stream,inputstream,Java,Asynchronous,Stream,Inputstream,我正在接收一个我想保存到光盘的文件,该文件具有最高优先级。但是我想与另外两个操作“分割”/“共享”这个流 到目前为止,我的方法是拥有一个主流,可以创建从主流中的缓冲区读取的子流 如果这是一种合适的方法,我需要一些方法来确定子流在流中的位置。我该怎么做还是这是解决我主要问题的更好方法 如果I/O不是您的瓶颈,您可以使用多线程写入文件 下面的代码只是一个示例: /** * @author lichengwu * @version 1.0 * @created 2013-01-08 12:11

我正在接收一个我想保存到光盘的文件,该文件具有最高优先级。但是我想与另外两个操作“分割”/“共享”这个流

到目前为止,我的方法是拥有一个主流,可以创建从主流中的缓冲区读取的子流


如果这是一种合适的方法,我需要一些方法来确定子流在流中的位置。我该怎么做
还是这是解决我主要问题的更好方法

如果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
        }
    }
}
}
/**
*@作者李成武
*@version 1.0
*@2013-01-08上午12:11创建
*/
公共类多写{
私有静态最终整数大小=1024*1024*1024;
ExecutorService exec=Executors.newFixedThreadPool(5);
公开作废开始(){
最终文件源=新文件(“”);
long size=source.length();
最终文件存储=新文件(“”);
用于(长位置=0;位置<尺寸;位置=位置+尺寸){
exec.execute(新写任务(源、存储、位置));
}
}
公共类WriteTask实现可运行{
私有最终文件存储;
私有最终文件源;
私人最终多头头寸;
公共写任务(文件源、文件存储、长位置){
this.store=商店;
这个位置=位置;
this.source=源;
}
公开募捐{
试一试{
RandomAccessFile in=新的RandomAccessFile(源,“r”);
//锁店
RandomAccessFile out=新的RandomAccessFile(存储,“rw”);
FileChannel=out.getChannel();
文件锁;
while(true){
试一试{
锁定=通道.tryLock(位置、大小、错误);
打破
}捕获(例外e){
//对付
}
}
寻找(位置);
寻找(位置);
字节[]数据=新字节[大小];
in.读取(数据);
输出。写入(数据);
//释放
锁定。释放();
channel.close();
out.close();
in.close();
}捕获(IOE异常){
//对付
}
}
}
}

我怀疑有更好的方法,但我不清楚你的瓶颈是什么。是您的磁盘驱动器使您的速度变慢,还是您希望避免的用于生成输出或系统调用的CPU?您是否需要能够在更新文件时读取流,还是可以在更新后读取文件内容?如果其他消费者短期内无法跟上您获取数据的速度,该怎么办?我还没有做任何测量。但我想完成的不是将文件写入光盘,然后再读取。因此,现在我检索文件并将其保存到光盘,然后执行操作。我想在将数据保存到光盘的同时执行这些操作。除非您知道问题所在,否则任何解决方案都可能使问题变得更糟,而不是更好。你有a)鉴定并衡量你的问题是什么b)针对该问题创建解决方案。c) 重新测试以确保它改善了您的问题。创建一个没有问题要解决的解决方案只会增加复杂性,毫无益处。我明白你的意思。但问题对我来说很清楚。我不想在不需要的时候读取光盘。数据已经通过内存一次,我想在第一次进入内存时读取数据。