【问题标题】:java stream parallel read/writejava流并行读/写
【发布时间】:2014-11-16 15:32:41
【问题描述】:

我想从 Internet 流式传输音频文件并播放它。 我正在使用此代码:

int readBytes = 0;
    byte[] audioBuffer = new byte[this.EXTERNAL_BUFFER_SIZE];

    readBytes = in.read(audioBuffer, 0, audioBuffer.length);
    while (readBytes != -1) {
        readBytes = in.read(audioBuffer, 0, audioBuffer.length);
        if (readBytes >= 0) {
            dataLine.write(audioBuffer, 0, readBytes);
        }
    }

这样做的问题是,当 Stream 正在读取时,它不是在写入。因此,音乐不会每隔几秒钟播放很短的时间。 所以我想知道是否有一种方法可以让流同时从输入流中读取并写入数据线,这样写入就不会暂停读取。

【问题讨论】:

    标签: java io stream copy


    【解决方案1】:

    是的,有。当您尝试一次做任何 2 件事或更多时,您正在寻找多线程。

    这不是你可以在 5 分钟内学会的东西,所以你应该阅读它here

    例如:

    public class Printer implements Runnable{
    
     String name;
     public Printer(String name){
     this.name=name;
     }
     public void run(){
    
      while(true){
       System.out.println("i am thread"+name);
      //in your case read or write bytes to dataline here;
      }
    }
    public static void main(String[] args){
     Printer print1= new Printer("a");
     Printer print2 = new Printer("b");
     new Thread(print1).start();
     new Thread(print2).start();
     }
    }
    

    这将继续以没有定义的顺序打印“我是线程 a”“我是线程 b”,因为它没有同步,因此它可以给出 aabbbbaabaababa 而不是 ababababab,但想法是它们都在同时运行。

    这只是一个关于如何使用线程的粗略示例,它缺少同步和安全性以及在处理线程之前应该阅读的内容。

    【讨论】:

    • 感谢您的回答。是的,我熟悉线程。所以我认为没有办法在java api中构建来做到这一点。
    • 如果你正在寻找一个 api 来做流媒体,我会推荐 vlcJ 或 xuggler ,我以前很幸运。 vlcJ 是我能想到的最简单的 API。
    【解决方案2】:

    我不确定这是否可能,但dataLine.write(audioBuffer, 0, in.read()); 是否按您的意愿行事?

    【讨论】:

    • 虽然这看起来是同时完成的……但并非如此。程序将执行 in.read() 然后将答案传递给 write() 。这是基本的编程逻辑。跨度>
    猜你喜欢
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多