java 基础—IO流

记住口诀:
“先分字节/字符,再分输入/输出,最后看是否带缓冲/转换/对象。”

IO 家谱(只记常用即可)

1. 字节流(raw binary)
   InputStream  ←┬─ FileInputStream  
                 ├─ BufferedInputStream  
                 └─ ObjectInputStream  

   OutputStream ┬─ FileOutputStream  
                ├─ BufferedOutputStream  
                └─ ObjectOutputStream  

2. 字符流(text,自动编码)
   Reader  ←┬─ FileReader  
            ├─ BufferedReader  
            └─ InputStreamReader (桥:字节→字符)

   Writer  ┬─ FileWriter  
           ├─ BufferedWriter  
           └─ OutputStreamWriter

10 段必会代码

文件复制(裸字节流)

try (InputStream in = new FileInputStream("src.jpg");
     OutputStream out = new FileOutputStream("dst.jpg")) {
    byte[] buf = new byte[1024];
    int len;
    while ((len = in.read(buf)) != -1) out.write(buf, 0, len);
}

加缓冲 → 提速 5~10 倍

try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("src.jpg"));
     BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("dst.jpg"))) {
    byte[] buf = new byte[8192];
    int len;
    while ((len = bis.read(buf)) != -1) bos.write(buf, 0, len);
}

逐行读文本(最常用)

try (BufferedReader br = new BufferedReader(new FileReader("poem.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
}

指定编码读写 → 避免中文乱码

try (BufferedReader br = new BufferedReader(
        new InputStreamReader(new FileInputStream("log.txt"), StandardCharsets.UTF_8));
     BufferedWriter bw = new BufferedWriter(
        new OutputStreamWriter(new FileOutputStream("out.txt"), StandardCharsets.UTF_8))) {
    String line;
    while ((line = br.readLine()) != null) bw.write(line + "\n");
}

控制台输入(JDK 8 前写法)

BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输入名字:");
String name = console.readLine();
System.out.println("你好," + name);

对象序列化 → 写对象到文件

class User implements Serializable {   // 必须实现 Serializable
    private static final long serialVersionUID = 1L;
    String name;
    int age;
}

try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.dat"))) {
    oos.writeObject(new User("Tom", 18));
}

反序列化 → 读对象

try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.dat"))) {
    User u = (User) ois.readObject();
    System.out.println(u.name + " " + u.age);
}

批量序列化集合

List<User> list = List.of(new User("A", 1), new User("B", 2));
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("list.dat"))) {
    oos.writeObject(list);   // 整个 List 都是 Serializable
}

打印流 → 方便写文本/控制台

try (PrintWriter pw = new PrintWriter(new FileWriter("out.txt"))) {
    pw.printf("PI=%.2f%n", Math.PI);
    pw.println("Hello PrintWriter");
}

随机读写文件(Seek 任意位置)

try (RandomAccessFile rf = new RandomAccessFile("demo.txt", "rw")) {
    rf.seek(rf.length());      // 追加
    rf.writeUTF("追加一行\n");
    rf.seek(0);                // 回到开头
    System.out.println(rf.readUTF());
}

易错点提醒

  1. 字符流默认用 系统编码,跨平台易乱码,务必显式指定 UTF-8。

  2. 对象序列化必须:

    • 实现 Serializable

    • serialVersionUID(兼容升级)

    • 不想序列化的字段加 transient

  3. 读写文本优先用 BufferedReader/BufferedWriter,性能高且支持 readLine()

  4. 操作完一定关流;JDK 7+ 统一用 try-with-resources,自动关、代码少、异常不丢失。

  5. flush() 时机:缓冲流/打印流在 写完后手动 flushclose() 前自动 flush

速记口诀再背一遍

字节字符先分清,
输入输出对称行;
缓冲提速桥转换,
对象序列要加号;
读写文本 Buffer 先行,
try-with-resources 关闭省心!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值