Java StringReader ready()

时间:2014-05-06 03:53:21

标签: java stringreader

嗨,这是我在这里的第一个问题,所以如果由于某种原因不遵守规则,结果是重复或其他什么,请亲切地告诉我(并不是说我有任何声誉可以丢失)

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

更新

很抱歉显然,当字符串结束时,我错过了read()返回-1的部分。无论如何,我的问题仍然是ready()部分。我认为这应该是检查字符串是否已经结束的那个?

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

Link to the actual source code

导致问题的代码段:

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

    }

3 个答案:

答案 0 :(得分:3)

  

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

如果下一次读取不会阻止,则一般合同返回true。如果StringReader总是如此。

  

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

没有。一个简单的测试表明。你应该循环,直到read()返回-1。请注意,您必须将read()的结果存储到int才能生效。

  

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

没有'某种方式'关于它。这就是它应该做的。

  

这是什么意思?

这意味着流的结束。在这种情况下,您已经阅读了StringReader.

中的所有字符
  

同样,Java文档没有帮助。

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

  

我猜这意味着字符串已经终止

无需猜测。这显然是Javadoc所说的。

  

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

不,不。 Javadoc没有说ready()在流末尾返回false。您对该声明没有任何保证。在这种情况下,它返回true,你调用read(),它没有阻止。合同满意。

答案 1 :(得分:0)

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

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

现在假设所有字符都已通过连接传输,因此连接已关闭,然后ready()仍将返回true,因为它知道它不需要等待下一个字符(因为空无一人)。现在当你拨打read()时,它也会立即返回,但这次是-1,意味着不再有字符。

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

int ch;

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

    ...

答案 2 :(得分:0)

如果查看StringReader.ready()方法的源代码,可以找到答案。 StringReader是一个装饰者类,用于使用阅读器阅读String。您只能通过在。

中传递String参数来创建StringReader实例

StringReader.ready()将始终返回true,如果实例化时传递的IOException为空,则仅抛出String

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