Java:IO流
一、IO 流核心概念与整体体系1. 什么是 IO 流IOInput 输入、Output 输出流数据在设备间按字节 / 字符顺序传输的通道Java IO 用于文件读写、网络传输、数据持久化。2. IO 流两大核心分类IO流 ├─ 字节流以 1字节(8bit) 为单位 │ 适合图片、视频、音频、压缩包、所有二进制文件 │ 顶层父类InputStream / OutputStream └─ 字符流以 1字符 为单位底层字节流编码表 适合纯文本文件 txt/java/html 顶层父类Reader / Writer3. 四大抽象基类总览字节输入InputStream字节输出OutputStream字符输入Reader字符输出Writer四大基类都是抽象类不能直接 new只能用子类实现。二、字符流体系Reader / Writer1. 字符输入流 Reader继承层级简图Reader 抽象父类 ├─ FileReader 文件字符输入流 ├─ InputStreamReader 字节转字符转换流 └─ BufferedReader 缓冲字符输入流高效、按行读各类作用FileReader直接按字符读取文本文件使用默认编码。InputStreamReader转换流把字节流转字符流可手动指定编码解决乱码。BufferedReader带缓冲区效率高独有readLine()按整行读取。完整代码示例try-with-resources 自动关流import java.io.*; public class CharInputDemo { public static void main(String[] args) { // 1. FileReader 单个字符读取 try (FileReader fr new FileReader(test.txt)) { int ch; while ((ch fr.read()) ! -1) { System.out.print((char) ch); } } catch (IOException e) { e.printStackTrace(); } // 2. 转换流 指定UTF-8编码 try (InputStreamReader isr new InputStreamReader(new FileInputStream(test.txt), UTF-8)) { int ch; while ((ch isr.read()) ! -1) { System.out.print((char) ch); } } catch (IOException e) { e.printStackTrace(); } // 3. BufferedReader 按行读取 try (BufferedReader br new BufferedReader(new FileReader(test.txt))) { String line; while ((line br.readLine()) ! null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } } }2. 字符输出流 Writer继承层级简图Writer 抽象父类 ├─ FileWriter 文件字符输出流 ├─ OutputStreamWriter 字符转字节转换流 └─ BufferedWriter 缓冲字符输出流各类作用FileWriter向文本文件写入字符默认覆盖原文件。OutputStreamWriter转换流指定编码写入防止乱码。BufferedWriter缓冲高效写入独有newLine()跨平台换行。完整代码示例import java.io.*; public class CharOutputDemo { public static void main(String[] args) { // 1. FileWriter 基础写入 try (FileWriter fw new FileWriter(output.txt)) { fw.write(Hello World); fw.write(\nJava IO学习); } catch (IOException e) { e.printStackTrace(); } // 2. 转换流 指定编码 try (OutputStreamWriter osw new OutputStreamWriter(new FileOutputStream(output.txt), UTF-8)) { osw.write(指定UTF-8编码写入); } catch (IOException e) { e.printStackTrace(); } // 3. BufferedWriter 缓冲按行写入 try (BufferedWriter bw new BufferedWriter(new FileWriter(output.txt))) { bw.write(第一行内容); bw.newLine(); bw.write(第二行内容); } catch (IOException e) { e.printStackTrace(); } } }3. Writer 五大写入方法表格 代码方法签名功能说明write(int c)写入单个字符write(char[] cbuf)写入整个字符数组write(char[] cbuf,int off,int len)从数组 off 位置开始写入 len 个字符write(String str)写入整个字符串write(String str,int off,int len)写入字符串部分内容import java.io.FileWriter; import java.io.IOException; import java.io.Writer; public class WriterMethodDemo { public static void main(String[] args) { try (Writer writer new FileWriter(writer_demo.txt)) { writer.write(H); char[] arr {e,l,l,o}; writer.write(arr); writer.write(arr,1,2); writer.write( World!); String s \nThis is Java IO; writer.write(s,0,11); } catch (IOException e) { e.printStackTrace(); } } }三、字节流体系InputStream / OutputStream1. 字节流特点一切文件都能用字节流读写字符流只能文本字节流通用所有文件2. 字节输入流 InputStream常用核心方法read()读单个字节末尾返回-1read(byte[] b)批量读入字节数组read(byte[] b,int off,int len)读指定长度close()关闭流释放资源常用实现类FileInputStream代码示例import java.io.*; public class ByteInputDemo { public static void main(String[] args) { try (FileInputStream fis new FileInputStream(test.txt)) { byte[] buffer new byte[1024]; int len; while ((len fis.read(buffer)) ! -1) { System.out.print(new String(buffer,0,len)); } } catch (IOException e) { e.printStackTrace(); } } }3. 字节输出流 OutputStream常用实现类FileOutputStream代码示例import java.io.*; public class ByteOutputDemo { public static void main(String[] args) { try (FileOutputStream fos new FileOutputStream(byte_output.txt)) { fos.write(中国人\r\n.getBytes()); fos.write(ABCDEFG.getBytes(),2,4); } catch (IOException e) { e.printStackTrace(); } } }四、IO 流分类总表汇总背诵版流类型抽象基类常用实现类适用场景字符输入流ReaderFileReader、InputStreamReader、BufferedReader读取文本字符输出流WriterFileWriter、OutputStreamWriter、BufferedWriter写入文本字节输入流InputStreamFileInputStream、BufferedInputStream图片 / 视频 / 任意文件读字节输出流OutputStreamFileOutputStream、BufferedOutputStream图片 / 视频 / 任意文件写五、重点补充资源关闭IO 流占用系统资源必须关闭推荐try-with-resources自动关闭流不用手动写close()。缓冲流优势Buffered 开头的缓冲流内置缓冲区减少磁盘 IO 次数读写效率远高于普通流。转换流核心作用InputStreamReader / OutputStreamWriter字节流 ↔ 字符流 桥梁可手动指定编码解决中文乱码问题使用场景硬性规则文本文件优先字符流图片、视频、音频、压缩包必须用字节流禁止用字符流解析二进制文件会损坏数据换行区别BufferedWriter.newLine()跨平台通用换行\n只适合 Linux\r\n适合 Windows文件写入覆盖与追加new FileWriter(a.txt,true)/new FileOutputStream(a.txt,true)第二个参数为 true追加写入不覆盖原文件。