[重学Java基础][Java IO流][Part.0]总述

[重学Java基础][Java IO流][Part.0]总述

IO流是Java很重要的一部分 但是并不好掌握 在初学Java中囫囵吞枣的学过之后 一直不是非常明白 这次就仔细研读一下Java的IO流部分 确保自己能清楚的认识这一部分
边学习边看网络上的资料 然后自己总结一下

IO流概述

  • IO流是什么
    IO流一般指java.io包下一系列方法和接口的总称 ,可以从其中读入一个字节序列的对象称作输入流,而可以向其中写入一个字节序列的对象称作输出流。这些字节序列的来源地和目的地可以是文件,而且通常都是文件,但是也可以是网络连接,甚至是内存块。编程语言的I/O类库中使用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象。

  • IO流能干什么
    IO流提供了各种方式的数据输入或者输出功能

  • java.io stream类结构总图
    这里写图片描述

部分方法在Java8 Java9中已删除

IO流分类解析

按数据解析方式区分
字符流和字节流
  • 字节流
    直接读入写出二进制内容的数据操作流 可以操作所有的数据类型 以字节为单位入写出数据内容 通常以**Steam为后缀命名
    InputStream、OutputStream类是字节输入流的抽象类,是所有字节输入流的父类
    这里写图片描述
    这里写图片描述

  • 字符流
    字符流是可以直接读取字符内容的数据流,相比于字节流读入的二进制数据需要转换才能显示,字符流每次次读入写出一个字符单位数据,直接显示内容,但其只能读取字符类型数据。
    通常以**Reader、**Writer为后缀命名
    Reader、writer类是字符输入流的抽象类,是所有字符输入流的父类
    Alt text
    Alt text

按流的走向区分
输入流和输出流
  • 输入流
    从文件 数据源 管道等外界把数据输入内存(用户内存空间)输入的流 包括各种字节输入流*InputStream 各种字符输入流*Reader

  • 输出流

  • 从内存(用户内存空间)输出数据到文件 数据源 管道等其他位置 包括各种字节输出流*OutputStream 各种字符输入流*Wrirer
按流的连接方式
节点流和处理流
  • 节点流
    用于直接操作目标数据源所对应的流叫节点流。
  • 处理流
    通过一个间接(包装)流类去调用节点流类,以达到更加灵活方便地读写各种类型的数据,这个间接(包装)流类就是处理流。

总结以上的分类 更详细的流类图
这里写图片描述

逐个分析

字符输入流Reader

Reader为所有字符输入流的超类

节点流
包含三种基本节点流
FileReader PipedReader CharArrayReader
分别直接从三种数据节点读取字符
- FileReader 从文件读入
- PipedReader 从连接的管道读入
- CharArrayReader 从字符数组读入

处理流
- BufferedReader 缓冲字符读取流
套在三种基本输入流上面 可以一次读取填满缓冲区的数据 避免直接使用节点流导致的频繁IO操作 增强了普通节点流的功能 此处应用装饰器模式
其子类LinenumberReader 行级缓冲字符读取流
继承自BufferedReader 缓冲字符读取流 在其基础上添加了 获取行号和设置行号的功能 同样应用装饰器模式
- InputStreamReader 字节读取流-字符转换器
是一个连接字节流 InputStream和字符输出流Writer的桥梁,它将字节流转变为字符流 让不可识别的二进制数据转换为人可认知的字符数据 此处应用了适配器模式

内存流
除了以上的输入流 还有一种伪装的输入流 StringReader 继承了Reader类 拥有了输入流的特性 但是并不真正从数据源读入数据 而是直接读入字符串,适用于一些设计为输入流的接口使其可以直接从内存读取数据

过滤流
所有FilterReader的子类都是过滤流

字符输出流Writer

Writer为所有字符输出流的超类

