Java .io. stringreader .read() (Java 8)在字符串的末尾返回意外字符



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

    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;
    }
  }

如果用以下参数调用:来源= "垃圾"nTags = 2

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

谢谢!

因为stringReader.read()为流结束返回-1,但您将其转换为char,这是Java中唯一的无符号数据类型。所以你得到的不是-1,而是65535作为流的结束,因此永远不会打破while循环。

在循环中,而不是在while条件下,您可能希望将读取到的内容强制转换为char

使其粒度化countTags(字符串源);=>使用此方法仅计数标签。extractTags(字符串源)=>确定你的标签是什么或你的标签不是什么,然后提取标签或提取标签不是什么。

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

一些有趣的东西:你可以做字符串。长度当你开始&当你结束并减去在提取方法中找到标签的数量,这将给你计数。

你也不需要这个

的while循环

对于您的实际问题:您可能想要查看需要转义的字符。

相关内容

  • 没有找到相关文章

最新更新