我想看一看java中的System.in(out)的实现代码,该怎麽找?

justajavaboy 2004-10-17 08:24:54
我用的是JDK1.4版本的。
我已经知道并且找到了JAVA.I/O包的源代码,可是光凭这个无法过多了解System.in(out),System.in(out)的实现代码在JDK的哪里?

另外,在JAVA.I/O包中出现了许多System.funcName()的函数,这些函数是JDK1.4的系统调用的函吗?在哪里可找到它们的源代码?
...全文
199 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
debug148 2004-10-17
  • 打赏
  • 举报
回复
ding
边城狂人 2004-10-17
  • 打赏
  • 举报
回复
安装了JDK后,你在JDK目录下可以发现一个 src.zip 或者 src.jar,不管是什么扩展名,都是 zip 格式的压缩包,解压开后在 java/lang 里可以找到 System.java,这就是源码。

源码中有如下对 in, out 和 err 的申明:
public final static InputStream in = nullInputStream();
public final static PrintStream out = nullPrintStream();
public final static PrintStream err = nullPrintStream();

大约在 1014 行左右可以发现对 nullInputSteram 和 nullPrintStream 的定义如下:
private static InputStream nullInputStream() throws NullPointerException {
if (currentTimeMillis() > 0)
return null;
throw new NullPointerException();
}

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

也许这里看不出来为什么要这样做,所以我们看上面的注释:
/**
* 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().
*/

注释中说 in, out 和 err 都必须初始化为 null,之后由 initializeSystemClass() 设置值,所以再去阅读这个方法,大概在 1029 行左右。其中有这样几句:

setIn0(new BufferedInputStream(fdIn));
setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));
setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true));

setIn0,setOut0 和 setErr0 这三个方法都是 native 的,所以不知道是如何实现的,也不需要管了。不过可以看出来,in 是 BufferedInputStream,而 out 和 err 都是由 PrintSteam 包装的 BufferedOutputStream。
trumplet 2004-10-17
  • 打赏
  • 举报
回复
真正涉及操作系统的,可能还是在虚拟机里,类库源码涉及不到。
trumplet 2004-10-17
  • 打赏
  • 举报
回复
System类在java.lang里,你看看吧,反正我看不明白。
justajavaboy 2004-10-17
  • 打赏
  • 举报
回复
src.zip的包中有好多,我找到了I/O包,那System库在哪里?

我有点担心,如何从键盘中读入二进制数据等内容恐怕要涉及到一些操作系统的代码吧?我用的是windowsxp,java是不是只是简单的调用了那些操作系统的函数啊?那我觉得还能阅读。
trumplet 2004-10-17
  • 打赏
  • 举报
回复
源码里的:

public final class System {
......
public final static InputStream in = nullInputStream();
public final static PrintStream out = nullPrintStream();
......
private static InputStream nullInputStream() throws NullPointerException {
if (currentTimeMillis() > 0)
return null;
throw new NullPointerException();
}

private static PrintStream nullPrintStream() throws NullPointerException {
if (currentTimeMillis() > 0)
return null;
throw new NullPointerException();
}
......

}
tongbo 2004-10-17
  • 打赏
  • 举报
回复
好好看看 API;JAVA 的类库是JDK安装目录下src.zip的包。

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