IO流
- 1. IO流
- 1.1 概述
- 1.2 作用
- 1.3 分类
- 1.4 注意事项
1. IO流
IO流:存储和读取数据的解决方案。
I
:input
O
:output
流
:像水流一样传输数据
1.1 概述
IO(Input/Output)流
是计算机程序用于与外部设备进行数据交换的一种抽象概念。它是计算机输入输出操作的一种方式,常见于文件和网络通信等场景。
-
IO流可以分为输入流和输出流两种类型。输入流用于从外部设备(如键盘、文件、网络等)读取数据到程序中,而输出流则用于将程序中的数据写入到外部设备中。
-
在Java中,IO流分为字节流和字符流两种类型。字节流主要用于处理二进制数据,而字符流则用于处理文本数据。常见的字节流类有
InputStream
和OutputStream
,而常见的字符流类有Reader和Writer。
IO流的主要包括以下几个方面:
-
输入流和输出流:用于读取和写入数据。
-
字节流和字符流:处理不同类型的数据。
-
缓冲流:用于提高读写数据的效率。
-
文件IO流:用于读写文件数据。
-
网络IO流:用于网络通信数据的传输。
1.2 作用
用于读写数据(本地文件、网络)
-
文件读写:IO流能够读取和写入文件数据。
通过文件输入流(
FileInputStream、BufferedInputStream、FileReader
等)可以从文件中读取数据,而文件输出流(FileOutputStream、BufferedOutputStream、FileWriter
等)可以将数据写入文件中。这为程序的持久化存储提供了便捷的方式。 -
网络通信:
IO流
在网络通信中发挥着重要的作用。通过网络输入流(
InputStream
)和网络输出流(OutputStream
),程序可以从网络中接收数据和发送数据。例如,在客户端和服务器之间传输数据时,可以使用Socket类
和相关的IO流
来进行读写操作。 -
键盘输入和屏幕输出:通过标准输入流(
System.in
)和标准输出流(System.out
),程序可以从键盘获取输入信息,并将结果输出到屏幕上。这为与用户交互、输出调试信息等提供了基础的IO操作。 -
内存操作:除了文件和网络,IO流也可以用于内存中的数据操作。
例如,通过字节数组输入流(
ByteArrayInputStream
)和字节数组输出流(ByteArrayOutputStream
),程序可以将数据读写到内存中的字节数组中。 -
序列化和反序列化:IO流还可以用于对象的序列化和反序列化。
通过对象输入流(
ObjectInputStream
)和对象输出流(ObjectOutputStream
),程序可以将对象转化为字节序列并进行存储或传输,或者将字节序列重新还原为对象。这在分布式系统、远程调用等场景中很有用。
1.3 分类
- IO流按照
流向
分类:-
输出流:程序 —— > 文件
-
输入流:文件 —— > 程序
-
- IO流按照
操作文件的类型
分类:-
字节流:可以操作所有类型的文件
-
字符流:只能操作纯文本文件
纯文本文件
:用Windows系统自带的记事本打开能够读懂的文件。例如txt文件、md文件、xml文件、lrc文件 -
1.4 注意事项
-
使用try-with-resources或手动关闭流:确保及时关闭IO流以释放资源并避免资源泄漏。可以使用try-with-resources语句(Java 7及以上版本)或在finally块中手动关闭流。
-
适当处理异常:IO操作可能会抛出IOException等异常,因此需要适当处理这些异常。捕获异常、记录日志或向上层抛出异常都是处理异常的常见方式。
-
注意缓冲区的刷新:对于缓冲流(如BufferedInputStream、BufferedOutputStream),在适当的时机要调用flush()方法手动刷新缓冲区,以确保数据被及时写入。
-
避免频繁IO操作:频繁的IO操作可能会影响程序性能,尽量合并读写操作以减少开销。可以使用缓冲流来批量读写数据,避免频繁的单字节操作。
-
处理字符编码:在使用字符流读写文本文件时,需要注意字符编码的设置,以确保正确地处理文本的编码格式。可以指定编码格式或使用默认编码。
-
正确处理流的顺序:在使用组合流(例如BufferedInputStream套在FileInputStream上)时,要确保正确的流的顺序,避免造成意外的错误。
-
判断流的可用性:在对流进行读取操作时,要时刻注意流的可用性(比如文件是否存在、网络连接是否正常),避免因为不可用的流而导致异常。