Java IO 面试题总结及详细答案(完整版)_第1页
Java IO 面试题总结及详细答案(完整版)_第2页
Java IO 面试题总结及详细答案(完整版)_第3页
Java IO 面试题总结及详细答案(完整版)_第4页
Java IO 面试题总结及详细答案(完整版)_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JavaIO面试题总结及详细答案(完整版)本文整理互联网Java后端面试高频IO相关题目,覆盖基础概念、流分类、字节流/字符流、缓冲流、序列化、NIO基础、IO实战坑点等核心考点,答案贴合工程实战,通俗易懂,适合面试背诵与复盘。一、IO基础核心面试题1、什么是JavaIO?IO的核心作用是什么?JavaIO是Java程序实现数据输入、输出传输的一套API体系,核心用于完成程序与外部设备的数据交互,包括读取外部数据、向外输出数据。输入(Input):外部数据读取到程序内存中,是读数据的过程;输出(Output):程序内存中的数据写入外部设备,是写数据的过程;常见外部设备包含本地文件、网络端口、内存、磁盘、控制台等。2、JavaIO流的核心分类方式有哪些?Java所有流的顶层抽象类分为四类,结合使用场景可分为三种分类维度,面试重点掌握前两种:(1)按数据传输单位划分(核心考点)字节流:以字节(byte)为单位传输,通用型流,可处理所有类型数据(文本、图片、视频、音频、压缩包等),顶层父类:InputStream、OutputStream。字符流:以字符(char)为单位传输,专为文本数据设计,会自动处理字符编码,只能处理纯文本文件(txt、java、html等),顶层父类:Reader、Writer。(2)按数据流向划分输入流:读取数据到程序,InputStream、Reader;输出流:从程序写出数据,OutputStream、Writer。(3)按功能特性划分节点流(基础流):直接对接数据源/目的地,直接读写数据,如FileInputStream、FileReader;处理流(包装流):包装节点流,增强读写性能和功能,不直接对接数据源,如Buffered缓冲流、转换流、序列化流。3、字节流和字符流的核心区别?面试必背1、传输单位不同:字节流传输字节(8位),字符流传输字符(16位,Javachar固定双字节);2、处理数据类型不同:字节流适配所有文件类型,字符流仅适配文本文件;3、编码处理不同:字节流不处理编码,直接读写原始字节,容易出现中文乱码;字符流内置编码转换机制,可指定编码,完美解决文本乱码问题;4、缓冲区机制不同:基础字节流无默认缓冲,IO效率低;字符流自带内置缓冲区,默认8192字节,读写效率更高;5、关闭资源优先级:字符流必须手动flush刷新缓冲区,否则数据残留缓冲区无法写入文件;字节流无需手动flush,直接写入磁盘。4、为什么字符流一定要flush?不flush会有什么问题?字符流读写数据依赖内置缓冲区,程序写出数据时,数据会先存入内存缓冲区,而非直接写入磁盘文件。如果不调用flush()方法刷新,缓冲区未满时,数据会一直停留在内存中,不会落地到文件,导致文件空白、数据丢失。补充:close()方法关闭流之前,会自动执行一次flush(),所以正常关闭流也能保证数据落地,但实战中建议手动flush,规避数据丢失风险。5、IO流父类为什么是抽象类,不能直接实例化?InputStream、OutputStream、Reader、Writer均为抽象类,定义了IO流通用的核心方法(read、write、close等),规范所有流的行为标准。但不同数据源(文件、内存、网络)的读写实现逻辑完全不同,抽象类无法统一实现,只能由子类根据具体场景重写方法、完成具体读写操作,因此只能实例化子类,不能直接使用父类。二、缓冲流高频面试题1、什么是缓冲流?核心作用是什么?缓冲流是IO体系中的包装流,基于基础节点流进行封装,内置大容量内存缓冲区,是日常开发最常用的IO流。核心作用:减少磁盘IO次数,大幅提升读写效率。普通节点流每次读写都会直接操作磁盘,磁盘读写速度远低于内存,频繁IO会造成性能损耗;缓冲流会一次性批量读取/写入大量数据到缓冲区,程序直接操作内存缓冲区,极大减少磁盘交互次数,提升性能。常用缓冲流:BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter。2、BufferedReader相比FileReader的优势?1、性能更高:内置8KB缓冲区,批量读写,减少磁盘IO;2、功能更强:提供readLine()核心方法,可按行读取文本数据,适配日志、配置文件等逐行读取场景,FileReader只能逐字符读取;3、使用更便捷:支持跳过空行、批量读取,代码简洁度更高。3、缓冲流使用过程中,资源关闭的顺序有要求吗?有要求,必须遵循先开后关,后开先关的原则。缓冲流是包装流,依赖底层节点流存在,创建顺序:先创建节点流,再包装缓冲流;关闭顺序:先关闭外层缓冲流,再关闭内层节点流。补充:如果使用try-with-resources自动关闭资源,无需手动关注顺序,JVM会自动按创建逆序关闭所有流,也是开发首选方式。三、转换流、乱码问题面试题1、转换流的作用是什么?有哪两个核心类?转换流是字节流与字符流之间的桥梁,核心作用是解决文本文件读写乱码问题,自定义指定编码格式。日常开发中,文件编码(GBK、UTF-8)和程序默认编码不一致是乱码的核心原因,转换流可手动指定读写编码,彻底规避乱码。两个核心类:InputStreamReader:字节输入流转字符输入流,读取文件时指定编码;OutputStreamWriter:字节输出流转字符输出流,写入文件时指定编码。2、JavaIO中文乱码的根本原因和解决方案?根本原因:文件存储编码、程序读取编码、写入编码三者不统一。比如文件为UTF-8编码,程序默认使用GBK读取,字节解析规则不同,就会出现乱码。标准解决方案:1、使用转换流InputStreamReader/OutputStreamWriter,手动统一指定UTF-8编码读写;2、新项目统一所有文件、代码、工具类编码为UTF-8,从源头避免乱码;3、禁止使用默认编码读写,所有IO操作显式指定编码。四、序列化与反序列化面试核心题1、什么是序列化、反序列化?应用场景是什么?序列化:将Java内存中的对象,转换为可传输、可存储的字节序列的过程;反序列化:将磁盘、网络传输的字节序列,还原为Java对象的过程。核心应用场景:1、对象持久化:将对象保存到本地文件、数据库;2、网络传输:分布式系统中不同服务之间传输对象数据;3、缓存存储:Redis、缓存框架存储Java对象。2、Java实现序列化的两种方式?区别是什么?方式一:实现Serializable接口(常用)标记式接口,无任何抽象方法,仅用于标识当前类可序列化,默认序列化所有非transient修饰的成员变量。方式二:实现Externalizable接口需要重写writeExternal、readExternal方法,手动指定需要序列化的字段,可控性更强。核心区别:Serializable:JVM自动完成序列化,使用简单,灵活性低;Externalizable:手动自定义序列化规则,效率更高、可控性强,但代码冗余。3、transient关键字的作用?transient用于修饰成员变量,被修饰的变量不会参与序列化过程,序列化后该字段值为默认值(数值0、布尔false、引用null)。适用场景:临时变量、敏感数据(密码、密钥)、可计算衍生数据,无需持久化和传输的字段。4、serialVersionUID的作用?不定义会有什么问题?serialVersionUID是序列化版本号,用于校验序列化前后的类版本是否一致,保证反序列化兼容性。不手动定义的问题:如果不手动赋值,JVM会根据类的结构、字段、方法自动生成版本号。当类新增/删除字段、修改方法后,自动生成的版本号会改变,反序列化时版本号不匹配,直接抛出InvalidClassException异常,反序列化失败。开发规范:所有序列化类手动固定版本号,保证类小幅修改后,依旧可以兼容旧版本序列化数据。五、IO实战坑点与异常处理1、IO流使用中最常见的问题是什么?如何避免?最核心问题:流资源未关闭,造成资源泄露、文件占用、内存泄漏。IO流属于系统资源,不属于JVM堆内存,GC无法回收,必须手动关闭。如果持续打开流不关闭,会导致文件句柄耗尽、程序卡顿、服务宕机。标准解决方案:1、优先使用JDK7+try-with-resources语法,自动关闭流,无需手动写finally关闭代码;2、传统写法必须在finally代码块中关闭流,保证异常情况下资源也能释放;3、关闭前判断流对象非空,避免空指针异常。2、文件拷贝过程中,字节流和字符流如何选择?1、纯文本文件(txt、md、java、xml):优先使用字符缓冲流,效率高、无乱码;2、非文本文件(图片、视频、压缩包、exe、pdf):必须使用字节流,字符流会导致文件字节丢失、文件损坏无法打开;3、通用文件拷贝场景:直接使用字节缓冲流,适配所有文件类型,无需区分文件格式。3、为什么不推荐使用read()单字节循环读写?read()无参方法每次仅读取1个字节,循环次数极多,磁盘IO交互频繁,读写效率极低,大文件场景下会严重卡顿。实战标准写法:使用字节数组/字符数组作为缓冲区,批量读写,配合缓冲流使用,大幅提升性能。六、BIO核心面试简答(基础进阶)1、什么是BIO?优缺点是什么?BIO即同步阻塞IO,是Java传统的普通IO,所有基础File流、缓冲流都属于BIO。特点:同步执行、阻塞等待,线程发起IO请求后,会一直阻塞直到IO读写完成,期间无法执行其他任务。优点:代码简单、易懂、开发成本低,小并发、小文件场景稳定可靠;缺点:并发能力极差,一个线程只能处理一个IO请求,高并发场景下线程资源耗尽,性能瓶颈明显,不适合网络高并发场景。2、BIO的适用场景?适合文件本地读写、低并发、简单数据传输场景;不适合互联网高并发网络通信场景,高并发场景优先使用NIO。七、面试高频简答题汇总(精简背诵版)1、字节流能否读取文本文件?可以,但容易出现中文乱码,且无缓冲效率低,不推荐。文本文件优先使用字符流。2、字符流能否读取图片视频?不能,字符流会对字节进

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论