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

下载本文档

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

文档简介

JavaIO高频面试题及详细答案(实战版)一、JavaIO基础核心面试题1、简述JavaIO的整体分类体系?JavaIO核心分为传统BIO(阻塞IO)和NIO(非阻塞IO)两大体系,日常面试和开发中重点使用BIO字节流、字符流和NIO三大模块。传统BIO按照数据传输单元分为两类:字节流:顶层父类是InputStream、OutputStream。万能流,可处理所有类型文件(文本、图片、视频、压缩包等),以字节为单位读写。字符流:顶层父类是Reader、Writer。专门处理纯文本文件,以字符为单位读写,自带编码处理机制,不会出现字节流读写文本的乱码问题。按照功能又可分为:节点流(直接操作文件/数据源)、处理流(包装节点流,增强读写性能)。2、字节流和字符流的核心区别是什么?工作场景如何选择?核心区别:读写单位不同:字节流按1字节读写,字符流按1字符读写(中文一般2-3字节)。处理对象不同:字节流适配所有文件类型,字符流仅适配纯文本文件。编码处理不同:字节流不处理编码,容易乱码;字符流内置编码解析,自动适配字符编码。缓冲区不同:基础字节流无缓冲区,直接读写磁盘;字符流默认带缓冲区,需手动刷新或关闭流才会写入文件。场景选择:图片、视频、音频、压缩包、二进制文件:必须用字节流。txt、java、xml、json等纯文本文件:优先使用字符流,效率更高、无乱码。3、IO流为什么必须关闭?close()和flush()的区别?为什么必须关流:IO流属于系统资源,而非JVM内存资源。JVM的垃圾回收机制无法回收文件句柄、网络端口这类系统资源。如果不关闭,会造成资源泄露、文件占用、服务器句柄溢出,最终导致程序报错崩溃。close()和flush()区别:flush():仅刷新缓冲区,将缓冲区内残留的数据强制写入目标文件/通道,不会关闭流,流可以继续读写数据。close():先自动执行flush()刷新缓冲区,再关闭流、释放系统资源。流关闭后无法继续读写。日常开发中,只要调用close()就无需手动flush(),但如果需要分段写入文件、中途不关闭流,必须手动flush。4、try-with-resources语法的作用和优势?try-with-resources是JDK7推出的自动资源释放语法,所有实现了AutoCloseable、Closeable接口的IO流、数据库连接等资源,都可以通过该语法自动关闭。核心优势:无需手动写finally代码块关闭流,代码更简洁。避免手动关流时出现的遗漏、异常导致关流失效问题。资源会在try代码块执行完毕后,自动按逆序关闭,资源安全性更高。二、缓冲流高频面试题5、普通流和缓冲流的区别?为什么缓冲流效率更高?普通节点流(FileInputStream、FileReader等)每次读写都会直接操作磁盘,磁盘IO速度极慢,频繁读写会严重损耗性能。缓冲流(BufferedInputStream、BufferedReader等)是包装流,底层自带默认大小的内存缓冲区(字节流8KB、字符流8192字符)。高效原理:程序读写时,会一次性从磁盘读取大批量数据存入缓冲区,后续程序直接从内存缓冲区读取数据;写入数据时先写入缓冲区,攒满缓冲区后一次性写入磁盘。大幅减少磁盘IO次数,这是缓冲流提速的核心原因。6、BufferedReader的readLine()方法特点?会读取换行符吗?readLine()是字符缓冲流的核心方法,用于逐行读取文本内容。核心特点:读取到换行符\n、回车符\r或文件末尾时,结束当前行读取。不会返回换行符和回车符,只返回纯文本内容。文件读取完毕后,返回null,可作为循环读取的终止条件。三、文件读写与乱码问题面试题7、JavaIO读写文本出现乱码的原因及解决方案?乱码核心原因:文件编码格式和程序读取编码格式不一致。常见场景:文件为UTF-8编码,程序默认用GBK读取,就会出现中文乱码。解决方案:使用转换流InputStreamReader、OutputStreamWriter,手动指定统一编码(UTF-8)。JDK11之后,BufferedReader、FileReader支持直接指定编码,简化代码。保证文件保存编码、程序读写编码、项目编码三者统一。8、转换流的作用是什么?和普通字符流有什么区别?转换流是字节流转字符流的桥梁,核心作用是解决编码乱码问题、自定义读写编码。InputStreamReader:字节输入流转字符输入流,可指定读取编码。OutputStreamWriter:字节输出流转字符输出流,可指定写入编码。普通FileReader/FileWriter只能使用系统默认编码,无法自定义,极易出现跨平台乱码;转换流支持手动指定UTF-8等标准编码,是企业开发读写文本的首选。四、序列化与反序列化面试题9、什么是Java序列化?用途是什么?序列化是将Java对象(内存数据)转换成字节序列的过程;反序列化是将字节序列还原为Java对象的过程。核心用途:对象持久化:将对象保存到本地文件,实现数据落地存储。网络传输:RPC调用、Socket通信中,传输对象数据。Java中对象序列化必须实现Serializable空接口,该接口仅做标记,无任何抽象方法。10、transient关键字的作用?被修饰的变量能被序列化吗?transient是序列化专属关键字,被transient修饰的成员变量,不会参与序列化。序列化对象时,会忽略该变量,反序列化后该变量会恢复为对应数据类型的默认值(字符串null、数字0、布尔false)。使用场景:敏感数据(密码、密钥)、临时缓存数据、无需持久化的字段。11、serialVersionUID的作用?不定义会有什么问题?serialVersionUID是序列化版本号,用于校验序列化对象和当前实体类的版本是否一致。不手动定义的问题:如果不手动声明,JVM会根据类的结构、字段、方法自动生成版本号。一旦后续修改实体类(新增/删除字段、修改方法),自动生成的版本号会变化。反序列化时版本号不匹配,直接抛出InvalidClassException异常,反序列化失败。开发规范:所有序列化实体类,手动固定serialVersionUID值,保证类小幅修改后,依然可以正常反序列化旧数据。五、NIO核心面试题(高频进阶)12、BIO和NIO的核心区别?适用场景?BIO(同步阻塞IO):传统IO模式,线程读写数据时会一直阻塞,直到读写完成。一个线程只能处理一个连接,并发能力差,适合低并发、简单文件读写、本地文件操作场景。NIO(同步非阻塞IO):JDK1.4推出,核心三大组件:Buffer(缓冲区)、Channel(通道)、Selector(选择器)。线程不会阻塞,一个线程可以管理多个通道连接,支持高并发。适合网络通信、高并发服务、大文件传输场景。13、NIO三大组件及各自作用?Channel通道:类似BIO的流,负责数据传输。双向读写、支持异步操作,常见实现:FileChannel、SocketChannel、ServerSocketChannel。Buffer缓冲区:数据读写的容器,所有数据必须先存入Buffer再读写。底层是数组,支持位置切换、重复读写,核心子类:ByteBuffer、CharBuffer。Selector选择器:NIO多路复用核心,监听多个通道的读写事件。单线程可管理大量通道,大幅提升并发处理能力,是高并发网络编程的核心。14、NIOBuffer的position、limit、capacity三个属性含义?capacity(容量):缓冲区最大容量,初始化后固定不变,代表最多能存储的数据量。position(位置):当前读写的指针位置,每次读写数据后自动后移。limit(限制):读写的边界限制,代表当前最多能读写到哪个位置。写模式下limit=capacity,读模式下limit=position。六、实战易错面试题15、文件复制用字节流还是字符流?大文件复制如何优化?通用文件复制优先使用字节缓冲流,适配所有文件类型,不会出现乱码。纯文本文件可使用字符缓冲流。大文件优化方案:禁止单字节循环读写,必须使用缓冲流+自定义字节数组批量读写。超大文件推荐使用NIOFileChannel的transferTo/transferFrom方法,底层操作系统零拷贝,效率极高。使用try-with-resources自动关流,避免资源泄露。16、什么是零拷贝?NIO零拷贝的优势?零拷贝是指避免CPU参与数据拷贝,减少内存数据复制次数。传统文件读写需要经过磁盘、内核缓冲区、用户缓冲区、程序内存多次拷贝,开销极大。NIO的transferTo方法可直接将磁盘文件数据从内核缓冲区传输到目标通道,跳过用户态缓冲区,减少数据拷

温馨提示

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

评论

0/150

提交评论