陆小曼|Java IO,讲的实在是太好了,这篇( 二 )


根据处理数据的基本单位不同分类:字节流和字符流
字节流:以字节(8bit)为单位做数据的传输字符流:以字符为单位(1字符=2字节)做数据的传输字符流的本质也是通过字节流读取 , Java中的字符采用Unicode标准 , 在读取和输出的过程中 , 通过以字符为单位 , 查找对应的码表将字节转换为对应的字符 。
面对字节流和字符流 , 很多读者都有疑惑:什么时候需要用字节流 , 什么时候又要用字符流?
我这里做一个简单的概括 , 你可以按照这个标准去使用:
字符流只针对字符数据进行传输 , 所以如果是文本数据 , 优先采用字符流传输;除此之外 , 其它类型的数据(图片、音频等) , 最好还是以字节流传输 。
根据这两种不同的分类 , 我们就可以做出下面这个表格 , 里面包含了IO中最核心的4个顶层抽象类:
数据流向/数据类型字节流字符流输入流InputStreamReader输出流OutputStreamWriter
现在看IO是不是有一些思路了 , 不会觉得很混乱了 , 我们来看这四个类下的所有成员 。
看到这么多的类是不是又开始觉得混乱了 , 不要慌 , 字节流和字符流下的输入流和输出流大部分都是一一对应的 , 有了上面的表格支撑 , 我们不需要再担心看见某个类会懵逼的情况了 。
看到Stream就知道是字节流 , 看到Reader/Writer就知道是字符流 。
这里还要额外补充一点:JavaIO提供了字节流转换为字符流的转换类 , 称为转换流 。
转换流/数据类型字节流与字符流之间的转换(输入)字节流=>字符流InputStreamReader(输出)字符流=>字节流OutputStreamWriter
注意字节流与字符流之间的转换是有严格定义的:
输入流:可以将字节流=>字符流输出流:可以将字符流=>字节流为什么在输入流不能字符流=>字节流 , 输出流不能字节流=>字符流?
在存储设备上 , 所有数据都是以字节为单位存储的 , 所以输入到内存时必定是以字节为单位输入 , 输出到存储设备时必须是以字节为单位输出 , 字节流才是计算机最根本的存储方式 , 而字符流是在字节流的基础上对数据进行转换 , 输出字符 , 但每个字符依旧是以字节为单位存储的 。
节点流和处理流在这里需要额外插入一个小节讲解节点流和处理流 。
节点流:节点流是真正传输数据的流对象 , 用于向特定的一个地方(节点)读写数据 , 称为节点流 。 例如FileInputStream处理流:处理流是对节点流的封装 , 使用外层的处理流读写数据 , 本质上是利用节点流的功能 , 外层的处理流可以提供额外的功能 。 处理流的基类都是以Filter开头 。
JavaIO的核心类FileJava提供了File类 , 它指向计算机操作系统中的文件和目录 , 通过该类只能访问文件和目录 , 无法访问内容 。 它内部主要提供了3种操作:
访问文件的属性:绝对路径、相对路径、文件名······文件检测:是否文件、是否目录、文件是否存在、文件的读/写/执行权限······操作文件:创建目录、创建文件、删除文件······上面举例的操作都是在开发中非常常用的 , File类远不止这些操作 , 更多的操作可以直接去API文档中根据需求查找 。
访问文件的属性:


推荐阅读