Cheug's Blog

当前位置:网站首页 / JAVA / 正文

IO流

2019-04-14 / JAVA / 896 次围观 / 0 次吐槽 /

什么是IO流?

    IO流用来处理设备之间的数据传输

    Java对数据的操作是通过流的方式

    Java用于操作流的类都在IO

 

IO流分类

 按流向来分

    输入流InpuStream(读取数据)

    输出流OutStream(写数据)

 按操作类型分

    字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的

    字符流 : 字符流只能操作纯字符数据

 

Java中常用IO流的类

   字节流的抽象父类:

    InputStream 输入流

    OutputStream 输出流

   字符流的抽象父类:

    Reader 字符读取流

    Writer 字符写入流

字节流 

  InputStream

    InputStream抽象类,表示字节输入流,用于读数据。

    子类:

    AudioInputStream

    ByteArrayInputStream

    FileInputStream //文件输入流

    FilterInputStream 

    ObjectInputStream

    PipedInputStream

    SequenceInputStream

    StringBufferInputStream

  OutputStream

    OutputStream译为输出流

    OutputStream是一个抽象类,它用于往文件里写入内容

    子类:

                            ByteArrayOutputStream

                            FileOutputStream     //文件输出流

                            FilterOutputStream

                            ObjectOutputStream

                            OutputStream

                            PipedOutputStream 


字符流

    什么是字符流

        字符流是可以直接读写字符IO

        使用字符流从文件中读取字符时, 需要先读取到字节数据, 然后转为字符.

        使用字符流往文件写入字符时, 需要把字符转为字节再写入文件.

    字符流有两大派

        ReaderWriter,这两个类是抽象类,一般使用它们的子类

        FileReaderFileWriter

   FileReader的使用

        FileReader 用于读取字符,调用read方法的时候,是读取一个字符

        read方法的返回值是int,它是把char 转成int

        以后读纯文本文件,使用FileReader这个类,为什么?因为我们不用考虑乱码问题

  使用字符流的场景

                        1.使用FileReader读取字符

                                            原理:先读字节,把字节转成字符(byte -> char)

                        2.使用FileWriter写入字符

                                            原理:writer(String str),str 转成 字符数组 再转成 字节写入文件

                                                                  (string -> char[] -> char -> byte)

                                                        如果是读取文本文件,使用FileReader比较好,不考虑乱码问题

                                                        如果是写入文本文件,不建议使用FileWriter,直接使用FileOutputStream好一点

                                                        因为是字节直接写入文件,不需要过多数据类型转换


流的标准处理异常方式 

        jdk1.6以前的处理方式

            读写的操作放在try里面

            关闭流的操作放finally

    image.png



    jdk1.7以后的处理方式

                                    1.把流对象的声明放在try() 括号里面

                                    2.操作流【读写数据】的代码放在花括号里面

                                    3.这样写不用关闭流,java自动关闭流

                                    4.try的括号里的对象,必须是实现AutoCloseable的接口

     image.png

    image.png


带缓冲的字节输入输出流

     BufferedInputStream

        BufferedInputStream内置了一个缓冲区(数组)

        当使用BufferedInputStream读取一个字节时,BufferedInputStream会一次性从文件中读取8192(8Kb), 存在缓冲区中,直到缓冲区装满了, 才重新从文件中读取下一个8192个字节数组


    
BufferedOutputStream

        BufferedOutputStream也内置了一个缓冲区(数组)

        向流中写入字节时, 不会直接写到文件, 先写到缓冲区中直到缓冲区写满, BufferedOutputStream才会把缓冲区中的数据一次性写到文件里

SequenceInputStream 序列流

    序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时,

        将从被整合的第一个流开始读, 读完一个之后继续读第二个, 以此类推

            image.png

image.png

image.png

对象操作流

    ObjectOutputStream

                    这个类是将一个对象写入文件

                    如果使用这个类写入对象,这个对象需要序列化

                    序列化就是让这个对象实现一个Serializable接口

                    如果没实现Serializable接口,会抛异常NotSerializableException

                    对象写入文件时,乱码没有关系,取出来正确就行了

 

    ObjectInputStream

      这个类是从文件中读取对象


打印流

    PrintStream 打印字节流

                System.out就是一个PrintStream, 其默认向控制台输出信息

                该流可以很方便的将对象的toString()结果输出, 并且自动加上换行

    PrintWriter 打印字符流

     这个流是向文件打印信息,也就是将打印的内容写入文件

        image.png

        image.png

标准输入输出流

   System.inInputStream, 标准输入流, 默认可以从键盘输入读取字节数据

   System.outPrintStream, 标准输出流, 默认可以向Console中输出字符和字节数据

随机访问流

   RandomAccessFile类不属于流,是Object类的子类。

   但它融合了InputStreamOutputStream的功能。

   支持对随机访问文件的读取和写入。


数据输入输出流

   DataInputStream, DataOutputStream可以按照基本数据类型大小读写数据

   例如按Long大小写出一个数字, 写出时该数据占8字节.

   读取的时候也可以按照Long类型读取, 一次读取8个字节.


Powered By Cheug's Blog

Copyright Cheug Rights Reserved.