《第二十六章 IO 流 - 字节流》
在 Java 编程中,输入输出(IO)操作是非常重要的一部分,而字节流(Byte Stream)则是其中一种基本的数据传输方式。本章将详细介绍字节流,包括 InputStream
和 OutputStream
类以及字节流的读写操作。
一、字节流概述
字节流用于处理以字节为单位的数据传输,适用于处理二进制数据,如图像、音频、视频等文件。
二、InputStream
类
(一)常用方法
int read()
: 从输入流中读取一个字节的数据,并返回该字节的值(范围在 0 到 255 之间),如果到达流的末尾则返回 -1 。int read(byte[] b)
: 将多个字节读入到字节数组b
中,并返回实际读取的字节数,如果到达流的末尾则返回 -1 。void close()
: 关闭输入流,释放相关资源。
(二)示例代码
import java.io.FileInputStream;
import java.io.IOException;
public class InputStreamExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("example.txt")) {
int byteRead;
while ((byteRead = fis.read())!= -1) {
System.out.print((char) byteRead);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
三、OutputStream
类
(一)常用方法
void write(int b)
: 将指定的字节写入输出流。void write(byte[] b)
: 将字节数组b
中的所有字节写入输出流。void close()
: 关闭输出流,确保数据被完整写入并释放相关资源。
(二)示例代码
import java.io.FileOutputStream;
import java.io.IOException;
public class OutputStreamExample {
public static void main(String[] args) {
try (FileOutputStream fos = new FileOutputStream("output.txt")) {
String content = "Hello, Byte Stream!";
fos.write(content.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
四、字节流的读写操作
(一)文件读写
- 读取文件
- 可以逐字节读取,也可以将多个字节读入字节数组进行处理。
- 写入文件
- 将字节数据或字节数组写入文件。
(二)网络传输
通过套接字(Socket)进行网络通信时,可使用字节流发送和接收数据。
(三)字节数组操作
在内存中对字节数组进行读写操作。
五、字节流的性能考虑
(一)缓冲区的使用
为了提高读写效率,可以使用缓冲区。例如,BufferedInputStream
和 BufferedOutputStream
类。
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class BufferedStreamExample {
public static void main(String[] args) {
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("example.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"))) {
int byteRead;
while ((byteRead = bis.read())!= -1) {
bos.write(byteRead);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
(二)批量读写
一次性读取或写入多个字节,而不是逐个字节操作。
六、实际应用场景
-
二进制文件处理
如图片、音频、视频等文件的读取和写入。 -
数据加密和解密
对字节数据进行加密或解密操作。 -
网络通信
在网络编程中传输二进制数据。
七、常见问题与注意事项
-
资源管理
使用完字节流后,一定要调用close
方法关闭流,以释放资源。 -
异常处理
读写操作可能会抛出IOException
,需要进行适当的捕获和处理。 -
字节顺序
在处理多字节数据(如整数、浮点数等)时,要注意字节的顺序(大端序或小端序)。 -
数据完整性
确保写入的数据完整,并在读取时正确解析。
八、总结
字节流是 Java 中处理二进制数据的重要手段,通过 InputStream
和 OutputStream
类及其相关的子类,可以实现各种字节数据的读写操作。在实际应用中,要根据具体需求合理选择字节流的类型,并注意性能优化和资源管理,以确保程序的高效和稳定运行。