跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Java IO体系
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Note|本文适用于Java初学者及需要回顾IO体系核心概念的中级开发者,内容涵盖基础API到NIO高级特性}} = Java IO体系 = '''Java IO(输入输出)体系'''是Java语言处理数据流的核心API集合,用于实现设备间的数据传输。其设计基于'''流(Stream)'''抽象概念,分为'''字节流'''和'''字符流'''两大体系。 == 核心架构 == Java IO采用'''装饰器模式''',通过嵌套流实现功能扩展。主要包含以下包: * <code>java.io</code> - 基础IO类库 * <code>java.nio</code> - 非阻塞IO(New IO) <mermaid> classDiagram class InputStream class OutputStream class Reader class Writer class File InputStream <|-- FileInputStream OutputStream <|-- FileOutputStream Reader <|-- InputStreamReader Writer <|-- OutputStreamWriter </mermaid> == 流分类 == === 1. 字节流(Byte Streams) === 处理原始二进制数据(8位字节),核心抽象类: * <code>InputStream</code> - 输入字节流 * <code>OutputStream</code> - 输出字节流 {{Example|文件复制示例| <syntaxhighlight lang="java"> try (InputStream in = new FileInputStream("source.txt"); OutputStream out = new FileOutputStream("target.txt")) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } } catch (IOException e) { e.printStackTrace(); } </syntaxhighlight> }} === 2. 字符流(Character Streams) === 处理Unicode字符(16位),核心抽象类: * <code>Reader</code> - 输入字符流 * <code>Writer</code> - 输出字符流 {{Example|文本文件读取| <syntaxhighlight lang="java"> try (BufferedReader reader = new BufferedReader(new FileReader("text.txt"))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } </syntaxhighlight> }} === 3. 缓冲流(Buffered Streams) === 通过内存缓冲区减少物理IO操作: * <code>BufferedInputStream</code>/<code>BufferedOutputStream</code> * <code>BufferedReader</code>/<code>BufferedWriter</code> == 高级特性 == === 对象序列化 === 实现<code>Serializable</code>接口的对象持久化: <syntaxhighlight lang="java"> class Person implements Serializable { private String name; private transient int age; // 不被序列化 // getters/setters... } // 序列化 try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat"))) { oos.writeObject(new Person("Alice", 30)); } </syntaxhighlight> === NIO(New IO) === Java 1.4引入的非阻塞IO模型,核心组件: * <code>Channel</code> - 双向数据传输通道 * <code>Buffer</code> - 数据容器 * <code>Selector</code> - 多路复用器 <mermaid> sequenceDiagram participant Client participant Selector participant Channel Client->>Selector: 注册关注事件 loop 事件循环 Selector->>Channel: 检查就绪通道 Channel-->>Selector: 返回就绪集合 Selector->>Client: 通知处理事件 end </mermaid> == 性能对比 == {| class="wikitable" |+ IO操作性能对比(单位:ms) ! 操作类型 !! 1MB文件 !! 100MB文件 |- | 基础字节流 | 15 | 1200 |- | 缓冲字节流 | 5 | 400 |- | NIO传输 | 3 | 250 |} == 最佳实践 == 1. 始终使用<code>try-with-resources</code>确保资源关闭 2. 大文件处理优先选择缓冲流 3. 高并发场景考虑NIO或<code>Files</code>工具类 4. 敏感字段使用<code>transient</code>关键字 {{Warning|Windows路径需转义:<code>"C:\\\\data\\\\file.txt"</code> 或使用 <code>Paths.get("C:/data/file.txt")</code>}} == 常见面试问题 == 1. '''字节流与字符流的区别?''' * 字节流操作8位字节,字符流处理16位Unicode * 字符流自动处理编码转换(如UTF-8) 2. '''NIO与传统IO的核心差异?''' * 传统IO是阻塞式,NIO支持非阻塞 * NIO使用Channel和Buffer而非Stream * NIO提供Selector实现单线程多通道管理 3. '''为什么需要flush()方法?''' 强制将缓冲区内容写入目标设备,特别是: * 网络传输前 * 重要日志写入 * 需要即时反馈的场景 [[Category:计算机科学]] [[Category:面试技巧]] [[Category:Java基础]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Example
(
编辑
)
模板:Mbox
(
编辑
)
模板:Note
(
编辑
)
模板:Warning
(
编辑
)
模块:Arguments
(
编辑
)
模块:Message box
(
编辑
)
模块:Message box/ambox.css
(
编辑
)
模块:Message box/configuration
(
编辑
)
模块:Yesno
(
编辑
)