黑马程序员技术交流社区

标题: 关于java IO问题 [打印本页]

作者: 王贺    时间: 2013-11-26 21:56
标题: 关于java IO问题
public static void main(String[] args) {
  // TODO Auto-generated method stub
  InputStream input = System.in;         
  System.out.println(input);
}
今天测试了一下System.in的输出
输出结果是java.io.BufferedInputStream@c17164
问一下是怎么初始化这个input的,为什么是输出上面的结果?

作者: 陪你等日出    时间: 2013-11-26 22:09
你这样写就等于是直接打印了input这个对象了,哥们是想将键盘输入的数据打印在控制台上吗?那应该用IO流的read()方法读取的,
  1. import java.io.*;
  2. class Demo
  3. {
  4.         public static void main(String[] args) throws IOException
  5.         {
  6.                 InputStream input = System.in;
  7.                 byte[] buf = new byte[1024];
  8.                 int len = input.read(buf);
  9.                 //打印键盘录入的数据到控制台
  10.                 System.out.println(new String(buf,0,len));
  11.                 input.close();
  12.         }
  13. }
复制代码

作者: 樊志伟    时间: 2013-11-26 22:43
同求,技术大牛们,来看看啊
作者: 樊志伟    时间: 2013-11-27 01:42
哥们,你这个问题得去追究源码了。
System.in是一个static的InputStream类对象。源码中是这么写的
  1. public final static InputStream in = null;
  2. public static void setIn(InputStream in) {
  3.         checkIO();
  4.         setIn0(in);
  5. }
  6. setIn0(new BufferedInputStream(fdIn));
复制代码

所以实际上,in的是一个BufferedInputStream对象,最后通过println打印的时候会调用如下的方法
  1. public void println(Object x) {
  2.         String s = String.valueOf(x);
  3.         synchronized (this) {
  4.             print(s);
  5.             newLine();
  6.         }
  7. }

  8. public static String valueOf(Object obj) {
  9.         return (obj == null) ? "null" : obj.toString();
  10. }
  11. public String toString() {
  12.         return getClass().getName() + "@" + Integer.toHexString(hashCode());
  13. }
复制代码

所以,到最后会打印出“类名@哈希值”的这种形式。

明白了么?
作者: 樊志伟    时间: 2013-11-27 10:31
版主~~~求加分~~~{:soso_e106:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2