Java IO/NIO 详解

简介

Java 的输入输出操作是进行文件、网络等外部资源交互的基础部分。Java 从早期的 IO 到后续扩展的 NIO(New IO),不断增强以适应多样化的业务需求。本文将深入探讨 Java IO/NIO 的基础概念、使用方法、常见实践以及一些最佳实践,助力读者更高效地使用 Java 进行输入输出操作。

目录

  1. Java IO 基础概念
  2. Java NIO 基础概念
  3. Java IO 使用方法与示例
  4. Java NIO 使用方法与示例
  5. 常见实践
  6. 最佳实践
  7. 小结
  8. 参考资料

Java IO 基础概念

Java IO 是面向流的输入输出,流即数据的有序集合。Java 提供了多种流类用于处理字节流和字符流。

  • 字节流:使用 InputStream 和 OutputStream 及其子类,不考虑数据编码。
  • 字符流:使用 Reader 和 Writer 及其子类,考虑字符编码方便处理文本。

IO 处理是阻塞的,即调用到完成需要时间,中途不能执行其他任务。

Java NIO 基础概念

Java NIO 是面向缓冲区和通道的输入输出,提供了更高效的非阻塞 IO。

  • 通道 (Channel):类似流,但可以进行非阻塞读写。
  • 缓冲区 (Buffer):用于与通道交互,数据在通道和缓冲区之间传递。
  • 选择器 (Selector):用于多路复用,可检测多个 IO 操作就绪状态。

Java IO 使用方法与示例

