首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.io.StringReader.read() (Java8)在字符串末尾返回意外字符

java.io.StringReader.read() (Java8)在字符串末尾返回意外字符
EN

Stack Overflow用户
提问于 2016-11-16 12:56:11
回答 2查看 978关注 0票数 0

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

代码语言:javascript
复制
    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 =“杂质”nTags =2

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

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-16 12:59:04

因为stringReader.read()将返回流结束时的-1,但是您将它转换为char,这是Java中唯一的未签名数据类型。因此,与-1不同的是,您将获得流结束时的65535,因此永远不要中断while循环。

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

票数 4
EN

Stack Overflow用户

发布于 2018-08-30 15:51:53

使其成为细粒度的countTags(字符串源);=>只使用此方法来计数标记。extractTags( source) =>识别您的标记是什么,或者您的标记不是什么,然后提取标记或提取没有的标记。

在解压时重新生成不带标记的字符串/重新生成。不需要StringBuilder/StringReader。

一些有趣的事情:您可以在启动时执行string.length &在结束和减去提取方法中查找标记数,这将给出计数。

您也不需要while循环来实现这个

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40632722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档