IO流

IO流的分类

  • 按流的方向进行分类(以内存为参照)
  1. 输入流
    向内存中输入数据,这个过程叫
  2. 输出流
    从内存向外输出数据,这个过程叫
  • 按数据读取方式进行分类
  1. 字节流
    一次读取一个字节,八个bit,这种流是万能的,能读取任何类型的文件,包括文本、图片、声音、视频等。。。
  2. 字符流
    一次读取一个字符,这种流是为了方便读取普通文本文件存在的,不能读取图片、声音、视频等文件,只能读取纯文本文件(word类型的都不行,因为word有格式)

Java中四大IO流类

  1. java.io.InputStream
  2. java.io.OutputStream
  3. java.io.Writer
  4. java.io.Reader

Tips:java中的类,凡是以Stream结尾的都为字节流,凡是以Writer/Reader结尾的都是字符流

所有的流都实现了java.io.Closeable接口中的close()方法,也就是说所有的流都是可关闭了。
所有的输出流都实现了java.io.Flushable接口中的flush()方法,所有的输出流都是可刷新的。

IO流作为内存和硬盘之间数据传输的管道,用完要记得关闭,一直开启会耗费资源。
flush()方法的作用是将在数据传输完成时,将管道中剩余的数据强行输出,清空管道。!防止有数据没有传输完毕留存在管道中,造成数据丢失。

以FileInputStream类作为例子分析流的读取过程

  1. 首先,创建FileInputStream字节输入流对象
    使用FileInputStream(String path)这个构造方法创建对象,参数为文件的路径,可以是绝对路径也可以是相对路径。

(相对路径是从当前路径开始的,IDEA中的当前路径为整个工程的根,project下的目录)
绝对路径:idea会将绝对路径中的‘\’变成‘\\’,因为一个‘\’表示转义,也可以使用'/'作为目录的分隔。

  1. 其次,调用该类的read()方法读取文件中的字节
  • 不带参数的read()一次读一个字节,其返回值为读取到的字节本身,int类型(例如a——>92),当文件读取完时,再read()返回-1。(这种方式效率太低,我们一般不用)
  • read(byte[] bytes)这种读取的方式是一次读取byte.lenth长度的字节,其返回值为读取到的字节数。当文件读完时,再调用此方法读返回-1。

    我们需要一个byte[]数组,一般来说创建的byte[]数组大小为整个文件的字节数比较好,能一次读取完。可以使用流对象的available(),这个方法返回文件中还未读取的字节数。

以FileOutputStream类作为例子分析流的写入过程

  1. 首先,创建FileOutputStream字节输出流对象
  • FileOutputStream(String path)使用这种构造方法创建的输出流在写入文件时,会将原来文件中的内容清空
  • FileOutputStream(String path,boolean append)使用这种构造方法,如果append传入一个true时,则将输出的内容追加在文件中,不会将其覆盖,append==false,则与上面情况一样。
  1. 调用writer()方法输出文件。参数与输入流的reader类似。
  2. 输出字符串,需要使用字符串的getBytes()方法,将字符串转换为字节数组。

其他的流类

  • 文件输入输出字符流(使用方法与字节输入输出流类似)
  1. FileWriter:其writer()方法可以直接写入字符串。writer("我是中国人!");
  2. FileReader
  • *自带缓冲区的流(自带缓冲区,不需要借助byte[]或char[]了)
  1. BufferedReader(readLine()方法,直接读一行(原文本中的换行符不读),返回值为String类型)
  2. BufferedWriter
  3. BufferedInputStream
  4. BufferedOutputStream

这种流的构造方法参数为一个流,参数中的流称之为节点流,自身流称为包装流/处理流
在关闭流的时候,只需要关闭包装流即可,节点流已经封装关闭了。

  • *转换流
  1. InputStreamReader:将InputStream转为Reader,字节流转换为字符流
  2. OutputStreamWriter:将OutputStream转为Writer,字节流转换为字符流

其构造方法参数为一个字节流

  • 数据流
  1. DataInputStream
  2. DataOutputStream
  • 标准输出流
  1. PrintWriter
  2. PrintOutStream
    System.out返回值类型就是PrintOutStream
  • 对象专属流
  1. ObjectOInputStream
  2. ObjectOutputStream

注意:

用完流一定要记得关闭

输出流最后一定要记得刷新

posted @ 2021-12-06 14:11  这个世界会好的  阅读(40)  评论(0编辑  收藏  举报