我有一个套接字,我需要从中读取文本通信。每个命令都以\ r \ n序列结束。我正在使用带有分隔符的Scanner,如下所示:
Scanner scanner = new Scanner(socket.getInputStream());
scanner.useDelimiter("\r\n");
String tmp = scanner.next();
但是如果它只找到\ r \ n,我希望它返回空字符串,例如,这个输入:
\r\nSometext\nMoretext\r\n
应该使用两个next()
来读取,第一个应该返回空字符串""
,第二个应该返回Sometext\nMoretext
。
正如您所看到的,我在每个令牌中允许\n
,这就是使用readLine()
无法工作的原因。
现在,对于此输入,第一个next()
返回Sometext\nMoretext
,忽略第一个\r\n
。是否可以强制它返回空字符串,或者有没有办法检测它是否跳过一个\r\n
?
答案 0 :(得分:0)
是的,您可以通过扩展和定制扫描程序类。
你必须写下:
class MyScanner extends Scanner {
@Override
public String next() {
String ret = super.next();
if (ret.conatins("\r\n"); ret = "";
return ret;
}
}
在您的主要课程中,您必须使用MyScanner
<强>更新强>
正如有人所说,Scanner是最后一堂课,你不能做我建议的。但你可以像这样制作一个包装类:
class MyScanner {
Scanner scanner;
String[] toClean;
public void setToClean(String[] toClean) {
this.toClean=toClean;
}
public MyScanner(InputStram in) {
scanner = new Scanner(in);
}
public String next() {
String ret=scanner.next();
if(Arrays.asList(this.toClean).conatins(ret) ret ="";
return ret;
}
}
在您的调用者类中,您可以将其用作:
MyScanner mys = new MyScanner(socket.getInputStream());
String tmp=mys.next();
mys.setToClean({"bad-word","\n"});
String tmpClean=mys.next();