Java字节流详解:InputStream与OutputStream

需积分: 10 1 下载量 171 浏览量 更新于2024-09-11 收藏 198KB PDF 举报
"Java中的字节流主要涉及Java I/O系统的基础部分,包括InputStream和OutputStream这两个核心抽象类,以及它们的子类如FileInputStream和FileOutputStream。这些类用于处理字节级别的数据传输,例如在文件读写、网络通信等场景中。本讲还提到了其他字节I/O流,以及一些基本的读写方法和流管理的方法。" Java的字节流是用于处理单个字节或字节数组的输入和输出操作。它们构成了Java I/O系统的基础,适用于任何类型的数据,因为所有数据最终都可以被表示为字节序列。 **InputStream**: 这是一个抽象类,提供了输入流的基本操作。它定义了以下关键方法: 1. `read()`: 返回一个整型值,表示读取到的字节。如果没有可用的字节,会返回-1,表示流的末尾。 2. `read(byte[] b)`: 读取流中的字节并存储到提供的字节数组`b`中,直到填满整个数组或到达流的末尾。 3. `read(byte[] b, int off, int len)`: 类似于上一个方法,但可以从指定的偏移量`off`开始读取`len`个字节。 4. `available()`: 返回流中当前可以读取的字节数。 5. `skip(long n)`: 跳过流中的`n`个字节。 6. `close()`: 关闭流,释放与之相关的任何系统资源。 **OutputStream**: 同样是抽象类,用于输出流的最基本操作,主要方法包括: 1. `write(int i)`: 写入一个字节到流中。 2. `write(byte[] b)`: 将整个字节数组`b`写入流。 3. `write(byte[] b, int off, int len)`: 从数组的指定偏移量开始,写入`len`个字节到流。 **FileInputStream** 和 **FileOutputStream** 是InputStream和OutputStream的直接子类,专门用于文件的读写操作。前者用于从文件中读取字节,后者则用于向文件写入字节。 在Java程序设计中,一个简单的应用示例是创建一个回声程序(Echo1),它接收InputStream(如System.in)的输入,并即时通过OutputStream(如System.out)输出。这个程序通过不断调用`read()`方法读取用户输入,直到遇到流的末尾(通常在控制台输入Ctrl+Z时触发)。 测试英文字母和中文字的回声情况时,需要注意Java字节流不处理字符编码的问题,因此英文字母和中文字可能需要不同的处理方式。对于中文字符,由于其通常占用多个字节(如UTF-8编码),因此使用字节流可能会导致字符的拆分或乱码问题。在实际应用中,通常会使用字符流(CharStream)来处理包含多字节字符的文本数据,如Reader和Writer类。然而,字节流在处理二进制数据(如图片、音频、视频等)时更为合适。