在Java中播放时将mp3文件写入磁盘
我有一个应用程序使用JLayer/basiclayer库通过HTTP播放远程MP3文件。我想将播放的mp3文件保存到磁盘,而不重新下载它们 这是使用基于JLlayer的BasicLayer播放MP3文件的代码在Java中播放时将mp3文件写入磁盘,java,javasound,bufferedinputstream,jlayer,Java,Javasound,Bufferedinputstream,Jlayer,我有一个应用程序使用JLayer/basiclayer库通过HTTP播放远程MP3文件。我想将播放的mp3文件保存到磁盘,而不重新下载它们 这是使用基于JLlayer的BasicLayer播放MP3文件的代码 String mp3Url = "http://ia600402.us.archive.org/6/items/Stockfinster.-DeadLinesutemos025/01_Push_Push.mp3"; URL url = new URL(mp3Url); URLConnect
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文件保存到磁盘?您可以先使用
FileInputStream
将流写入磁盘。然后从文件中重新加载流。为了避免两次遍历字节,您需要将连接中的输入流包装在一个过滤器中,该过滤器将读取的任何数据写入输出流,即一种“T形管输入流”。这样的类自己编写并不困难,但是您可以使用ApacheCommons IO库中的teInputStream
来保存工作
BufferedInputStream in = new BufferedInputStream(is);
OutputStream out = new BufferedOutputStream(new FileOutputStream(new File(savePathAndFilename)));
byte[] buf = new byte[256];
int n = 0;
while ((n=in.read(buf))>=0) {
out.write(buf, 0, n);
}
out.flush();
out.close();
Apache Commons IO:TeInputStream javadoc: 编辑:概念验证:
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();
包装您自己的输入流
class myInputStream extends InputStream {
private InputStream is;
private FileOutputStream resFile;
public myInputStream(InputStream is) throws FileNotFoundException {
this.is = is;
resFile = new FileOutputStream("path_to_result_file");
}
@Override
public int read() throws IOException {
int b = is.read();
if (b != -1)
resFile.write(b);
return b;
}
@Override
public void close() {
try {
resFile.close();
} catch (IOException ex) {
}
try {
is.close();
} catch (IOException ex) {
}
}
}
和使用
InputStream is = conn.getInputStream();
myInputStream myIs = new myInputStream(is);
BufferedInputStream bis = new BufferedInputStream(myIs);