java.io.StringReader.read()(Java 8)在String的末尾返回意外字符

时间:2016-11-16 12:56:11

标签: java string stringreader

此问题导致以下代码摘录中的无限循环:

    public static final List<String> extractTags(String source, Integer nTags) {

    List<String> tags = new ArrayList<>();

    try (StringReader stringReader = new StringReader(source)) {
      String tag = "";
      char c;
      while ((c = (char) stringReader.read()) >= 0 && tags.size() < nTags) {
        switch (c) {
        case '<':
          tag = "";
          break;
        case '>':
          tags.add(tag);
          break;
        default:
          tag = tag + c;
          break;
        }
      }
    } catch (IOException e) {
    } finally {
      return tags;
    }
  }

如果使用以下参数调用: source =“trash” nTags = 2

使用调试器我意识到在字符串完全迭代后,read()方法永远返回char'\ uFFFF'65535。所以我的问题是为什么?

谢谢!

2 个答案:

答案 0 :(得分:4)

因为stringReader.read()正在为流末尾返回-1,但是您将它转换为char,这是Java中唯一的无符号数据类型。因此,代替-1,您将获得65535作为流的结尾,因此永远不会破坏while循环。

您可能希望将读取的内容转换为内部循环,而不是在while条件下。

答案 1 :(得分:0)

使其细化 countTags(String source); =>使用此方法仅计算标签。 extractTags(String source)=>识别您的标签是什么或什么不是您的标签,然后提取标签或提取什么标签。

重建不带标签的字符串/在提取时重建。.不需要StringBuilder / StringReader。

一些有趣的事情:您可以在开始时和结束时执行string.length,然后减去以在extract方法中找到标记数,从而获得计数。

您也不需要while循环

对于您的实际问题:您可能希望调查需要转义的字符。