"JAVA讲座 I/O与文件 J2SE 流"
在Java中,I/O(Input/Output)处理是程序与外部世界交互的关键部分,包括读取数据、写入数据以及进行文件操作。本讲座主要关注Java I/O系统中的字节流和字符流,以及它们在处理文件和键盘输入时的应用。
1. **字节流**: 字节流是Java I/O的基础,它处理的是8位的字节序列。Java中提供了两个主要的抽象基类——`InputStream`和`OutputStream`,分别用于处理输入和输出。`InputStream`不能直接创建对象,但`System.in`是一个预定义的输入流实例,通常代表键盘输入,除非被重定向。`InputStream`的`read()`方法用于读取单个字节,返回-1表示流结束。
2. **字符流**: 为了处理字符级别的数据,Java引入了`Reader`和`Writer`接口,它们是字节流的字符版本。`InputStreamReader`是从字节流到字符流的桥梁,它使用特定的字符编码(如UTF-8或GBK)将字节转换为字符。`BufferedReader`是`Reader`的一个实现,它可以按行读取字符数据,方便用户处理文本输入。
3. **编码与转换**: 在Java中,字符串默认使用Unicode-16编码,这允许存储世界上几乎所有的字符。`String`类提供了一些方法来转换字节数组和字符串之间的编码。`InputStreamReader`则通过指定编码名(如`"UTF-8"`),确保读取的字符流按照正确的编码解码。
4. **预定义流**: Java提供了一些预定义的流,如`System.in`(标准输入流,默认为键盘输入)、`System.out`(标准输出流,默认为屏幕输出)和`System.err`(标准错误流,默认为屏幕输出)。这些流可以通过`System.setIn()`, `System.setOut()`和`System.setErr()`方法进行重定向,以改变输入和输出的目标。
5. **抽象类和接口**: `InputStream`和`OutputStream`作为所有输入和输出流的基类,提供了一种统一的接口,使得程序员无需关心数据来自何处或去向何方,只需关注数据的读写。而`Reader`和`Writer`接口则进一步抽象了字符级的读写操作,提供了更高级别的服务。
6. **多样的服务**: Java I/O体系结构设计得非常灵活,`InputStream`和`OutputStream`虽然提供了基本的字节服务,但可能在某些场景下不够用。因此,有了`InputStreamReader`这样的类,它可以提供面向字符的服务。`BufferedReader`和`BufferedWriter`等类提供了缓冲功能,提高了性能并简化了代码。
7. **流的层次结构**: Java I/O系统采用了层次化的类设计,例如`FileInputStream`和`FileOutputStream`继承自`InputStream`和`OutputStream`,专门用于文件操作;`DataInputStream`和`DataOutputStream`增加了对基本数据类型的支持。这样,Java I/O既可以处理键盘这样的简单输入源,也可以处理文件和网络通信等复杂情况。
Java的I/O系统是一个强大且灵活的框架,它通过抽象流的概念,将各种类型的输入输出统一处理,从而简化了程序员的工作。理解并熟练掌握这一系统对于开发涉及数据交换的Java应用程序至关重要。