Appearance
Java IO - 03 字节流
本文主要介绍在Java中如何利用字节流进行文件的读写。字节流是指以字节为单位进行传输数据的流。接口为InputStream和Outputstream。
Java IO流体系如下:

1. 字节输入流
字节输入流是指以字节为单位,从硬盘或网络获取数据到内存中的流。这里以FileInputStream为例,介绍字节输入流:
java
public static void main(String[] args) throws IOException {
// 打开字节输入里
InputStream inputStream = new FileInputStream("src/main/resources/data.txt");
byte[] buffer = new byte[1024]; // 定义字节缓冲区
int readLenfth = inputStream.read(buffer); // 读取到的字节数
while (readLenfth != -1) { // 如果到达了文件末尾,则读取到的字节数为-1
System.out.print(new String(buffer, 0, readLenfth));
readLenfth = inputStream.read(buffer);
}
// 关闭字节输入流
inputStream.close();
}字节输入流不能解决中文乱码问题。
2. 字节输出流
字节输出流是指以字节为单位,将数据从内存写出到硬盘或网络中的流。这里以FileOutputStream为例,介绍字节输出流:
java
public static void main(String[] args) throws IOException {
// 1. 打开字节输出流,可以覆盖写入或追加写入
OutputStream outputStream = new FileOutputStream("src/main/resources/output.txt");
// 2. 准备数据
String data = "hello world, 你好 世界";
// 3. 写入数据
outputStream.write(data.getBytes(StandardCharsets.UTF_8));
// 4. 刷新缓冲区
outputStream.flush();
// 5. 关闭字节输出流
outputStream.close();
}3. 案例:复制文件
利用字节输入流和字节输出流,实现文件的复制:
java
public static void main(String[] args) throws IOException {
// 准备字节输入流和输出流,输入流作为源文件,输出流作为目标地址
InputStream inputStream = new FileInputStream("src/main/resources/data.txt");
OutputStream outputStream = new FileOutputStream("src/main/resources/data_copy.txt");
// 实现复制
byte[] buffer = new byte[1024];
int readLength;
while ((readLength = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, readLength);
}
// 关闭资源
outputStream.close();
inputStream.close();
}字节流可以复制一切文件。
4. 关闭资源方案
4.1 try-catch-finally
java
public static void main(String[] args) {
// 1. 打开字节输出流,可以覆盖写入或追加写入
OutputStream outputStream = null;
try{
outputStream = new FileOutputStream("src/main/resources/output.txt");
// 2. 准备数据
String data = "hello world, 你好 世界";
// 3. 写入数据
outputStream.write(data.getBytes(StandardCharsets.UTF_8));
// 4. 刷新缓冲区
outputStream.flush();
}catch (Exception e){
// 处理异常
e.printStackTrace();
}finally {
if(outputStream != null){
// 5. 关闭字节输出流
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}在finally块中关闭资源。
4.2 try-with-resource

java
public static void main(String[] args) {
// 1. 打开字节输出流,可以覆盖写入或追加写入
try(OutputStream outputStream = new FileOutputStream("src/main/resources/output.txt");){
// 2. 准备数据
String data = "hello world, 你好 世界";
// 3. 写入数据
outputStream.write(data.getBytes(StandardCharsets.UTF_8));
// 4. 刷新缓冲区
outputStream.flush();
}catch (Exception e){
// 处理异常
e.printStackTrace();
}
}