Java的输入输出(I/O)系统是程序设计中不可或缺的一部分,它涵盖了从键盘获取数据、从文件读取信息以及向文件写入数据等多种操作。在Java中,输入和输出是通过流(Stream)的概念实现的,这是一个抽象化的概念,允许程序以统一的方式处理各种类型的输入和输出源。
10.1 输入与输出基础
Java的输入输出功能主要依赖于`java.io`包中的类。流是数据在计算机输入和输出之间移动的序列,它可以是原始的二进制数据,也可以是遵循特定格式的编码数据。Java的流系统与物理设备相连,使得无论连接的设备类型如何,流的行为都保持一致。这使得输入/输出类和方法可以应用于所有类型的外部设备。Java将不同来源的输入(如键盘、文件、网络)和输出抽象为流,数据流分为输入流(只能读取)和输出流(只能写入)。
10.1.2 字节流与字符流
Java定义了两种基本的流类型:字节流(byte stream)和字符流(character stream)。字节流主要用于处理字节数据,如二进制文件,而字符流则处理字符数据,考虑到了国际化的编码标准。字节流的顶级抽象类是`InputStream`和`OutputStream`,它们提供了`read()`和`write()`等关键方法。例如,`InputStream`的`read()`方法会读取一个字节并返回一个0-255之间的整数。字符流则由`Reader`和`Writer`抽象类代表,它们处理Unicode字符。
字节流类层次结构包括多个具体子类,如`FileInputStream`和`FileOutputStream`用于处理文件,`ByteArrayInputStream`和`ByteArrayOutputStream`用于内存中的字节操作。`InputStream`和`OutputStream`的常用方法包括读取和写入数据,跳过字节,检查可用字节数,标记和复位位置,以及关闭流。
在处理字符数据时,Java使用字符流提供便利。`Reader`和`Writer`类及其子类如`BufferedReader`和`PrintWriter`处理字符数据。字符流通常比字节流更适合处理文本数据,因为它们处理字符而不是字节,简化了国际化编码的处理。
10.2 文件输入/输出
文件输入/输出是Java I/O的重要应用,涉及到读取和写入文件。通过`FileInputStream`和`FileOutputStream`类可以实现对文件的字节级操作,而` FileReader`和`FileWriter`则用于字符级操作。此外,`BufferedInputStream`和`BufferedOutputStream`提供缓冲,提高文件操作效率。`File`类提供了文件和目录的创建、删除、重命名等管理功能。
思考与练习:
1. 描述字节流和字符流的主要区别。
2. 举例说明何时应该使用字节流,何时应该使用字符流。
3. 解释`InputStream`和`OutputStream`中的`read()`和`write()`方法的作用。
4. 实现一个简单的程序,从文件中读取数据并写入另一个文件。
5. 探讨Java I/O中的缓冲机制及其优点。
通过理解和熟练掌握Java的输入输出系统,开发者能够有效地处理程序与外部世界的数据交互,无论是处理用户输入,还是进行文件操作,都能游刃有余。在实际编程中,根据需求选择合适的流类型,结合缓冲和错误处理机制,可以编写出高效、健壮的I/O代码。