I/O流之系统标准输入与输出

我们经常使用System.out.print()语句,输出相关内容,但是,你真正了解这条语句的具体实现过程吗?

实现过程:在System类内部定义了一个out静态成员变量,out变量又调用了print()方法,该方法来自于PrintStream类

其实,System类内部定义了三个静态的成员变量:

1. 标准输出(显示器) : public final static PrintStream out
2. 错误输出 : public final static PrintStream err
3. 标准输入(键盘):public final static InputStream in 

(1)系统输出

系统输出一共有两个成员变量:out、err,并且这两个成员变量表示的都是PrintStream类的对象

  1. out输出的是希望用户能看到的内容
  2. err输出的是不希望用户看到的 (内容为红色字体)

范例:

public class Test {
    public static void main(String[] args) throws Exception {
        try{
      Integer.parseInt("abc");}
      catch(Exception e){
            System.out.println(e);
            System.err.println(e);
        }
    }
}

输出结果:

由于System.out是PrintStream的实例化对象,而PrintStream又是OutputStream的子类,所以可以直接使用
System.out直接为OutputStream实例化,这个时候的OutputStream输出的位置将变为屏幕。

范例:使用System.out为OutputStream实例化

public class Test {
    public static void main(String[] args) throws Exception {
        OutputStream out = System.out ;
        out.write("hello word".getBytes());
}
}

(2)系统输入

System.in对应的类型是InputStream,而这种输入流指的是由用户通过键盘进行输入(用户输入)

java本身并没有直接的用户输入处理,如果要想实现这种操作,必须使用java.io的模式来完成

范例:利用InputStream实现数据输入

public class Test {
    public static void main(String[] args) throws Exception {
        InputStream in = System.in ;
        byte[] data = new byte[1024] ;
        System.out.print("请输入信息:");
        int temp = in.read(data) ; // 数据读取到字节数组中
        System.out.println("输出内容为 :" +new String(data,0,temp)) ;
}
}

以上的程序有一个致命的问题,核心点在于:开辟的字节数组长度固定,如果现在输入的长度超过了字节数组长度,那么只能够接收部分数据。这个时候是由于一次读取不完所造成的问题,所以此时最好的做法是引入内存操作流来进行控制,这些数据先保存在内存流中而后一次取出。

范例:引入内存流

public class Test {
    public static void main(String[] args) throws Exception {
        InputStream in = System.in ;
        ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
        byte[] data = new byte[10] ;
        System.out.print("请输入信息:");
        int temp = 0 ;
        while((temp = in.read(data)) != -1) {
            bos.write(data,0,temp) ; // 保存数据到内存输出流中
                  // 这里面需要用户判断是否输入结束
            if (temp < data.length) {
                break ;
            }
        }
        in.close() ;
        bos.close() ;
        System.out.println("输出内容为 :" +new String(bos.toByteArray())) ;
}
}
发布了50 篇原创文章 · 获赞 39 · 访问量 8291

猜你喜欢

转载自blog.csdn.net/Racheil/article/details/89300374
今日推荐