之前面试一家小公司的时候被问到过,现在整理一下。
Java IO流的分类
Java IO流主要从两个维度分类:
字节流
什么是字节流?
计算机里所有数据(图片、视频、音频、文本、PDF)本质上都是字节(0和1的组合),所以字节流是万能流,可以处理任何类型的数据。
字节流的核心类
字节流的抽象基类是 InputStream(输入流)和 OutputStream(输出流),开发中最常用的是它们的子类:
FileInputStream | |
FileOutputStream | |
BufferedInputStream | |
BufferedOutputStream |
举个例子
字节流典型的应用——复制非文本文件(图片、视频、PDF)
import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;publicclassByteStreamExample{publicstaticvoidmain(String[] args){// 源文件路径(一张图片) String srcPath = "C:/test/photo.jpg";// 目标文件路径 String destPath = "C:/test/photo_copy.jpg";// 用try-with-resources自动关闭流,避免内存泄漏try (// 1. 创建文件字节输入流:从源文件读字节 FileInputStream fis = new FileInputStream(srcPath);// 2. 创建文件字节输出流:向目标文件写字节 FileOutputStream fos = new FileOutputStream(destPath) ) {// 3. 定义一个字节数组作为缓冲区(一次读1024字节,即1KB,提升性能)byte[] buffer = newbyte[1024];int len; // 记录每次实际读到的字节数// 4. 循环读写:fis.read(buffer)返回-1表示读到文件末尾while ((len = fis.read(buffer)) != -1) {// 只写实际读到的len个字节,避免最后一次写多余的空字节 fos.write(buffer, 0, len); } System.out.println("图片复制成功!"); } catch (IOException e) { e.printStackTrace(); } }}字符流
什么是字符流?
字符流是专门处理文本数据的流,它以【字符】为单位处理数据,内部会自动处理编码转换(比如把UTF-8编码的字节转成Java的char字符)。
为什么不用字节流处理文本?
因为中文、日文等非ASCII字符占多个字节(比如UTF-8编码的中文占3个字节)。
如果用字节流读,可能会把一个汉字的3个字节截断,从而导致乱码;
而字符流会自动识别编码,按字符读取,不会乱码。
字符流的核心类
字符流的抽象基类是 Reader(输入流)和 Writer(输出流),开发中最常用的是它们的子类:
FileReader | |
FileWriter | |
BufferedReader | |
BufferedWriter | |
InputStreamReader | |
OutputStreamWriter |
举个例子
BufferedReader的readLine()方法可以按行读取文本,非常方便。
import java.io.BufferedReader;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.nio.charset.StandardCharsets;publicclassCharacterStreamExample{publicstaticvoidmain(String[] args){ String filePath = "C:/test/中文文章.txt";// 用转换流InputStreamReader,显式指定UTF-8编码,避免乱码try (// 1. 先创建字节输入流 FileInputStream fis = new FileInputStream(filePath);// 2. 用转换流把字节流转成字符流,显式指定UTF-8编码 InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);// 3. 用缓冲流包装,提升性能,且有readLine()方法 BufferedReader br = new BufferedReader(isr) ) { String line;int lineNum = 1;// readLine()返回null表示读到文件末尾while ((line = br.readLine()) != null) { System.out.println("第" + lineNum + "行:" + line); lineNum++; } } catch (IOException e) { e.printStackTrace(); } }}
文章来源:
四季读书网
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至23467321@qq.com举报,一经查实,本站将立刻删除;如已特别标注为本站原创文章的,转载时请以链接形式注明文章出处,谢谢!