最近在看《JAVA编程思想》,其中System.in迷惑了我。
首先看下System的源码(jdk1.6)
[code="java"]
public final static InputStream in = nullInputStream();
private static InputStream nullInputStream() throws NullPointerException {
if (currentTimeMillis() > 0) {
return null;
}
throw new NullPointerException();
}
[/code]
疑问1: 通过源码可以看到 System.in是System类的一个静态属性,其为InputStream,初始时通过nullInputStream()方法返回,但是return null?
疑问2: 写了一个测试类,通过语句System.out.println(System.in); 打印出结果为:java.io.BufferedInputStream@1fb8ee3,说明System.in是BufferedInputStream类型,如何实现的?
疑问3: 如果线程执行到System.in.read();时,未在console输入内容,线程将挂起,直到console有输入内容。如何实现的?
[code="java"]
/**
注意上面的注释:initializeSystemClass().
[code="java"]
private static void initializeSystemClass() {
props = new Properties();
initProperties(props);
sun.misc.Version.init();
FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
setIn0(new BufferedInputStream(fdIn));
setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));
setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true));
[/code]
这里的in 不就是个buffer类型的了。咋都不看方法的注释呢!~~
疑问1: currentTimeMillis()这个方法是System类的一个静态不可变方法他产生一个当前的毫秒数 所以上面的if判断成立。这个毫秒其实就是自1970年1月1日0时起的毫秒数
忘了第三个问题了:
[code="java"]
/**
FileInputStream
or FileOutputStream
to最终用的是这个类,当然最后调的还是native方法。但这里有一句话能回答你的问题。an open socket .底层是个socket啊。。那有阻塞不就是很正常了吗?