文件写入的6种方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
⽂件写⼊的6种⽅法
Java 中的“流”是⼀种抽象的概念,也是⼀种⽐喻,就好⽐⽔流⼀样,⽔流是从⼀端流向另⼀端的,⽽在 Java 中的“⽔流”就是数据,数据会从⼀端“流向”另⼀端。
根据流的⽅向性,我们可以将流分为输⼊流和输出流,当程序需要从数据源中读⼊数据的时候就会开启⼀个输⼊流,相反,写出数据到某个数据源⽬的地的时候也会开启⼀个输出流,数据源可以是⽂件、内存或者⽹络等。
1.什么是字节流?
字节流的基本单位为字节(Byte),⼀个字节通常为 8 位,它是⽤来处理⼆进制(数据)的。
字节流有两个基类:InputStream(输⼊字节流)
和OutputStream(输出字节流)。
常⽤字节流的继承关系图如下图所⽰:
其中InputStream⽤于读操作,⽽OutputStream⽤于写操作。
2.什么是字符流
字符流的基本单位为 Unicode,⼤⼩为两个字节(Byte),它通常⽤来处理⽂本数据。
字符流的两个基类:Reader(输⼊字符流)和Writer(输出字符流)。
3.流的分类
流可以根据不同的维度进⾏分类,⽐如可以根据流的⽅向进⾏分类,也可以根据传输的单位进⾏分类,还可以根据流的功能进⾏分类,⽐如以下⼏个。
①按流向分类
输出流:OutputStream和Writer为基类。
输⼊流:InputStream和Reader为基类
②根据传输数据单位分类
字节流:OutputStream和InputStream为基类。
字符流:Writer和Reader为基类。
③根据功能分类
字节流:可以从或向⼀个特定的地⽅(节点)读写数据。
处理流:是对⼀个已存在的流的连接和封装,通过所封装的流的功能调⽤实现数据读写。
PS:我们通常是以传输数据的单位来为流进⾏分类。
4.写⽂件的6种⽅法
写⼊⽂件的⽅法主要源于字符流Writer和输出字节流OutputStream的⼦类,如下图所⽰:
以上标注 号的类就是⽤来实现⽂件写⼊的类,除此之外,在 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 添加的新的操作⽂件的类,它提供了提供了⼤量处理⽂件的⽅法,例如⽂件复制、读取、写⼊,获取⽂件属性、快捷遍历⽂件⽬录等,这些⽅法极⼤的⽅便了⽂件的操作。