Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java在开始时似乎忽略了很多数据_Java_Shoutcast - Fatal编程技术网

Java在开始时似乎忽略了很多数据

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("") ? "/" :

当我试图在Java中读取一个冰冷的流时,很多mp3数据似乎在开始时被忽略了,因为第一个元数据块来得太早了。这是我的密码:

    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作为参数传递。哦,不,但是现在流不再播放了。。。