如何在特定字符出现之前读取字符串

时间:2017-03-26 13:03:21

标签: java

我希望在满足某些特定条件的字符出现之前,从Reader读取字符串。我尝试了以下代码:

private boolean isSatisfying(int codePoint) {
  return codePoint == '@' || codePoint == '$';  // for example
}

public String read(Reader reader) {
  StringBuilder result = new StringBuilder();
  for (int codePoint = -1 ; (codePoint = reader.read()) != -1 ;) {
    if (isSatisfying(codePoint)) {
      break;
    }
    result.appendCodePoint(codePoint);
  }
  return result.toString();
}

它有效,但在执行read()后,reader的指针位于满足上述示例中的条件(@$)的字符处,而不是结果字符串的结尾。

我想将reader的指针保留在结果字符串的末尾,但是没有放回Reader指针的方法。 有什么好方法可以实现它吗?

3 个答案:

答案 0 :(得分:0)

在你的for循环条件中添加它之后设置你的codePoint:

public String read(Reader reader) {
  StringBuilder result = new StringBuilder();
  for (int codePoint = -1 ; codePoint ;) {
    if (isSatisfying(codePoint)) {
      break;
    }
    result.appendCodePoint(codePoint);
    codePoint = reader.read()) != -1;
  }
  return result.toString();
}

答案 1 :(得分:0)

您需要一个缓冲读卡器才能执行此操作。请参阅此处的文档:

https://docs.oracle.com/javase/8/docs/api/java/io/BufferedReader.html

答案 2 :(得分:0)

我只是使用继续而不是中断(结果字符串不包含特殊字符,但会处理整个文件)

public String read(Reader reader) {
  StringBuilder result = new StringBuilder();
  for (int codePoint = -1 ; (codePoint = reader.read()) != -1 ;) {
    if (isSatisfying(codePoint)) {
      continue;
    }
    result.appendCodePoint(codePoint);
  }
  return result.toString();
}

如果您不想处理整个文件,请按照中断进行处理,但修改返回行。

return result.toString().substring(0, result.toString().length()-1);