嗨,这是我在这里的第一个问题,所以如果由于某种原因不遵守规则,结果是重复或其他什么,请亲切地告诉我(并不是说我有任何声誉可以丢失)
无论如何,我实际上对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);
}
答案 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
。您只能通过在。
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");
}