Android Socket ReadLine但具有不同的终结器

时间:2014-05-26 15:16:43

标签: java android sockets readline

在客户端,我试图读取,直到出现自定义终止字节。解冻是(/ ffff)

现在readline()读取,直到缓冲区收到/ r,/ n或两者,

但如果我想要一个自定义终止字节怎么办?

1 个答案:

答案 0 :(得分:1)

没有标准方法可以重新定义行终止符。

正如您在BufferedReader的源代码中所看到的,'\ r''\ n'行终结符是硬编码的。

您可以使用BufferedReader来源,创建自己的类并替换其中的行终止符。

另一种解决方案是创建帮助类,正如我在我的一个项目中所做的那样:

public class StreamSplitter {
    private InputStream st;
    private Charset charset;

    /**
     * Construct new stream splitter.
     * @param st input stream
     * @param charset input stream charset
     */
    public StreamSplitter(InputStream st, Charset charset) {
        this.st = st;
        this.charset = charset;
    }

    // ... skip

    /**
     * Read stream until the specified marker is found. 
     * @param marker marker
     * @return 
     * @throws IOException
     */
    public String readUntil(String marker) throws IOException {
        StringBuilder res = new StringBuilder();
        if (!readUntil(marker, res)) {
                return null;
        }
        return res.toString();
    }

    /**
     * Read stream until the specified marker is found.
     * @param marker marker
     * @param res output 
     * @return <code>true</code> if marker is found, <code>false</code> if end of stream is occurred
     * @throws IOException
     */
    public boolean readUntil(String marker, StringBuilder res) throws IOException {
        byte[] markerBytes = marker.getBytes(charset);

        int b;
        int n = 0;

        while ((b = st.read()) != -1) {
            byte bb = (byte)b;

            if (markerBytes[n] == bb) {
                n++;
                if (n == markerBytes.length) {
                    return true;
                }
            }
            else {
                 if (n != 0 && res != null) {
                    for (int nn = 0; nn < n; nn++)
                        res.append((char)markerBytes[nn]);
                }

                if (res != null)
                    res.append((char)bb);
                n = 0;
            }
        }
        return false;
    }

    // ... skip 

}