zoukankan      html  css  js  c++  java
  • io流

    1.流:流是一个抽象的概念,可以借助水流来理解,水流传输的是水,具有方向性,流传输的是二进制数据,同样也具有方向性,所以有输入流和输出流。二进制是因为现在的计算机都是依托于冯.诺依曼架构的。

    2.流的分类:

    (1)数据的流向:分为输入流和输出流

                                输入流:把数据从其他设备读取到程序中的流。

                                输出流:把数据从程序中写出到其他设备上的流。

    (2)数据的类型:分为字节流和字符流

                                字节流:以字节为单位(byte),读写数据的流。

                                字符流:以字符为单位(char),读写数据的流。

     

     

     3.流的结构:和io相关的流,都派生自四个抽象的父类型:

         >InputStream   所有字节输入流的抽象父类型

         >OutputStream    所有字节输出流的抽象父类型

         >Reader     所有字符输入流的抽象父类型

         >Writer    所有字符输出流的父类型

    有Stream则代表的是字节流,其他的是字符流。

     

     

     一般情况下:流会具备起码的三个特点:

    -是输入还是输出

    -是字节流还是字符流

    -流向的目的地

    实现类:

    ByteArrayInputStream:以字节的形式从byte数组中读取数据

    FileInputStream:以字节的形式从文件中读取数据

    FileOutputStream:以字节的形式 将数据写出到文件中

    ......

    字节输入流中大体上都会有重载的三个read方法

       1.read()每次读取一个字节,返回值是本次读取的字节值

       2.read(byte[ ] b)每次读取多个字节(最多读取b.length个字节),并存放到指定的字节数组b中,返回值是本次一共读取了多少个字节

       3.read(byte[ ] b,int off,int len)每次读取多个字节,并存放到指定的字节数组b中,返回值是本次一共读取了多少个字节,同时可以指定从数组的什么位置开始存放,以及一次要存放的数量。

    同理字节输出流也有三个重载的write方法。

    注意事项:在使用完流后一定要记得关闭流(输入流输出流),输出流要记得在输出后先刷新再关闭。

           关流操作:逐层关流,先关最外层的。

    在管道流中,输入要与输出进行关联,关联后输出流把数据写到管道里,输入流从管道里读取数据。

    在数据的输入输出中,一般来说,读取时使用无参的read方法,一个字节一个字节或者一个字符一个字符的读,终止条件为返回值=-1,写出是一般用三参的write方法  (个人建议)。

    节点流 (转换流属于处理流)处理流

    节点流:可以【直接】读取某一个地方的数据,或者【直接】把数据写入到某一个地方。

    处理流:没有直接操作文件的功能,他可以包装节点流,让节点流去操作文件内容。

    转换流:将字节流转换成字符流,Java中没有将字符流转换成字节流的。

    例如:抽象父类:InputStream 。实现类FileInputStream 转换流 InputStreamReader。转换后的字符流:FileReader

           常用的节点流 :

    父  类  InputStream OutputStream Reader Writer 

    文  件  FileInputStream FileOutputStrean FileReader FileWriter 文件进行处理的节点流 

    数  组  ByteArrayInputStream  ByteArrayOutputStream  CharArrayReader  CharArrayWriter 

    管  道  PipedInputStream  PipedOutputStream  PipedReader  PipedWriter 对管道进行处理的节点流 

          常用处理流(关闭处理流使用关闭里面的节点流): 

    父 类  InputStream OutputStream Reader Writer 

    缓冲流  BufferedImputStrean BufferedOutputStream BufferedReader BufferedWriter ----需要父类作为参数构造,增加缓冲功能,避免频繁读写硬盘,可以初始化缓冲数据的大小,由于带了缓冲功能,所以就写数据的时候需要使用flush方法。缓存功能其实就是先将数据放入一个数组中,然后一次性的把该数组输出到目的地,提高了效率,若不用缓存功能,则是将字节或者字符读一个放一个,这样效率比较低。 注意:因为BufferedWriter功能较少,所以一般都用printWriter,该实现类中有一个两个参数的重载方法,第二个参数可以选择是否自动刷新,详情参照API。

    转换流  InputStreamReader  OutputStreamWriter-  要inputStream 或OutputStream作为参数,实现从字节流到字符流的转换 。

    数据流  DataInputStream DataOutputStream -提供将基础数据类型写入到文件中,或者读取出来,为什么要有这个流呢?看这样的分析,如果没有这种流的话,有一个long,本身只占8个字节,如果我要写入到文件,需要转成字符串,然后在转成字符数组,那空间会占用很多,但是有了这种流之后就很方便了,直接将这8个字节写到文件就完了。是不是既节约了内存空间有让程序写起来更加方便简单了。写倒是很简单,但是读取的时候就注意了,读取的时候最好必须保证和写入的数据类型相符,否则可能会出现乱码的现象,比如你写入的是一个long类型的数,而读的时候却读的是int类型的,int类型4个字节32位,long类型8个字节64位,当你读的时候就只会读到高32位,所以并不会得到你想要的数据。

     

  • 相关阅读:
    (转) 网络流之最大流算法(EdmondsKarp)
    如何在面试中发现优秀程序员
    Java中Volatile关键字详解
    比AtomicLong还高效的LongAdder 源码解析
    AtomicInteger的用法
    synchronized详解
    Java内部锁的可重用性(Reentrancy)
    Java可重入锁
    关于原生javascript的this,this真是个强大的东东
    js时间戳怎么转成日期格式
  • 原文地址:https://www.cnblogs.com/jamers-rz/p/13603556.html
Copyright © 2011-2022 走看看