在客户端,我试图读取,直到出现自定义终止字节。解冻是(/ ffff)
现在readline()读取,直到缓冲区收到/ r,/ n或两者,
但如果我想要一个自定义终止字节怎么办?
答案 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
}