读书人

Java io 中关于System.in的一个小疑点

发布时间: 2013-12-04 17:21:02 作者: rapoo

Java io 中关于System.in的一个小问题


public class test {
public static void main(String[]args) throws Exception{
InputStream in = System.in;
System.out.println(in);
}
}


跟踪源代码发现:
System.in 就是public final static InputStream in = nullInputStream();
而nullInputStream();的源代码是:

private static InputStream nullInputStream() throws NullPointerException {
if (currentTimeMillis() > 0) {
return null;
}
throw new NullPointerException();
}

显然,不出意外是返回null,且System.in 不是native!
为什么System.out.println(in);输出的不是null而是java.io.BufferedInputStream@c17164 ?
---------------
菜鸟求教 !
[解决办法]
我用的是java7,代码跟你的不太一样

private static native void registerNatives();
static {
registerNatives();
}

这里面调用了setIn或setIn0
[解决办法]
请看上面的注释
    /**
* The following two methods exist because in, out, and err must be
* initialized to null. The compiler, however, cannot be permitted to
* inline access to them, since they are later set to more sensible values
* by initializeSystemClass().
*/
private static InputStream nullInputStream() throws NullPointerException {
if (currentTimeMillis() > 0) {
return null;
}
throw new NullPointerException();
}

[解决办法]
在initializeSystemClass()通过native方法初始化的In
[解决办法]
版主正解 又长见识了

读书人网 >J2SE开发

热点推荐