是否可以强制扫描仪返回空字符串?

时间:2014-03-22 13:46:01

标签: java java.util.scanner

我有一个套接字,我需要从中读取文本通信。每个命令都以\ 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

1 个答案:

答案 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();