2012-02-15 112 views
1

我有一个使用JLayer/BasicPlayer库通过HTTP播放远程MP3文件的应用程序。我想将播放的mp3文件保存到磁盘而无需重新下载。在Java播放时将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文件保存到磁盘?

回答

3

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

阿帕奇百科全书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(); 
+0

开门见山,工作完全正常 - 谢谢! – nanoman 2012-02-16 07:44:29

0
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(); 
0

您可以先将流写入磁盘FileInputStream。然后从文件重新加载流。

0

裹你自己的InputStream

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);