简介
IO 即 Input/Output,输入和输出。数据输入到计算机内存的过程即输入,反之输出到外部存储(比如数据库,文件,远程主机)的过程即输出。数据传输过程类似于水流,因此称为 IO 流。IO 流在 Java 中分为输入流和输出流,而根据数据的处理方式又分为字节流和字符流。Java IO 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的。
- InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
- OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。
字节流和字符流
Java I/O 提供了字节流和字符流两种方式来处理 I/O 操作:
字节流
处理原始的字节数据,适用于所有类型的数据(包括文本和二进制数据)。
输入字节流InputStream 类
InputStream 类及其子类(如 FileInputStream、BufferedInputStream)
输出字节流OutputStream 类
OutputStream 类及其子类(如 FileOutputStream、BufferedOutputStream)
字符流
Reader用于从源头(通常是文件)读取数据(字符信息)到内存中,java.io.Reader抽象类是所有字符输入流的父类。
输入字符流Reader 类
Reader 类及其子类(如 FileReader、BufferedReader)
输出字符流 Writer 类
Writer 类及其子类(如 FileWriter、BufferedWriter)
字节缓冲流
BufferedInputStream(字节缓冲输入流)
BufferedInputStream 从源头(通常是文件)读取数据(字节信息)到内存的过程中不会一个字节一个字节的读取,而是会先将读取到的字节存放在缓存区,并从内部缓冲区中单独读取字节。这样大幅减少了 IO 次数,提高了读取效率。
BufferedOutputStream(字节缓冲输出流)
BufferedOutputStream 将数据(字节信息)写入到目的地(通常是文件)的过程中不会一个字节一个字节的写入,而是会先将要写入的字节存放在缓存区,并从内部缓冲区中单独写入字节。这样大幅减少了 IO 次数,提高了读取效率
字符缓冲流
BufferedReader (字符缓冲输入流)
BufferedWriter(字符缓冲输出流)
异常处理
- IOException: 所有 I/O 操作中的异常类的超类,用于处理 I/O 操作中的错误。
- FileNotFoundException: 当尝试访问不存在的文件时抛出。
- EOFException: 当文件结束标志遇到时抛出。
问题
- 不管是文件读写还是网络发送接收,信息的最小存储单元都是字节。 那为什么 I/O 流操作要分为字节流操作和字符流操作呢?
尽管信息的最小存储单元都是字节,但字节流和字符流的分离是为了提供适合不同数据类型的处理方式。字节流处理原始字节数据,适合二进制数据;字符流处理字符数据,支持字符编码转换,适合文本数据。通过这种分类,Java I/O 可以更好地满足各种数据处理需求,提高程序的效率和可读性。
总结
Java I/O 是 Java 应用程序处理数据输入和输出的关键机制。掌握字节流和字符流的基本操作,理解文件操作、数据流处理、I/O 性能优化技巧以及 NIO(New I/O)技术,能够帮助开发者更高效地进行文件和数据处理,并提升应用程序的性能和响应速度。