Java IO 编码与桥接

Java IO 编码与桥接:字符集、编码转换与乱码解决方案全解析 1 ⚠️ 问题切入:一段乱码代码 先看一段在实际开发中经常遇到的代码。这段代码在不同操作系统上运行,结果 完全不同 : public class GarbledDemo { public static void main(String[] args) throws Exception { // 在 Windows 中文系统上运行(默认 GBK) try (FileWriter writer = new FileWriter("hello.txt")) { writer.write("你好,世界!"); } // 在 Linux 服务器上读取(默认 UTF-8) try (FileReader reader = new FileReader("hello.txt")) { char[] buf = new char[1024]; int len = reader.read(buf); System.out.println(new String(buf, 0, len)); // 输出:你好,世界! ← 正常 // 还是:���← 乱码? // 取决于操作系统! } } } 为什么同一段代码在不同环境下表现不同?因为 FileReader / FileWriter 使用 JVM 默认编码 (通常是操作系统默认编码),而 Windows 中文版默认是 GBK ,Linux 默认是 UTF-8 。写入和读取时编码不一致,就会产生 乱码 (Mojibake,指因字符编码不匹配导致的不可读字符)。 ...

九月 9, 2022 · 8 分钟 · 1535 字 · yaomingye

Java IO 缓冲流与装饰器模式

Java IO 缓冲流与装饰器模式:从性能对比到设计模式全解析 1 ⚡ 问题切入:为什么单字节读取一个 10MB 文件要 30 秒? 先看一段能跑的代码。下面这段程序用 FileInputStream 的 read() 方法,一个字节一个字节地读取一个 10MB 的文件,并写入到另一个文件: // 无缓冲:单字节读取 try (FileInputStream fis = new FileInputStream("source_10mb.bin"); FileOutputStream fos = new FileOutputStream("dest_10mb.bin")) { int b; while ((b = fis.read()) != -1) { // 每次只读 1 字节 fos.write(b); // 每次只写 1 字节 } } 在我的机器上(Windows 11,SSD),这段代码的运行耗时约为 28,000 ms (28 秒)。 现在再看另一段代码,功能完全一样,只是在外层各包了一个缓冲流: // 有缓冲:仍然单字节读取 try (BufferedInputStream bis = new BufferedInputStream( new FileInputStream("source_10mb.bin")); BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream("dest_10mb.bin"))) { int b; while ((b = bis.read()) != -1) { // 仍然每次只读 1 字节 bos.write(b); // 仍然每次只写 1 字节 } } 耗时:约 150 ms 。两者相差约 180 倍 。代码逻辑完全一样(都是循环内单字节读写),一行包的差别,性能天差地别。 ...

九月 9, 2022 · 10 分钟 · 1942 字 · yaomingye

Java IO API 基础入门

Java IO API 基础入门:File 类、字节流与字符流使用指南 1 📁 File 类(文件路径操作) java.io.File 是 Java IO 包中最基础的类,它表示文件系统中的一个 路径 (文件或目录),提供创建、删除、判断、遍历等操作。核心概念:File 对象只是一个 路径的抽象表示 ,创建 File 对象时不会检查文件或目录在磁盘上是否真实存在。 1.1 🏗️ 构造器与路径表示 构造器 说明 new File("path") 接收一个路径字符串,支持相对路径和绝对路径 new File("parent", "child") 接收父路径和子路径,自动拼接分隔符 File f1 = new File("D:/data/test.txt"); // 绝对路径 File f2 = new File("./data/test.txt"); // 相对路径(相对于项目根目录) File f3 = new File("D:/data", "test.txt"); // 父路径 + 子路径 关键陷阱 :new File("path") 只是在内存中构造了一个路径对象,不会检查文件是否真实存在 ,也不会创建文件。这意味着即使路径指向一个不存在的文件,构造器也不会抛异常。 1.2 🔍 文件/目录判断 判断一个路径在磁盘上是否存在、是文件还是目录: 方法 返回值 说明 exists() boolean 路径对应的文件或目录是否存在 isFile() boolean 是否存在且是文件(不是目录) isDirectory() boolean 是否存在且是目录(不是文件) File file = new File("D:/data/test.txt"); if (file.exists()) { System.out.println(file.isFile() ? "是文件" : "是目录"); } else { System.out.println("路径不存在"); } 注意事项: ...

九月 7, 2022 · 5 分钟 · 1024 字 · yaomingye
Cat Radio