【Java IO流】IO流详解
参考笔记:【Java基础-3】吃透Java IO:字节流、字符流、缓冲流_javaio-CSDN博客
目录
1.IO流简介
1.1 什么是IO流?
1.2 IO流的分类
1.3 字符流和字节流的其他区别
1.4 Java IO流体系图
2.字符编码详解
3. Java的char类型与 Unicode、UTF-16 的联系
4.节点流
4.1 字符输入流/输出流——FileReader/FileWriter
5.2 字节输入流/输出流——FileInputStream/FileOutputStream
5.处理流
1.IO流简介
1.1 什么是IO流?
IO,即 Input 、 Output ,也就是输入和输出,指应用程序和外部设备之间的数据传递,常见的外部设备包括磁盘文件、管道、网络连接
Java 中是通过流处理 IO 的,那么什么是流?
流(Stream),是一个抽象的概念,是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通道
当 Java 程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是磁盘文件、内存、网络连接等等。类似地,当 Java 程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中 "流"动 一样
一般来说关于流的特性有下面几点:
① 先进先出:最先写入的数据会被最先读出
② 顺序存取:可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据
③ 只读或只写:每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,输出流只能进行写操作。在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流
1.2 IO流的分类
-
按数据的流向分类:输入流和输出流
-
输入流 :读取外部数据(磁盘、光盘等存储设备的数据)到 Java 程序(内存)中;输入流以 InputStream、Reader 结尾
-
输出流 :将 Java 程序(内存)数据输出到磁盘、光盘等存储设备中;输出流以 OutputStream、Writer 结尾
-
-
按数据的操作单位分类:字节流和字符流
-
字节流 :以数据单位为 8 位的字节为单位;字节流以 InputStream、OutputStream 结尾
-
字符流 :以数据单元为 16 位的字符为单位;字符流以 Reader、Writer 结尾
-
-
按流的功能分类:节点流和处理流
-
节点流:直接操作数据读写的流类,比如 FileInputStream
-
处理流:也称为包装流,用来包装节点流,给节点流提供更加强大的读写功能
-
1.3 字符流和字节流的其他区别
除了操作的数据单位的区别,还有以下区别:
-
操作的文件类型不同:
-
字符流 :字符流用于处理纯文本类型文件,如 .txt、.cpp、.txt、.java、.c、.cpp、.py 等,不能处理图像、视频等非文本文件
-
字节流 :字节流可以操作一切类型文件,但通常用来用来处理 .img、.mp3、.mp4、.ppt、.doc 等二进制文件
-
-
缓冲区:
-
字符流:字符输出流本身带有缓冲区(字符输入流好像没有),缓冲区是一个长度为 1024 的 char 类型数组
-
字节流:没有缓冲区
-
验证:字符输出流带有缓冲区
查看所有字符输出流的基类 Writer ,如下:
可以看到,字符输出流自带的缓冲区确实是一个长度为 1024 的 char 类型数组 writeBuffer
1.4 Java IO流体系图
为了更好的阅读体验,建议大家对字符编码、Java 的 char 类型有比较深的了解
2.字符编码详解
链接如下:
【字符编码】详解ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16、UTF-32_gbk解码-CSDN博客文章浏览阅读966次,点赞27次,收藏22次。相信大家都遇到过打开一个文本文件然后出现乱码的情况,经典的"锟斤拷"乱码(bushi),如下:没在深夜见过"锟斤拷"的人,不足以语人生...好了回归正题,乱码到底是怎么来的呢?知名乱码"锟斤拷"又为何如此常见?不着急,要理解乱码,首先需要知道计算是如何存储为文字的:学过计算机的都知道,计算机只能存储0、1这两个二进制数,无论是文本文件里的数字、字母、汉字标点符号控制字符emoji😈👴等都需要用某种方式转换成二进制数字进行存储,需要的时候再读出来。_gbk解码
https://blog.csdn.net/m0_55908255/article/details/147335974?spm=1011.2415.3001.5331 字符编码主要内容包括 :
① 字符集、编码编码介绍
② ASCII字符集 + 编码
③ GB2312字符集 + 编码
④ GBK 字符集 + 编码
⑤ Unicode 字符集
⑥ Unicode 字符集的三种编码方案:UTF-32、UTF-16、UTF-8
⑦ 乱码的本质原因
3. Java的char类型与 Unicode、UTF-16 的联系
链接如下:
【字符编码】Java的char类型与Unicode、UTF-16的联系-CSDN博客文章浏览阅读921次,点赞16次,收藏24次。本文是上一篇博文的续篇:https://blog.csdn.net/m0_55908255/article/details/147335974?sharetype=blogdetail&sharerId=147335974&sharerefer=PC&sharesource=m0_55908255&spm=1011.2480.3001.8118https://blog.csdn.net/m0_55908255/article/details/147335974?sharetype=blogdetail&sh
https://blog.csdn.net/m0_55908255/article/details/147430863?spm=1011.2415.3001.5331 主要内容包括 :
① Java 的 char 类型底层设计
② Java 中关于 Unicode 的常用 API
③ 编码和解码
④ 乱码问题
4.节点流
4.1 字符输入流/输出流——FileReader/FileWriter
链接如下:
【Java IO流】字符输入流FileReader、字符输出流FileWriter-CSDN博客本文讲解的是两个比较重要的节点流,也是两个比较重要的字符流。即字符输入流FileReader、字符输出流FileWriterJava IO作用:将磁盘文本文件的数据读取到Java程序(内存)中作用:将Java程序(内存)中的字符写入到磁盘文件中。
https://blog.csdn.net/m0_55908255/article/details/147529309?sharetype=blogdetail&sharerId=147529309&sharerefer=PC&sharesource=m0_55908255&spm=1011.2480.3001.8118 主要内容包括 :
① FileReader 构造器、常用方法
② FileReader 读取文件案例演示
③ FileWriter 构造器、常用方法
④ FileWriter 写入文件案例演示
⑤ FileReader + FileWriter 拷贝文本文件
5.2 字节输入流/输出流——FileInputStream/FileOutputStream
链接如下:
【Java IO流】字节输入流FileInputStream、字节输出流FileOutputStream-CSDN博客本文讲解的是两个比较重要的节点流,也是两个比较重要的字节流。即字节输入流、字节输出流Java IO作用:从磁盘文件中读取字节数据Java程序(内存)中作用:将字节数据 从Java程序(内存) 写入到磁盘文件。
https://blog.csdn.net/m0_55908255/article/details/147540602?sharetype=blogdetail&sharerId=147540602&sharerefer=PC&sharesource=m0_55908255&spm=1011.2480.3001.8118 主要内容包括 :
① FileInputStream 构造器、常用方法
② FileInputStream 读取文件案例演示
③ FileOutputStream 构造器、常用方法
④ FileOutputStream 写入文件案例演示
⑤ FileReader + FileWriter 拷贝文件
5.处理流
此部分讲解 3 个处理流:缓冲流、转换流、序列化流,再加 标准输入\输出流
链接如下:
【Java IO流】处理流之缓冲流、转换流、序列化流、标准输入\输出流-CSDN博客文章浏览阅读75次。本文讲解的是3个处理流 + 标准输入\输出流,内容比较枯燥缓冲字节流:缓冲字符流:BufferedReader、BufferedWriterJava IO节点流可以从一个特定的数据源读数据或写数据,比如节点流可以从文件读取数据到Java程序中,节点流可以将Java程序中的数据写入文件,这两个结点流的数据源都是磁盘文件,如下所示:那处理流是什么东西呢?处理流也叫包装流,是连接(包装)在节点流之上的流,为节点流提供更为强大的读写功能上图中很形象地描绘了节点流和处理流的关系。
https://blog.csdn.net/m0_55908255/article/details/147543826?spm=1011.2415.3001.5331 主要内容包括 :
① 缓冲字节流 BufferedInputStram、BufferedOutputStream 的原理、使用案例、与普通字节流的效率对比
② 缓冲字符流 BufferedReader、BufferedWriter 的原理、使用案例、与普通字符流的效率对比
③ 转换流 InputStreamReader、OutputStreamWriter 的引入、作用、使用案例
④ 序列化流 ObjectInputStream、ObjectOutputStream 的原理、作用、使用案例
⑤ 标准输入\输出流 System.in 、System.out