我正在用Java编写服务器应用程序。要从套接字读取我有:
line = in.readLine();
其中in
是BufferReader
实例,因此我可以从套接字流中读取字符串。
如何改变这一点以将我的程序用于非面向行的协议,其中每个应用程序级消息的结尾被特定的字符串终止,例如, %
,而不是换行符?
答案 0 :(得分:5)
在循环中使用read()
方法,直到字符为%
。在每个字符处,将其附加到StringBuilder
。
StringBuilder builder = new StringBuilder();
for (int i = reader.read(); i >= 0; i = reader.read()) {
char c = (char) i;
if (c == '%') {
break; // or consume the current builder, and recreate a new one
}
else {
builder.append(c);
}
}
答案 1 :(得分:1)
虽然我自己实际上没有使用过这个,但我记得很久以前在文档中看过这个类,看起来它确实可以做你想做的事情,即使它的功能可能有点过分仅仅是分离输入。
http://docs.oracle.com/javase/6/docs/api/java/io/StreamTokenizer.html
这样您就可以直接将BufferedReader
包裹在StreamTokenizer
之后,然后将其设置为将%
字符识别为空格字符,并将其他每个字符识别为普通/字母字符。然后,您可以在标记生成器上重复调用nextToken
,当它返回TT_WORD
时,您可以通过sval
属性获取令牌。
最后,根据JB Nizet的回复,你可能更容易实现这一点。