1. IO与NIO核心原理概述
作为一名Java开发者,IO和NIO是面试中绕不开的技术点。记得我第一次参加大厂面试时,面试官直接让我在白板上画出NIO的Selector工作原理,当时因为对底层细节理解不够深入,回答得支支吾吾。后来在实际项目中反复使用和调试这些技术,才真正掌握了它们的精髓。
IO(Input/Output)是Java中处理输入输出的基础API,而NIO(New I/O)则是Java 1.4引入的高性能IO模型。两者的核心区别在于阻塞与非阻塞的设计理念。传统IO是阻塞式的,每个连接都需要独立的线程处理,这在并发量大的场景下会成为性能瓶颈。而NIO采用事件驱动模型,单线程就能处理大量连接,这正是现代高并发系统的核心技术基础。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Java IO体系深度解析
2.1 字节流与字符流
Java IO体系中最基础的就是字节流和字符流。字节流以InputStream和OutputStream为基类,直接操作原始字节数据。我在处理图片、音频等二进制文件时,通常会使用FileInputStream和FileOutputStream。
java复制try (InputStream is = new FileInputStream("test.jpg");
OutputStream os = new FileOutputStream("copy.jpg")) {
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
}
字符流则以Reader和Writer为基类,专门处理文本数据。这里有个关键点:字符流内部会自动处理编码转换。我曾经踩过一个坑,在读取中文文本文件时没有指定编码,导致乱码问题。正确的做法是:
java复制new InputStreamReader(new FileInputStream("text.txt"), StandardCharsets.UTF_8);
2.2 缓冲流的性能优化
直接使用基础IO类进行频繁的小数据量读写会导致性能问题。BufferedInputStream和BufferedOutputStream通过内置缓冲区(默认8KB)减少了实际IO操作次数。实测表明,使用缓冲流后文件复制速度能提升5-10倍。
重要提示:缓冲流记得调用flush()或close(),否则缓冲区中的数据可能不会立即写入目标。
2.3 转换流的编码处理
InputStreamReader和OutputStreamWriter是字节流与字符流之间的桥梁。在Web开发中,处理HTTP请求时经常需要它们来转换字节和字符。我曾经遇到过一个生产问题:用户上传的文件包含特殊字符,由于没有正确设置编码导致解析失败。解决方案是:
java复制new InputStreamReader(socket.getInputStream(), "UTF-8");