import java.io.*;public class IOExample {public static void main(String[] args) {// 示例:读取文件内容并输出在控制台try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}
}

Java NIO 使用方法与示例

import java.io.IOException;
import java.nio.file.*;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;public class NIOExample {public static void main(String[] args) {// 示例:使用 NIO 读取文件内容try (FileChannel fileChannel = FileChannel.open(Paths.get("input.txt"), StandardOpenOption.READ)) {ByteBuffer buffer = ByteBuffer.allocate(1024);while (fileChannel.read(buffer) > 0) {buffer.flip();while (buffer.hasRemaining()) {System.out.print((char) buffer.get());}buffer.clear();}} catch (IOException e) {e.printStackTrace();}}
}

常见实践

  1. 文本文件读取:优先使用字符流,搭配BufferedReader等提高效率。
  2. 二进制文件处理:使用字节流,注意处理结束标识。
  3. 大文件传输:采用 NIO 通道和缓冲区,提高传输效率。

最佳实践

  • 资源管理:总是使用 try-with-resources 以确保 IO 资源正确关闭。
  • 缓冲使用:使用 Buffered* 类提高 IO 性能。
  • 字符集设置:在处理字符流时,明确指定字符集,以确保程序的可移植性。
  • 基于需求选择 IO/NIO:对于大数据或高并发需求,优先考虑 NIO 的非阻塞特性。

小结

Java 的 IO 和 NIO 提供了强大而灵活的工具用于输入输出操作。理解其工作原理和正确使用,能让开发者有效处理各种 IO 任务,提高程序性能和稳定性。

参考资料

  • Oracle Java 文档:https://docs.oracle.com/javase/8/docs/api/java/io/package-summary.html
  • Java NIO 文档:https://docs.oracle.com/javase/8/docs/api/java/nio/package-summary.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/877463.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pdf处理--tts(待重写)

1.提取正文2.裁剪页眉 https://smallpdf.com/cn/crop-pdf#r=crop-pages3.拆分4.ocr 效果图--白描:效果图--4Videosoft PDF Converter Ultimate:5.阅读器与tts引擎 开源阅读:https://github.com/gedoor/legado tts-server-android:https://github.com/jing332/tts-server-an…

INFINI Labs 产品更新 | Console 发布 TopN 功能,Easysearch 新增 Rollup 能力等

INFINI Labs 产品全新发布!此次更新为大家带来了 Console 的全新 TopN 功能,让您能够更高效地定位最关键的节点或索引;Easysearch 新增 Rollup 能力,大幅提升监控指标的存储周期并优化分析体验;此外,Framework 还修复了多项缺陷并进行了多处优化。欢迎下载体验,探索更多…

03-一个例子

登录被测系统bysms双击运行runserver.bat 访问页面:http://127.0.0.1/mgr/sign.html 账号:byhy,密码:88888888 可以直接在pycharm的Terminal中运行hytest,不需要打开命令行窗口 浏览器驱动的打印信息: 禁止 chromedriver 日志写屏1 from selenium import webdriver 2 3 …

blog tips

markdown 内嵌 html 使图片并排点击查看代码 <div style="display: flex; gap: 10px; justify-content: space-between;"><img src="图片1地址" style="width: 49%; height: auto;"/><img src="图片2地址" style="…

【数学】已知正方形相邻两点坐标求另外两点坐标

已知正方形相邻两点(a,b)与(c,d)坐标公式: \( (x_3,y_3) = (c + (b-d), d - (a-c)) \\ (x_4,y_4) = (a + (b-d), b - (a-c)) \\ (x_5,y_5) = (a - (b-d), b + (a-c)) \\ (x_6,y_6) = (c - (b-d), d + (a-c)) \)

25.1.31小记

多态类型声明类型 : 定义时候的类型 动态类型 : 运行到那里的时候对应的具体类型 向上造型(cast) : 将子类类型的对象赋给父类的变量 (不能将一个父类的变量赋予一个子类的变量) 赋值运算符 : 将管理者管理的对象进行改变(改变的是指针)其中造型(cast)的意义是将某…

MacOS修改应用快捷键的一般思路

具体步骤为:使用CheatSheet软件查看菜单项名称 在系统设置中修改菜单项的快捷键举个例子:修改Chrome中左右切换tab的快捷键(系统语言为英文,中文同理) 默认采用Ccontrol Tab和Control + Shift + Tab(或Command Shift [和Command Shift ])可以左右切换tab。 现在希望将其…

UE4.27, 模块实践, Slate的UI开发 (一)

1. 基本概念1.1. Slate是虚幻UI框架设计的底层,该框架中最基本的类是SWidget1.1.1.显然,我们容易注意到,直属于该框架的类拥有着指定的命名规则,即以S开头1.2. UMG, UWidget, Slate关联1.2.1. UMG:Unreal Motion Graphics UI Designer 虚幻的图形界面设计工具1.2.2. 单纯Sl…

Brainfly: 用 C# 类型系统构建 Brainfuck 编译器

Brainfly: 用 C# 类型系统构建 Brainfuck 编译器Brainfuck 简介 Brainfuck 是由 Urban Mller 在 1993 年创造的一门非常精简的图灵完备的编程语言。 正所谓大道至简,这门编程语言简单到语法只有 8 个字符,每一个字符对应一个指令,用 C 语言来描述的话就是:字符 含义> ++…

01-hytest简介

参考教程:http://vip3.byhy.net/auto/pyatframework/hytest-01/ 安装:pip3 install hytest hytest对应的python版本要求:Python3.6或者更高版本 运行hytest自动化测试:打开命令行窗口 切换到自动化代码根目录 运行hytest,运行hytest其实就是运行python -m hytest.run 如果…

【编码】自定义通信协议——实现零拷贝文件传输

前言 上一篇随笔,介绍了如何扩展自定义协议的请求类型。本篇随笔我将介绍如何基于这个自定义协议来实现文件传输,其中将涉及数据分片和零拷贝 在设计自定义协议之前,我们首先了解一下HTTP协议是如何处理文件传输的。 HTTP协议的实现方式 在这里,我们主要讨论应用最广泛的HT…

研发的护城河到底是什么?

0 你的问题,我知道! 和大厂朋友聊天,他感叹原来努力干活,做靠谱研发,积累职场经验,干下来,职业发展一般问题不大。而如今大厂“年轻化”,靠谱再不能为自己续航,企业似乎也不愿意持续为经验买单。 在这不确定时代,职业发展中有无硬通货? 更长远职业发展角度:要抓住机…