Java在开始时似乎忽略了很多数据
当我试图在Java中读取一个冰冷的流时,很多mp3数据似乎在开始时被忽略了,因为第一个元数据块来得太早了。这是我的密码:Java在开始时似乎忽略了很多数据,java,shoutcast,Java,Shoutcast,当我试图在Java中读取一个冰冷的流时,很多mp3数据似乎在开始时被忽略了,因为第一个元数据块来得太早了。这是我的密码: sock = new Socket(url.getHost(), (url.getPort() == -1 ? 80 : url.getPort())); OutputStream out = sock.getOutputStream(); String req = "GET " + (url.getPath().equals("") ? "/" :
sock = new Socket(url.getHost(), (url.getPort() == -1 ? 80 : url.getPort()));
OutputStream out = sock.getOutputStream();
String req = "GET " + (url.getPath().equals("") ? "/" : url.getPath()) + " HTTP/1.0\r\nIcy-MetaData: 1\r\nConnection: keep-alive\r\n\r\n";
out.write(req.getBytes());
BufferedInputStream buffer = new BufferedInputStream(sock.getInputStream());
BufferedReader read = new BufferedReader(new InputStreamReader(buffer));
String line = "";
String beginning = "";
while(!beginning.equals("icy-metaint:")) {
line = read.readLine();
try {
beginning = line.substring(0, 12);
} catch (StringIndexOutOfBoundsException exc) {
}
}
String metaintstr = line.substring(12);
metaint = Integer.valueOf(metaintstr);
while (!line.equals("")) {
line = read.readLine();
}
in = new MetadataInputStream(buffer, metaint);
我的MetadataInputStream代码如下:
public class MetadataInputStream extends InputStream {
private InputStream in;
private int count;
private int metaint;
private String meta;
private MetadataChangeListener listen;
public MetadataInputStream(InputStream iin, int mmetaint) {
in = iin;
metaint = mmetaint;
count = 0;
}
public int read() throws IOException {
if (count == metaint) {
count = 0;
int length = in.read() * 16;
System.err.println(length);
byte[] info = new byte[length];
in.read(info, 0, length);
meta = new String(info);
if (listen != null) {
listen.metadataChanged(meta);
}
}
count++;
int res = in.read();
return res;
}
public String getMetaData() {
return meta;
}
public void addMetadataListener(MetadataChangeListener llisten) {
listen = llisten;
}
}
但是,这是最“神奇”的事情,播放流效果很好!这是怎么回事?当你说“很多数据”丢失时。。。可能是
BufferedReader
每次读取一行时缓冲的数据量吗?通常,将输入流封装在类似于InputStreamReader
的东西中,然后直接从输入流中读取是个坏主意。非常感谢!问题是缓冲的数据确实丢失了。现在我更改了MetadataInputStream代码,使其使用读取器而不是InputStream,并将BufferedReader作为参数传递。哦,不,但是现在流不再播放了。。。