嗨,这是我在这里的第一个问题,所以如果是因为某些原因不遵守规则,结果是重复的,或者其他什么的,请告诉我(不是说我有任何声誉损失)。
无论如何,我实际上对StringReader提供的这个类有两个问题。首先,StringReader.ready()到底是做什么的?我是否可以将其用作while循环中的条件,以便在字符串结束时循环终止?读取java文档没有多大帮助(或者我可能误解了它们的意思“如果保证下一个read()不阻塞输入,则返回True”)
更新:
很抱歉,很明显,我错过了read()返回的部分-1当字符串结束时。不管怎么说,我的问题仍然是准备好的部分。我以为这应该是检查字符串是否结束的那个?
任何帮助都将不胜感激,谢谢!
导致问题的片段:
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);
}发布于 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(),它没有阻塞。合同得到满足。
发布于 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()。相反,应该将代码的第一行更改为:
int ch;
while (true)
{
ch = text.read();
if (ch < 0) break;
...发布于 2014-05-06 04:13:10
如果您查看StringReader.ready()方法的源代码,您可以找到答案。StringReader是为使用读取器读取String而编写的装饰类。您只能通过传入字符串参数来创建StringReader实例。
StringReader.ready()总是返回true,并且只有在实例化时传递的String为null时才抛出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");
}https://stackoverflow.com/questions/23485668
复制相似问题