Java字节流 #

一、InputStream #

1.1 常用方法 #

java
public abstract class InputStream {
    int read();                    // 读取一个字节
    int read(byte[] b);            // 读取到字节数组
    int read(byte[] b, int off, int len);  // 读取指定范围
    long skip(long n);             // 跳过n个字节
    int available();               // 可读取的字节数
    void close();                  // 关闭流
}

1.2 FileInputStream #

java
try (FileInputStream fis = new FileInputStream("test.txt")) {
    // 读取单个字节
    int data;
    while ((data = fis.read()) != -1) {
        System.out.print((char) data);
    }
    
    // 读取到字节数组
    byte[] buffer = new byte[1024];
    int len;
    while ((len = fis.read(buffer)) != -1) {
        System.out.println(new String(buffer, 0, len));
    }
}

1.3 BufferedInputStream #

java
try (BufferedInputStream bis = new BufferedInputStream(
        new FileInputStream("test.txt"))) {
    byte[] buffer = new byte[1024];
    int len;
    while ((len = bis.read(buffer)) != -1) {
        System.out.println(new String(buffer, 0, len));
    }
}

1.4 ByteArrayInputStream #

java
byte[] data = "Hello World".getBytes();

try (ByteArrayInputStream bais = new ByteArrayInputStream(data)) {
    int b;
    while ((b = bais.read()) != -1) {
        System.out.print((char) b);
    }
}

二、OutputStream #

2.1 常用方法 #

java
public abstract class OutputStream {
    void write(int b);             // 写入一个字节
    void write(byte[] b);          // 写入字节数组
    void write(byte[] b, int off, int len);  // 写入指定范围
    void flush();                  // 刷新缓冲区
    void close();                  // 关闭流
}

2.2 FileOutputStream #

java
try (FileOutputStream fos = new FileOutputStream("output.txt")) {
    // 写入单个字节
    fos.write(65);  // 'A'
    
    // 写入字节数组
    byte[] data = "Hello World".getBytes();
    fos.write(data);
    
    // 写入指定范围
    fos.write(data, 0, 5);  // "Hello"
    
    fos.flush();
}

2.3 BufferedOutputStream #

java
try (BufferedOutputStream bos = new BufferedOutputStream(
        new FileOutputStream("output.txt"))) {
    bos.write("Hello World".getBytes());
    bos.flush();
}

2.4 ByteArrayOutputStream #

java
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
    baos.write("Hello".getBytes());
    baos.write(" World".getBytes());
    
    byte[] result = baos.toByteArray();
    System.out.println(new String(result));  // Hello World
}

三、文件复制 #

3.1 基本复制 #

java
public static void copy(String src, String dest) throws IOException {
    try (FileInputStream fis = new FileInputStream(src);
         FileOutputStream fos = new FileOutputStream(dest)) {
        byte[] buffer = new byte[1024];
        int len;
        while ((len = fis.read(buffer)) != -1) {
            fos.write(buffer, 0, len);
        }
    }
}

3.2 使用缓冲流 #

java
public static void copyWithBuffer(String src, String dest) throws IOException {
    try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest))) {
        byte[] buffer = new byte[8192];
        int len;
        while ((len = bis.read(buffer)) != -1) {
            bos.write(buffer, 0, len);
        }
    }
}

3.3 使用Files(Java 7+) #

java
import java.nio.file.Files;
import java.nio.file.Paths;

Files.copy(Paths.get("src.txt"), Paths.get("dest.txt"));

四、DataInputStream/DataOutputStream #

4.1 写入基本类型 #

java
try (DataOutputStream dos = new DataOutputStream(
        new FileOutputStream("data.bin"))) {
    dos.writeInt(100);
    dos.writeDouble(3.14);
    dos.writeBoolean(true);
    dos.writeUTF("Hello");
}

4.2 读取基本类型 #

java
try (DataInputStream dis = new DataInputStream(
        new FileInputStream("data.bin"))) {
    int i = dis.readInt();
    double d = dis.readDouble();
    boolean b = dis.readBoolean();
    String s = dis.readUTF();
    
    System.out.println(i + ", " + d + ", " + b + ", " + s);
}

五、总结 #

说明
FileInputStream 文件输入流
FileOutputStream 文件输出流
BufferedInputStream 缓冲输入流
BufferedOutputStream 缓冲输出流
ByteArrayInputStream 字节数组输入流
ByteArrayOutputStream 字节数组输出流
DataInputStream 数据输入流
DataOutputStream 数据输出流

字节流要点:

  • 使用缓冲流提高性能
  • 使用try-with-resources自动关闭
  • 注意flush刷新缓冲区
最后更新:2026-03-26