IO面试题
首先转载写本文前学习时借鉴的三个技术博客:
标题:《深入理解Java中的IO》 作者:沉淀所有的痛 链接:https://www.cnblogs.com/ylspace/p/8128112.html
标题:《吃透Java IO:字节流、字符流、缓冲流》 作者:云深i不知处 链接:https://blog.csdn.net/mu_wind/article/details/108674284
标题:《Java NIO系列教程(十二) Java NIO与IO》 作者:郭蕾 链接:http://ifeve.com/java-nio-vs-io/
下图这是IO流对象的大类
字节流简单示例
public class IODemo { public static void main(String[] args) throws IOException { File file = new File("……"); File file2 = new File("……"); InputStream input = new FileInputStream(file); OutputStream output = new FileOutputStream(file2); int i; while ((i = input.read()) != -1) { output.write(i); }
input.close();
output.close();
} }
字符流,注意含中文时须使用InputStreamReader指定字符编码,不然会导致乱码
public class IODemo2 { public static void main(String[] args) throws IOException { File file = new File("……"); File file2 = new File("……"); FileInputStream fileInputStream = new FileInputStream(file); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream,"GBK")); FileWriter fileWriter = new FileWriter(file2,true); BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); String s ; StringBuilder sb = new StringBuilder(); while ((s=bufferedReader.readLine())!=null){ bufferedWriter.write(String.valueOf(s)); bufferedWriter.newLine(); } bufferedReader.close(); bufferedWriter.close(); } }
下面是自己的理解:
因为目前对IO的体系认知有限,本文先从面试题入手:
1.Java IO流有什么特点?
与NIO相比,IO流的特点是:面向流,数据不能乱序处理,阻塞。 抽象成本身特点:先进先出,顺序存取,只读只写(阻塞)。
2.Java IO流分为几种类型?
根据数据流向,分为输入流,输出流。根据数据处理单位,分为字节流,字符流。根据功能,分为节点流,处理流(包括缓冲流)。
3.字节流和字符流的关系与区别?
字节流按每个字节为单位处理,但是不同字符在不同编码下所占字节不同,如果都按字节读写,可能造成乱码。于是有了按照字符读写的字符流,字符流本质是在字节流的基础上增加了缓冲区一次性处理多个字节,以达到处理每个字符的效果。
4.字符流是否使用了缓冲?
是。字符流本质是在字节流的基础上增加了缓冲区,以达到处理每个字符(可能是多个字节)的效果。
5.缓冲流的效率一定高吗?为什么?
不一定。缓冲流在在处理过长的字符串时,如果字符串长度超过缓冲区长度,则会冲刷后直接读写,不经过缓冲区,反而降低效率。
6.缓冲流体现了Java中的哪种设计模式思想?
装饰者模式(还未消化)。
7.为什么要IO流使用完一定Close?
因为IO不仅使用了Java的内存(用户态),还调用了系统资源(内核态),如果不手动Close,Java的GC可以回收这部分内存,但是系统资源会一直被占用。
8.了解NIO吗?
New IO或者Non-blocking IO,即没有阻塞的新IO。NIO三大组件Channels、Buffers、Selectors,特点是面向缓冲、没阻塞和选择器,可以通过Selector可以做到一个线程监听多个Channel。多路复用(有待消化)。
9.为什么要实现序列化?如何实现序列化?
把Java对象转化成二进制形式,在网络间传输或者存储到磁盘上,称为序列化过程。反之转化成Java对象称为反序列化,实现serializable接口,标志性接口没有任何抽象方法。通过ObjectInputStream和ObjectOutputStream实现序列化和反序列化。
10.序列化数据后,再次修改类文件,读取数据会出问题,如何解决呢?
报错时会提示serialVersionUID相关,自己定义一个常量private static final long serialVersionUID,保持版本一致就好了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)