IO流的分类

Java IO流详解
本文介绍了Java IO流的基本概念,包括字节流与字符流的区别、输入流与输出流的使用场景,并详细阐述了InputStream和OutputStream类及其子类的功能与结构。

IO流的分类

根据处理数据类型的不同分为:字符流和字节流

根据数据流向不同分为:输入流和输出流

字符流和字节流
字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。字节流和字符流的区别:

(1)读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。

(2)处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

(3)字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件,我们将在下面验证这一点。

结论:优先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。

输入流和输出流
对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。
Java IO流对象

  1. 输入字节流InputStream

定义和结构说明:

从输入字节流的继承图可以看出:

InputStream 是所有的输入字节流的父类,它是一个抽象类。

ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。PipedInputStream 是从与其它线程共用的管道中读取数据,与Piped 相关的知识后续单独介绍。

ObjectInputStream 和所有FilterInputStream的子类都是装饰流(装饰器模式的主角)。意思是FileInputStream类可以通过一个String路径名创建一个对象,FileInputStream(String name)。而DataInputStream必须装饰一个类才能返回一个对象,DataInputStream(InputStream in)。
2. 输出字节流OutputStream

定义和结构说明:

IO 中输出字节流的继承图可见上图,可以看出:

OutputStream 是所有的输出字节流的父类,它是一个抽象类。

ByteArrayOutputStream、FileOutputStream是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。PipedOutputStream 是向与其它线程共用的管道中写入数据,

ObjectOutputStream 和所有FilterOutputStream的子类都是装饰流。具体例子跟InputStream是对应的。这里写图片描述

### ### Java 中 IO 分类 Java 中的 IO 按照不同的分类方式可以分为多种类型,主要包括以下几种: #### 1. 按照数据动方向分类 - **输入(InputStream/Reader)**:用于从数据源读取数据,例如从文件、网络连接等读取字节或字符数据。 - **输出(OutputStream/Writer)**:用于向目标写入数据,例如向文件、网络连接等写入字节或字符数据[^2]。 #### 2. 按照处理数据单位分类 - **字节(InputStream/OutputStream)**:以字节为单位进行数据的读写操作,适用于处理二进制数据,如图片、音频、视频等。 - **字符(Reader/Writer)**:以字符为单位进行数据的读写操作,适用于处理文本数据,如 `.txt` 文件[^2]。 #### 3. 按照的功能分类 - **节点(Node Stream)**:直接与数据源连接,如 `FileInputStream`、`FileReader` 等。 - **处理(Processing Stream)**:对节点进行包装,提供更高效或更便捷的功能,如 `BufferedInputStream`、`BufferedReader` 等。这类通常会提供缓冲机制,提高 IO 操作的性能[^3]。 #### 4. 按照的层次结构分类 - **字节输入**:`InputStream` 是所有字节输入的父类,其常用子类包括 `FileInputStream`、`BufferedInputStream`、`ObjectInputStream` 等。 - **字节输出**:`OutputStream` 是所有字节输出的父类,其常用子类包括 `FileOutputStream`、`BufferedOutputStream`、`ObjectOutputStream` 等。 - **字符输入**:`Reader` 是所有字符输入的父类,其常用子类包括 `FileReader`、`BufferedReader`、`InputStreamReader` 等。 - **字符输出**:`Writer` 是所有字符输出的父类,其常用子类包括 `FileWriter`、`BufferedWriter`、`OutputStreamWriter` 等[^3]。 #### 5. 常见 IO 示例代码 ##### 字节复制文件示例 ```java try (FileInputStream fis = new FileInputStream("source.txt"); FileOutputStream fos = new FileOutputStream("destination.txt")) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = fis.read(buffer)) != -1) { fos.write(buffer, 0, bytesRead); } } catch (IOException e) { e.printStackTrace(); } ``` ##### 字符读写文件示例 ```java try (BufferedReader reader = new BufferedReader(new FileReader("input.txt")); BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) { String line; while ((line = reader.readLine()) != null) { writer.write(line); writer.newLine(); } } catch (IOException e) { e.printStackTrace(); } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值