美文网首页程序员
Java 基础(四)| IO 流之使用文件流的正确姿势

Java 基础(四)| IO 流之使用文件流的正确姿势

作者: 灬佐手边 | 来源:发表于2020-07-10 10:21 被阅读0次
image.png

一、什么是 IO 流?
想象一个场景:我们在电脑上编辑文件,可以保存到硬盘上,也可以拷贝到 U 盘中。那这个看似简单的过程,背后其实是数据的传输。

数据的传输,也就是数据的流动。既然是流动也就会有方向,有入方向和出方向。举个上传文件的栗子,现在有三个对象,文件、应用程序、上传的目标地址(服务器)。简化的上传文件有两步:

应用程序读文件(此为入方向,文件读入到应用程序)
应用程序写文件(此为出方向,读完之后写到目标地址)
注意这个入和出是相对的,它相对于应用程序而言。如果相对于服务器而言,这个上传文件操作就是入方向,从应用程序读入。Java 中 I/O 操作主要是指使用 java.io 包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。
注意这个入和出是相对的,它相对于应用程序而言。如果相对于服务器而言,这个上传文件操作就是入方向,从应用程序读入。Java 中 I/O 操作主要是指使用 java.io 包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。

二、IO 流的分类
我不认同网络上很多 IO 流的图,他们只是简单的把 io 流分成字节流和字符流。这样的分类也不是说不好,只是太臃肿、难记。

先上一张我自己总结的 IO 留的思维导图,我先把它分成了节点流和处理流,节点流是直接接触数据源的,而处理流是出于各种目的在节点流的基础上再套一层的 IO 流。再按照操作类型,分成 8 个小类,然后才是字节、字符分类,最后才是输入、输出的分类。具体可以看以下思维导图 (可能不清晰,有需要的在后台回复 IO 流获取原思维导图)

根据数据的流向分为:输入流和输出流。

输入流 :把数据从其他设备上读取到内存中的流。
输出流 :把数据从内存 中写出到其他设备上的流。
根据数据的类型分为:字节流和字符流。

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

字符流 :以字符为单位,读写数据的流。 image.png
Java IO 流

IO 流要说明白需要好几篇才行,今天我们先复习文件流。

2.1 一切皆字节
所有的文件(包括图片、音乐、视频),都是字节。所以字节流可以传输任意文件数据。在操作流的时时,无论使用什么样的流对象,底层传输的始终为二进制数据。

2.2 什么叫文件流?
文件流也就是直接操作文件的流,文件流又分为字节流 (FileInputStream 和 FileOutputStream)和字符流(FileReader 和 FileWriter)。其中字节流可用于操作一切文件,而字符流只能用于操作文本文件。

三、使用文件字节流 image.png

字节输出流


image.png 字节输入流

3.1 FileOutputStream
java.io.FileOutputStream 类继承于 OutputStream 是文件输出流,用于将数据写出到文件。

构造方法:可用文件路径构造,也可创建 File 对象之后构造。

写出数据示例: image.png

3.2 FileInputStream
java.io.FileInputStream 类继承于 InputStream 是文件输入流,用于将数据从文件读出。

构造方法:可用文件路径构造,也可创建 File 对象之后构造。

读取数据示例: image.png

复制文件示例:


image.png
3.3 为什么字节流处理中文字符时会出现乱码?
首先明确一点:一个英文字母占一个字节,一个汉字占两个字节,所以当字节流读取字符流就会出现乱码或者显示不全。所以用字节流操作含有中文字符的文件时,要转换成字符流并指定编码格式才能防止乱码。(这点,后面转换流会复习到)

四、使用文件字符流
当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以 Java 提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。


image.png

字符输入流


image.png
字符输出流,写文件

4.1 FileReader
java.io.FileReader 类继承于 Reader 类,是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

构造方法:可用文件路径构造,也可创建 File 对象之后构造。

字符编码:字节与字符的对应规则。Windows 系统的中文编码默认是 GBK 编码表
字节缓冲区:一个字节数组,用来临时存储字节数据。
PS:有时候出现乱码,多考虑下是不是编码的原因:字节与字符的规则对不上。

读取数据示例: image.png

4.2 FileWriter
java.io.FileWriter 类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

构造方法:可用文件路径构造,也可创建 File 对象之后构造。

写出数据示例: image.png

刷新与关闭:

因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要 flush 方法了。

flush :刷新缓冲区,流对象可以继续使用。

close: 先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。 image.png
我的java编程技术学习群:1080621881 。

相关文章

  • Java 基础(四)| IO 流之使用文件流的正确姿势

    一、什么是 IO 流?想象一个场景:我们在电脑上编辑文件,可以保存到硬盘上,也可以拷贝到 U 盘中。那这个看似简单...

  • Java基础之IO流

    ##Java基础之IO流IO流常用几个类的关系如下: 字节流 字节输入流FileInputStream 读取文件用...

  • java_io

    java.io.File类的使用IO原理及流的分类  |---文件流   操作对象是文件     FileInp...

  • 【JavaSE(十三)】JavaIO流(中)

    1 IO流 1.1 IO流概述 Java中使用 IO流 来读取和写入,读写设备上的数据、硬盘文件、内存、键盘等等,...

  • Java之IO流详解

    title: Java之IO流详解tags: Java IO流categories: Java IO流 大多数应用...

  • Java 基础(三)| IO流之使用 File 类的正确姿势

    一、什么是 File 类?java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找...

  • Java IO之节点流(文件流)的使用

    文件字符流FileReader和FileWriter的使用 文件的输入 从文件中读取到内存(程序)中 步骤: 建立...

  • Java IO详解

    1 Java IO流的概念,分类 1.1 Java IO流的概念 java的IO是实现输入和输出的基础,可以方便的...

  • java IO入门笔记

    1.java IO流的概念,分类,类图 1.1. java IO 流的概念 java的io是实现输入和输出的基础,...

  • 从0开始复习java(9)--IO

    Java的io通过java.io包下的类和接口支持。主要有输入、输出流,又分为字节流和字符流。Java的io流使用...

网友评论

    本文标题:Java 基础(四)| IO 流之使用文件流的正确姿势

    本文链接:https://www.haomeiwen.com/subject/hyupcktx.html