2014-11-01 58 views
0

java.util.Scanner笔记的Javadoc在于:为什么Javadoc for java.util.Scanner不能描述它阻塞的条件?

“这两种hasNextnext方法可以阻塞等待进一步的输入是否一个hasNext方法块具有到其相关联next方法是否会阻止无连接”

在各has*next*方法的描述,它也注意到,它们“在等待要扫描的输入可能阻塞”。然而,尽管这些知识是使用这些方法的先决条件,但页面并没有提到这些方法可能阻止的条件。

因此,我的问题是,为什么Javadoc没有描述扫描仪的方法可能会阻塞的条件?是否存在遗漏这些信息的正当理由,还是仅仅是文档质量差的情况?

回答

2

现在你已经提到它,它非常含糊。虽然,解释它将意味着深入实施细节。

Scanner主要依赖于基础流。 Scanner#next()将抛出一个NoSuchElementException每当底层流的read()方法在阅读返回-1

(执行概要)

public void next() { 
    if(needInput) 
     readInput(); 
    else 
     throwException(); 
} 

void readInput() { 
    int n = 0; 
    try { 
      n = underlyingStream.read(buf); 
    } catch (IOException ioe) { 
      lastException = ioe; 
      n = -1; //error happened 
    } 

    if (n == -1) 
      underlyingStreamClosed = true; 
} 

void throwException() { 
    if (underlyingStreamClosed) 
      throw new NoSuchElementException(); 
    else 
      throw new InputMismatchException(); 
} 

例如,让我们看看InputStream没有扫描仪。 InputStream#read()块时,它被称为,直到数据的用武之地。使用一个InputStreamSystem.in会导致您的Scanner阻止,因为InputStream#read()块(实现本机代码编写,所以如果你真的感兴趣,你可以找到它位于的文件并自己查看implmenetation)。这适用于延伸InputStream的任何流,但不会覆盖read()以更改其实施。例如,ObjectOutputStream,DataOutputStream

FileInputStream,但是,确实会覆盖read()(也有本地实现)。调用FileInputStream#read()将返回-1当您尝试阅读,但没有什么(虽然文档确实说这种方法可能会阻止,我还没有碰到的情况下)。这纯粹是由于你实际上不应该担心的FileInputStream#read()的实现。

长话短说:它依赖于基础流。熟悉你的流,你就会被设置。我看到它的方式,如果你真的担心哪些数据流阻塞,看看实现(我发现当的子类不是覆盖read()方法,他们倾向于阻止),自己测试它们,或看在线。文档应该可能告诉你,虽然就像我说的,我还没有碰到过FileInputStream#read()被阻止的时刻(有人可以帮助我重现这种情况,如果确实如文档所述的那样)

+0

这是否意味着,如果从System.in读取,'NoSuchElementException'永远不会被抛出,就好像标准输入是空的那么扫描器将永远阻塞? – LogicChains 2014-11-01 05:32:43

+0

我不完全确定你的意思。请详细说明; “*如果从System.in读取,将永远不会抛出异常*”令我困惑 – 2014-11-01 05:37:14

+0

这应该是'NoSuchElementException永远不会被抛出'。如果没有更多的标记可用,Scanner.next()会抛出一个NoSuchElementException异常,但是如果它阻塞,则意味着它会等待标记可用,因此不会抛出NoSuchElementException异常。 – LogicChains 2014-11-01 05:45:35