
如图所示,System这个类继承于Object类,它被final修饰所以是个最终类,不能被继承。

System这个类中都是静态方法,其中这几个方法都是我们日常常用的。
当我们使用System.out.println()或者System.out.print()这个输出语句想必大家都很熟悉吧?
当我们输入System.out的时候,其实是创建的PrinftStream这个流对象。

看图,PrintStream这个类是OutputStream的孙子,其次它是一个实体类,实现了两个接口。

这个就是我们经常使用的一些方法。
println()源码:
public void println() {
//调用newLine()方法
newLine();
}
//到这里来了,执行try里面的内容。
private void newLine() {
try {
//加锁。
synchronized (this) {
//旁段流是否关闭
ensureOpen();
//填充内容,并且换行
textOut.newLine();
//文本和字符输出,调用这个方法给即将要存入的数据留储存位置
textOut.flushBuffer();
charOut.flushBuffer();
//这个就是判断是不是自动刷新,如果是就直接把数据存入硬盘,否则需要手动刷新存入。
if (autoFlush)
out.flush();
}
}
//异常处理不用管
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}
//判断流是否关闭源码
private void ensureOpen() throws IOException {
//如果流关闭了,就是null,进去,抛出异常Stream closed:流已关闭。
if (out == null)
throw new IOException("Stream closed");
}
print()源码:
public void print(String s) {
//判断传入字符串存不存在;
if (s == null) {
s = "null";
}
//调用writre方法
write(s);
}
//和println方法大同小异。
private void write(String s) {
try {
synchronized (this) {
ensureOpen();
textOut.write(s);
textOut.flushBuffer();
charOut.flushBuffer();
if (autoFlush && (s.indexOf('\n') >= 0))
out.flush();
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}

System.in的返回值是InputStream(这个流是字节输入流的祖宗);
这个是inputStream流的读数据的方法;
在我们使用Scanner类的时候,我们需要System.in这个函数的返回值也就是InputStream这个流
来让我们看看Scanner类的源码吧!
//Scanner的构造方法
public Scanner(InputStream source) {
//创建一个字符输入流对象
this(new InputStreamReader(source), WHITESPACE_PATTERN);
}
所以Scanner的底层是一个字符输入流。
我写不下去了,再见。
711

被折叠的 条评论
为什么被折叠?



