在Java中,从不同角度定义了输入输出流的分类。以内存作为流的方向基点,可将其分为输入流和输出流,流向内存的成为输入流,流出内存的成为输出流。从数据操作的最小单元来分类,可将其分为字节流和字符流。根据抽象程度分类,可将其分为节点流和处理流,处理流是连接到实际物理节点的节点流的封装,这样既可以不必去关注节点的来源(文件或者数组),用统一的方法去操作,又可以使用更加方面的方法来实现操作。南京Java培训机构
在学习中,本人对于输入输出流的总结归纳:
A. 字节流和字符流其实并没有本质的区别,无非是它们二者的操作单元不同。字节流的基类为InputStream和OutputStream,字符流的基类为Reader和Writer。它们所提供的读写方法一样,区别在于参数,需要对应流类型。
B. 输入流中的read系列方法是从输入流中读取数据的操作。空参数将返回所读取的字节(字符)。read方法中可以传入数组参数,数组的类型必须和流的数据类型相匹配,相当于一个竹筒,一次可读取最多等于数组容量的数据,并将所读数据装进数组中。
C. 输出流中的write系列方法是向输出流中写入数据的操作。方法中的参数可以是整型或字符型变量,也可以传入数组参数,数组的类型必须和流的数据类型相匹配,相当于一个竹筒,一次可写入最多等于数组容量的数据。特别地,字符型输出流的write方法可以传入字符串。
D. InputStream和OutputStream,Reader和Writer这四个类作为Java中输入输出流的抽象基类,并不能直接被初始化使用。Java中提供了一些继承了它们的类,用于实现具体的某种流操作。如:
E. 在Java虚拟机中可以通过exec方法执行其他的应用程序,并返回Proess对象。利用该对象的getErrorStream、getInputStream和getOutputStream方法可以分别获得子进程的错误流,输出流和输入流(方向是以程序角度为基点)。南京Java培训机构
F. RandomAccessFile类提供对文件的随机访问,程序可以直接跳转到文件的任何地方来读取数据。它内部提供了与字节流同法相同的读写方法,另外又加入了自由定位文件记录指针的方法seek。在读写操作时以字节为单位。在构造函数中还需加入一个mode参数由于制定读写权限。
G. 需要注意Scanner对象的使用。Scanner对象用于捕获输入,并将输入内容转换为字符串。南京Java培训机构
对于初学者来说一个容易忽略的地方是,需要区别节点流和处理流构造方法中参数的意义。节点流中,构造方法参数是要读取或者输出地物理节点,是“目的地”或者“始发地”,而处理流的构造函数参数是所要包装的处理流对象,包装之后的操作实际上是间接操作节点流,并未对被包装的节点流本身属性做修改。采用处理流包装后,可以不用管节点流的数据类型,而根据处理流的性质传递在节点流中不能传递的内容,例如Obj;同时还可以增加一些便于操作的方法,比如缓冲区。