Чтобы избежать необходимости проходить через байты дважды, необходимо обернуть входной поток из соединения в фильтр, который записывает любые данные, считываемые в выходной поток, то есть в виде «входного потока тройника».Такой класс не так уж сложно написать самостоятельно, но вы можете сохранить работу, используя TeeInputStream
из библиотеки ввода-вывода Apache Commons.
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();