java - 在Java中播放时将mp3文件写入磁盘

标签 java javasound bufferedinputstream jlayer

我有一个应用程序使用 JLayer/BasicPlayer 库通过 HTTP 播放远程 MP3 文件。我想将播放过的 mp3 文件保存到磁盘而不重新下载它们。

这是使用基于 JLayer 的 BasicPlayer 播放 MP3 文件的代码。

String mp3Url = "http://ia600402.us.archive.org/6/items/Stockfinster.-DeadLinesutemos025/01_Push_Push.mp3";
URL url = new URL(mp3Url);
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);

BasicPlayer player = new BasicPlayer();
player.open(bis);
player.play();

如何将 mp3 文件保存到磁盘?

最佳答案

为了避免必须通过字节两次,您需要将来自连接的输入流包装在一个过滤器中,该过滤器将读取的任何数据写入输出流,即一种“三通管输入流”。这样的类自己编写并不难,但您可以使用 Apache Commons IO 库中的 TeeInputStream 来节省工作量。

Apache Commons IO:http://commons.apache.org/io/
TeeInputStream javadoc:http://commons.apache.org/io/apidocs/org/apache/commons/io/input/TeeInputStream.html

编辑:概念验证:

import java.io.*;

public class TeeInputStream extends InputStream {
    private InputStream in;
    private OutputStream out;

    public TeeInputStream(InputStream in, OutputStream branch) {
        this.in=in;
        this.out=branch;
    }
    public int read() throws IOException {
        int read = in.read();
        if (read != -1) out.write(read);
        return read;
    }
    public void close() throws IOException {
        in.close();
        out.close();
    }
}

使用方法:

...
BufferedInputStream bis = new BufferedInputStream(is);
TeeInputStream tis = new TeeInputStream(bis,new FileOutputStream("test.mp3"));

BasicPlayer player = new BasicPlayer();
player.open(tis);
player.play();

关于java - 在Java中播放时将mp3文件写入磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9289854/

相关文章:

java - FileInputStream 找不到文件

java为实现接口(interface)的类设置类路径

java - 如何解决 java.lang.OutOfMemoryError : Java heap space without increasing the heap memory size

java - 如何从 MIDI 序列获取音符开/关消息?

java - 清除Java应用程序的缓存

java - 使用 java 获取 HTML 内容的最快方法是什么?

java - 如何正确使用生成的Web Service? ( Apache CXF)

java - Java 中测量耗时的最快方法

java - JAAD 阻止其他供应商工作