Java 中的“流”是一种抽象的概念,也是一种比喻,就好比水流一样,水流是从一端流向另一端的,而在 Java 中的“水流”就是数据,数据会从一端“流向”另一端。

     根据流的方向性,我们可以将流分为输入流和输出流,当程序需要从数据源中读入数据的时候就会开启一个输入流,相反,写出数据到某个数据源目的地的时候也会开启一个输出流,数据源可以是文件、内存或者网络等。

      1.什么是字节流?

      字节流的基本单位为字节(Byte),一个字节通常为 8 位,它是用来处理二进制(数据)的。字节流有两个基类:​​InputStream​​​(输入字节流)和 ​​OutputStream​​(输出字节流)。

  常用字节流的继承关系图如下图所示:

文件写入的6种方法_字节流

 

 

其中 ​​InputStream​​​ 用于读操作,而 ​​OutputStream​​ 用于写操作。

2.什么是字符流

字符          流的基本单位为 Unicode,大小为两个字节(Byte),它通常用来处理文本数据。字符流的两个基类:​​Reader​​​(输入字符流)和 ​​Writer​​(输出字符流)。

 

3.流的分类

       流可以根据不同的维度进行分类,比如可以根据流的方向进行分类,也可以根据传输的单位进行分类,还可以根据流的功能进行分类,比如以下几个。

 

① 按流向分类

  • 输出流:​​OutputStream​​​ 和​​Writer​​ 为基类。
  • 输入流:​​InputStream​​​ 和​​Reader​​ 为基类

② 根据传输数据单位分类

  • 字节流:​​OutputStream​​​ 和​​InputStream​​ 为基类。
  • 字符流:​​Writer​​​ 和​​Reader​​ 为基类。

③ 根据功能分类

  • 字节流:可以从或向一个特定的地方(节点)读写数据。
  • 处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。

PS:我们通常是以传输数据的单位来为流进行分类。

4.写文件的6种方法

写入文件的方法主要源于字符流 ​​Writer​​​ 和输出字节流 ​​OutputStream​​ 的子类,如下图所示:

文件写入的6种方法_字节流_02

 

 以上标注✅号的类就是用来实现文件写入的类,除此之外,在 JDK 1.7 中还提供了 ​​Files​​ 类用来实现对文件的各种操作,接下来我们分别来看。

 

方法 1:FileWriter

​FileWriter​​​ 属于「字符流」体系中的一员,也是文件写入的基础类,它包含 5 个构造函数,可以传递一个具体的文件位置,或者 ​​File​​​ 对象,第二参数表示是否要追加文件,默认值为 ​​false​​ 表示重写文件内容,而非追加文件内容(关于如何追加文件,我们后面会讲)。

 

方法 2:BufferedWriter

 

​BufferedWriter​​​ 也属于字符流体系的一员,与 ​​FileWriter​​​ 不同的是 ​​BufferedWriter​​ 自带缓冲区,因此它写入文件的性能更高

 

小知识点:缓冲区

缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。

缓冲区的优势以文件流的写入为例,如果我们不使用缓冲区,那么每次写操作 CPU 都会和低速存储设备也就是磁盘进行交互,那么整个写入文件的速度就会受制于低速的存储设备(磁盘)。但如果使用缓冲区的话,每次写操作会先将数据保存在高速缓冲区内存上,当缓冲区的数据到达某个阈值之后,再将文件一次性写入到磁盘上。因为内存的写入速度远远大于磁盘的写入速度,所以当有了缓冲区之后,文件的写入速度就被大大提升了。

 

方法 3:PrintWriter

          无论是 ​​PrintWriter​​​ 还是 ​​BufferedWriter​​​ 都必须基于 ​​FileWriter​​ 类来完成调用。

方法 4:FileOutputStream

方法 5:BufferedOutputStream

 

​BufferedOutputStream​​​ 属于字节流体系中的一员,与 ​​FileOutputStream​​ 不同的是,它自带了缓冲区的功能,因此性能更好,它的实现代码如下:

 

方法 6:Files

接下来的操作方法和之前的代码都不同,接下来咱们就使用 JDK 7 中提供的一个新的文件操作类 ​​Files​​ 来实现文件的写入。

​Files​​ 类是 JDK 7 添加的新的操作文件的类,它提供了提供了大量处理文件的方法,例如文件复制、读取、写入,获取文件属性、快捷遍历文件目录等,这些方法极大的方便了文件的操作