【java基础】]IO流

IO流


概念:

         流的概念源于unix中管道(pipe)的概念,在unix中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备,外部文件等

         一个流,一定能够会有源和去向(目的地),他们可以是计算机内存的某些区域,也可以是磁盘文件,神这可以使internet上的某个URL(地址)




归类:

         IO流,大体解释就是input,output流,其间又有很多分类,我们用图表示一下

       


区分:

                图看上去,很简单,可是我们怎么来区分它们呢?

输入,输出流:

很简单,根据数据的走向来说(我们以程序为参考物),读取read的时候,数据由磁盘(或者是别的地方)走向程序,这时候,我们叫它输入流。而当我们通过程序写出什么数据(write)时候,数据由程序走向磁盘(或者是别的地方),我们叫它输出流。还可以这么说:在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。

字符流,字节流:

         程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。举个例子就是:像我们中国的汉字,一个汉字占两个字节,如果用字节流处理的话,打印出来就全是??????,因为不能打印半个字不是?所以我们就用字符流来处理。但是如果是音频文件,图片,歌曲用字节流挺好

节点流,处理流:

       按照流是否直接与特定的地方(如磁盘、内存、设备等)相连节点流:可以从或向一个特定的地方(节点)读写数据。如FileReader处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。(可参考晨阳师姐的博客:JavaI/O—梳理各种流


常用的各种流:     

常用的节点流 
  父 类: InputStream OutputStream Reader Writer 
  文 件 :*FileInputStream FileOutputStrean FileReader FileWriter 文件进行处理的节点流 
  数 组 :*ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter 对数组进行处                         理的节点流(对应的不再是文件,而是内存中的一个数组) 
  字符串 :*无  无 StringReader StringWriter 对字符串进行处理的节点流 
  管 道 :*PipedInputStream PipedOutputStream PipedReader PipedWriter 对管道进行处理的节点流 


常用处理流(关闭处理流使用关闭里面的节点流) 
  父 类:InputStream OutputStream Reader Writer 
  缓冲流: *BufferedImputStrean BufferedOutputStream BufferedReader BufferedWriter ----需要父类作为参                         数构造,增加缓冲功能,避免频繁读写硬盘,可以初始化缓冲数据的大小,由于带了缓冲功能,                        所以就写数据的时候需要使用flush方法咯 
  转换流 :*InputStreamReader OutputStreamWriter- 要inputStream或OutputStream作为参数,实现从字节                          流到字符流的转换 
  数据流 :*DataInputStream DataOutputStream -提供将基础数据类型写入到文件中,或者读取出来,为什                            么要有这个流呢?看这样的分析,如果没有这种流的话,有一个long,本身只占8个字节,如果                                 我要写入到文件,需要转成字符串,然后在转成字符数组,那空间会占用很多,但是有了这                                    种流之后就很方便了,直接将这8个字节写到文件就完了。。是不是既节约了内存空间有让                                       程序写起来更加方便简单了呐。写倒是很简单,但是读取的时候就注意了,根据读取的                                             数据类型,指针会往下移,所以你写的顺序必须要和读的顺序一致才能完成你正确的                                             需求。 
   对象流: *ObjectInputStream ObjectOutputStream
   打印流: *PrintStream,PrintWriter这类流在写入的时候有自动flush的功能,所以你不需要每打印一个东西都                      flush一次)
       (补充部分均来自网页上的资料)

总结

         通过对视频的理解,我认为 IO流里面的各种流其实是相互嵌套使用的,并没有严格的界限,例如:处理流连接已存在的流(节点流,处理流)之上,通过对数据的处理位程序提供更加强大的读写功能。他们之间是相辅相成的。

         除了IO流,java里面还有很多别的流,象什么文件流、缓冲流、转换流(转换数据类型),他们之间也会错综复杂的交互,来体现更为强大的功能,没有什么流是自己单独奋战的,组合使用,功能才会更加强大

原文地址:https://www.cnblogs.com/DoubleEggs/p/5747180.html