Java I/O需要处理多种场景,Java类库的设计者都是通过创建大量的类来解决这个问题的,单篇文章难以详述,本文只是试图提供一个通用的概述传统I/O类库所涉及的类,以掌握整个上下文,更好地理解和应用I./O类库解决实际编程问题。具体需要参考JDK文档。
1.输入流/输出流
在Java 1.0中,类库的设计者首先限制所有与输入相关的类都继承自InputStream,而与输出相关的所有类都继承自OutputStream。
1)输入流
InputStream用于表示从不同数据源生成输入的类。这些数据来源包括:
- 字节数组;
- 字符串对象;
- 文件;
- “管道”的工作方式与实际管道类似,即一端输入,另一端输出。
- 一系列其他流,以便我们可以将它们收集并合并为一个流;
- 其他数据源,如Internet连接等。
每个数据源都有其对应的InputStream子类作为基本组件:
- ByteArray InputStream,允许将内存缓冲区用作InputStream;
- String Buffer InputStream,将String转换为InputStream;
- FileInputStream,用于从文件中读取信息;
- PipedInputStream,它生成用于写入相关PipedOutputStream的数据。实现“流水线”的概念;
- SequenceInputStream将两个或多个InputStream对象转换为单个InputStream。
- OutputStream用于表示可以输出到不同数据源的类。它的特定子类决定了输出的目的地:字节数组、文件或管道。它也用作基本组件:
- ByteArray输出流,它在内存中创建缓冲区。所有发送到流的数据都应该放在这个缓冲区中。
- FileOutput Stream,用于将信息写入文件;
- PipedOutputStream,任何写入其中的信息都会自动作为相关PipedInputStream的输出,实现“流水线”的概念;
3)装饰器
除了上述基本组件外,还有两个子类:FilterInputStream/FilterOutputStream,它们也是InputStream和OutputStream的子类。它们为“decorator”类提供基类,其中“decorator”类可以将属性或有用的接口连接到基本组件。因为上面提到的InputStream/OutputStream是单字节操作的,而真正的I/O场景远不止于此,它通过“装饰”来扩展其功能(原理是类的组合)。
我自己梳理了InputStream/OutputStream流继承层次结构,结合下面的讲解,可以对字节流系统有更清晰的认识:
4)过滤输入流
FilterInputStream类有以下子类,即具体的装饰器:
它的装饰功能主要有两个方面:
- 读取不同基本类型的数据和String对象,如DataInputStream;
- 内部修改InputStream的行为:Buffer InputStream,LineNumber InputStream,并保留它读过的行;
5)过滤输出流
与Filter Input Stream类似,Filter Output Stream主要完成写入功能,主要包括以下装饰器:
- Data Output Stream与Data Input Stream一起使用,可以将基本类型的数据(int、char、long)以可移植的方式写入流。
- PrintStream,用于生成格式化输出。Data Output Stream处理数据存储,PrintStream处理显示。
- Buffered Output Stream,用于避免每次发送数据时的实际写操作。表示“使用缓冲区”。可以调用flush()清除缓冲区;
以上就是动力节点小编介绍的"深入学习Java I/O的输入输出,看了就会",希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为您服务。