首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java () StringReader

Java () StringReader
EN

Stack Overflow用户
提问于 2014-05-06 03:53:21
回答 3查看 770关注 0票数 1

嗨,这是我在这里的第一个问题,所以如果是因为某些原因不遵守规则,结果是重复的,或者其他什么的,请告诉我(不是说我有任何声誉损失)。

无论如何,我实际上对StringReader提供的这个类有两个问题。首先,StringReader.ready()到底是做什么的?我是否可以将其用作while循环中的条件,以便在字符串结束时循环终止?读取java文档没有多大帮助(或者我可能误解了它们的意思“如果保证下一个read()不阻塞输入,则返回True”)

更新:

很抱歉,很明显,我错过了read()返回的部分-1当字符串结束时。不管怎么说,我的问题仍然是准备好的部分。我以为这应该是检查字符串是否结束的那个?

任何帮助都将不胜感激,谢谢!

链接到实际源代码。

导致问题的片段:

代码语言:javascript
复制
while (text.ready()) {

        // Updating stringBuffer, using some sort of 'rolling hash' (or is
        // it
        // indeed rolling hash?)
        stringBuffer.deleteCharAt(0);
        stringBuffer.append((char) next);

        // The next character that follows the sequence of k characters
        next = text.read();

        // store the string form of the buffer to avoid rebuilding the
        // string for the next few checks
        String key = stringBuffer.toString();

        if (hashmap.containsKey(key)) {
            // If the hash map already contain the key, retrieve the array
            asciiArray = hashmap.get(key);
        } else {
            // Else, create a new one
            asciiArray = new int[128];
        }
        System.out.println(next);

        // Error checking on my side only, because some of the text sample I
        // used contains some characters that is outside the 128 ASCII
        // character, for whatever reason
        if (next > 127) {
            continue;
        }

        // Increment the appropriate character in the array
        asciiArray[next]++;
        // Put into the hash map
        hashmap.put(key, asciiArray);

    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-06 04:06:05

首先,StringReader.ready()到底是做什么的?

一般约定是,如果下一次读取不会阻塞,则返回true。在StringReader的情况下,这总是正确的。

我是否可以将其用作while循环中的条件,以便在字符串结束时循环终止?读取java文档没有多大帮助(或者我可能误解了它们的意思“如果保证下一个read()不阻塞输入,则返回True”)

不是的。一个简单的测试就会发现。您应该循环直到read()返回-1。请注意,必须将read()的结果存储到int中才能工作。

在我构造的while循环中,方法StringReader.read()以某种方式返回-1。

不知道怎么回事。这就是它应该做的。

这是什么意思?

它意味着溪流的终结。在本例中,您已经读取了StringReader.中的所有字符

同样,Java文档也没有提供帮助。

相反地。Javadoc清楚地指出,read()返回“读取的字符,如果到达流的末尾,则返回-1”。

我猜这意味着字符串已经结束了。

没必要猜测。这就是Javadoc明确地说的。

但是,这意味着ready()方法没有执行它应该做的事情!

不,它没有。Javadoc没有说ready()在流结束时返回false。你对那份供词没有任何授权令。在本例中,它返回true,您调用了read(),它没有阻塞。合同得到满足。

票数 3
EN

Stack Overflow用户

发布于 2014-05-06 04:12:51

为了帮助您更好地理解这个概念,假设您的StringReader正在以每秒一个字符的速度从一个TCP连接读取字符序列.

如果然后在while循环中调用StringReader.read(),那么每次read()都会等待1秒才返回一个字符。如果您不希望您的代码挂在那里等待字符进入,这可能是一个问题。这时,StringReader.ready()变得方便了。如果它返回false,那么这意味着对read()的调用可能导致代码阻塞(等待),而如果ready()返回true,则意味着对read()的调用将立即返回一个值(字符或-1),而不会阻塞/等待。

现在假设所有字符都已经通过连接传输了,因此连接已经关闭,那么ready()仍然会返回true,因为它知道它不需要等待下一个字符(因为没有)。现在,当您调用read()时,它也会立即返回,但这次使用的是a -1,意味着不再有字符。

现在让我们回到您的代码。对于您想要实现的目标,您不需要使用ready()。相反,应该将代码的第一行更改为:

代码语言:javascript
复制
int ch;

while (true)
{
    ch = text.read();
    if (ch < 0) break;

    ...
票数 0
EN

Stack Overflow用户

发布于 2014-05-06 04:13:10

如果您查看StringReader.ready()方法的源代码,您可以找到答案。StringReader是为使用读取器读取String而编写的装饰类。您只能通过传入字符串参数来创建StringReader实例。

StringReader.ready()总是返回true,并且只有在实例化时传递的String为null时才抛出String

代码语言:javascript
复制
 public boolean ready() throws IOException {
     synchronized (lock) {
        ensureOpen();
        return true;
     }
 }

 /** Check to make sure that the stream has not been closed */
 private void ensureOpen() throws IOException {
     if (str == null)
        throw new IOException("Stream closed");
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23485668

复制
相关文章

相似问题

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