计算机程序最一般的模型可以归纳为:输入、计算和输出。输入和输出是人机交互的重要手段,一个设计合理的程序应该首先允许用户根据具体的情况输入不同的数据,然后经过程序算法的计算处理,最后以用户容易接受的方式输出结果。java用流的概念来表示输入输出。java提供的输入输出功能十分强大而灵活,美中不足的是起初看上去输入输出的代码可能并不是很简洁,因为往往需要创建许多不同的流对象。在java类库中,I/O(输入和输出)部分的内容有很多,这点看下JDK的java.io包就知道了,它涉及的主要关键类有:InputStream、OutputStream、Reader、Writer和File等。当熟悉了java的输入输出流以后,读者会发现其实java的I/O流使用起来还是挺方便的,因为java已经对各种I/O流的操作做了相当程度的简化处理。
流(Stream)是对数据传送的一种抽象,当预处理数据从外界"流入"程序中时,就称之为输入流,相反地,当程序中的结果数据"流到"外界(如显示屏幕、文件等)时,就称之为输出流,换句话说,输入或输出其实是从程序的角度来讲的。InputStream和OutPutStream类是用来处理字节(8位)流的,Reader和Writer类是用来处理字符(16位)流的,而File类则是用来处理文件的。细心地读者可能会问:那么以前用过的System.out.println()和System.in.read()又算哪一种呢?事实上,它们是java提供的标准输入输出流。其中System为java自动导入java.lang中的一个类,他含有3个内建好的静态流对象:err、in和out.分别用于标准错误输出/标准输入和标准输出,在程序中可以直接使用3个流对象,如调用它们的Println()或read()方法来实现标准输入输出功能。默认情况下,标准输入in用于读取键盘输入,而标准输入out和标准错误输出err用于把数据输出至启动程序运行的终端屏幕上。需要说明的是,in属于InputStream对象,而err和out则属于PrintStream(由OutPutStream间接派生)对象,因此,在这个层面上可以认为标准输入输出是属于字节流的范畴,它们的数据处理是以字节为单位,但是,java提供的Decorator(包装)技术又允许用户将标准输入输出流转换为双字节为处理单位的字节流,所以,字节流和字符流只是相对的概念,他们之间也可以相互的转换。另外,利用System类提供的一下静态方法,还可以把标准输入输出的数据流重定向到一个文件或者另一个数据流中。
public static void setIn(InputStream in)
public static void setOn(PrintStream out)
public static void setErr(PrintStream err)
标准错误输出只用来输出错误信息,它即使被重定向到其他地方,也仍然会在控制台输出显示,而标准输入和输出则用于交互式的I/O处理。