节点流
同样包含三种基本节点流
FileWriter PipedWriter CharArrayWriter
分别向三种数据节点输出字符
- FileWriter 写入到文件
- PipedWriter 写入到连接的管道
- CharArrayWriter 写入到字符数组
处理流
- BufferedWriter 缓冲字符输出流
套在三种基本输出流上面 可以一次读取填满缓冲区的数据 避免直接使用节点流导致的频繁IO操作 增强了普通节点流的功能 此处应用装饰器模式
- OutputStreamWriter 字节输出流-字符转换器
是一个连接字节流OutputStream和字符输出流Writer的桥梁,它将字节流转变为字符流 让不可识别的二进制数据转换为人可认知的字符数据 此处应用了适配器模式

内存流
除了以上的输出流 还有一种伪装的输出流 StringWriter 继承了Writer类 拥有了输出流的特性 但是并不真正写入数据汇而是以字符串形式保存在内存中,适用于一些设计为输出流的接口使其可以直接将数据保存在内存中

  • 字符输入流和字符输出流对照图

这里写图片描述

字节输入流InputStream

基本节点流
类似字符输入流 也有三种基本节点流
分别向三种数据节点输入字节数据
- FileInputStream 写入文件
- PipedInputStream 写入管道
- ByteArrayInputStream 写入字节数组

常用处理流
过滤装饰流
FilterInputStream是所有字节输入处理流的父类 它继承了InputStream 并扩展了InputStream的功能 实例化时传入一个InputStream对象 实质为InputStream的装饰器 应用了装饰器模式 子类处理流继承FilterInputStream 并添加了输入流的过滤操作方法 常用的有三种
- DataInputStream
Java数据输入流 DataInputStream允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型
- BufferInputStream
缓冲字节输入流 拥有缓冲区的输入流 可以一次直接读入缓冲区长度的数据
- LineNumberInputStream
带行号的缓冲字节输入流 在BufferInputStream基础上增加了读入行号的方法
- PushBackInputStream
添加了进退功能的过滤流,即“推回 (push back)”或“取消读取 (unread)”一个字节的能力。

其他处理流
- ObjectInputStream
反序列化对象输入流 可以将序列化的对象读入并解析
- SequenceInputStream
- 合并处理流 它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止

字节输出流OutputStream

节点流
类似字符输出流 也有三种基本节点流
分别向三种数据节点输入字节数据
- FileOutputStream 写入文件
- PipedOutputStream 写入管道
- ByteArrayOutputStream 写入字节数组
常用处理流

  • DataOutputStream
    Java数据输出流 DataOutputStream允许应用程序以与机器无关方式向输入流中写入基本类型数据
  • ObjectOutputStream
    序列化对象输出流 可以将内存中的普通对象序列化
  • PrintStream
    打印输出流

  • 字节输入流和字符输出流对照图
    这里写图片描述

非流部分

在java.io包下 不仅仅只有IO流 还有其他数据操作的对象
- File 文件对象
在整个io包中,唯一表示与文件本身有关的类就是File类。使用File类可以进行创建或删除文件以及文件夹等常用操作
- FileDescriptor 文件描述符
- RandomAccessFile 文件随机访问类

异常

标准输入/输出

程序的所有输入都来自于标准输入,它的所有输出也都可以发送到标准输出,以及所有的错误信息都可以发送到标准错误。标准I/O的意义在于,我们可以很容易地把程序串联起来,一个程序的标准输出可以成为另一程序的标准输入。
按照标准I/O模型,Java提供了System.in、System.out和System.err。其中System.out已经事先被包装成了printStream对象。System.err同样也是PrintStream,但System.in却是一个没有被包装过的未经加工的InputStream。这意味着尽管我们可以立即使用System.out和System.err,但是在读取System.in之前必须对其进行包装。

压缩流

在日常的使用中经常会使用到像WinRAR或WinZIP这样的压缩文件,通过这些软件可以把一个很大的文件进行压缩以方便传输。
在JAVA中 为了减少传输时的数据量也提供了专门的压缩流,可以将文件或文件夹压缩成ZIP、JAR、GZIP等文件的格式。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值