Java I/O 与 NIO:深入文件和网络编程

Java I/O 与 NIO:深入文件和网络编程

引言

在现代应用程序中,I/O操作(输入/输出)是必不可少的部分,无论是文件读写还是网络通信。在本篇文章中,我们将深入探讨Java的I/O系统,包括传统的I/O(java.io包)和新I/O(NIO,java.nio包)。通过理解和掌握这些技术,你将能够编写高效的文件操作和网络通信程序。

Java I/O

Java I/O API 提供了丰富的类和接口,用于处理文件、流和其他I/O操作。以下是一些常用的I/O类和其使用方法。

文件操作

文件创建与删除
import java.io.File;
import java.io.IOException;public class FileExample {public static void main(String[] args) {File file = new File("example.txt");try {// 创建新文件if (file.createNewFile()) {System.out.println("File created: " + file.getName());} else {System.out.println("File already exists.");}// 删除文件if (file.delete()) {System.out.println("Deleted the file: " + file.getName());} else {System.out.println("Failed to delete the file.");}} catch (IOException e) {System.out.println("An error occurred.");e.printStackTrace();}}
}

文件读写

使用 FileReader 和 FileWriter
import java.io.FileWriter;
import java.io.FileReader;
import java.io.IOException;public class FileReadWriteExample {public static void main(String[] args) {try {// 写入文件FileWriter writer = new FileWriter("example.txt");writer.write("Hello, World!");writer.close();System.out.println("Successfully wrote to the file.");// 读取文件FileReader reader = new FileReader("example.txt");int character;while ((character = reader.read()) != -1) {System.out.print((char) character);}reader.close();} catch (IOException e) {System.out.println("An error occurred.");e.printStackTrace();}}
}

使用 BufferedReader 和 BufferedWriter

import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.FileReader;
import java.io.IOException;public class BufferedReadWriteExample {public static void main(String[] args) {try {// 使用 BufferedWriter 写入文件BufferedWriter writer = new BufferedWriter(new FileWriter("example.txt"));writer.write("Hello, Buffered World!");writer.newLine();writer.write("This is another line.");writer.close();// 使用 BufferedReader 读取文件BufferedReader reader = new BufferedReader(new FileReader("example.txt"));String line;while ((line = reader.readLine()) != null) {System.out.println(line);}reader.close();} catch (IOException e) {System.out.println("An error occurred.");e.printStackTrace();}}
}

Java NIO

Java NIO(New I/O)引入了非阻塞I/O操作,提供了更高效的文件和网络操作。以下是一些NIO的核心概念和使用示例。

Buffer

Buffer 是NIO中的一个重要概念,用于读写数据。ByteBuffer是最常用的Buffer类型。

import java.nio.ByteBuffer;public class BufferExample {public static void main(String[] args) {// 分配一个容量为 48 字节的 ByteBufferByteBuffer buffer = ByteBuffer.allocate(48);// 写入数据到 Bufferfor (int i = 0; i < buffer.capacity(); i++) {buffer.put((byte) i);}// 翻转 Buffer,准备读取数据buffer.flip();// 从 Buffer 读取数据while (buffer.hasRemaining()) {System.out.print(buffer.get() + " ");}}
}

Channel

Channel 是一种新的数据传输方式,FileChannel 是用于文件操作的常用Channel。

import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.io.IOException;public class ChannelExample {public static void main(String[] args) {try {RandomAccessFile file = new RandomAccessFile("example.txt", "rw");FileChannel channel = file.getChannel();// 创建一个 ByteBufferByteBuffer buffer = ByteBuffer.allocate(48);// 从 Channel 读取数据到 Bufferint bytesRead = channel.read(buffer);while (bytesRead != -1) {buffer.flip(); // 切换 Buffer 为读模式while (buffer.hasRemaining()) {System.out.print((char) buffer.get());}buffer.clear(); // 清空 BufferbytesRead = channel.read(buffer);}file.close();} catch (IOException e) {e.printStackTrace();}}
}

Selector

Selector 允许一个线程管理多个 Channel,用于非阻塞I/O操作。

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;public class SelectorExample {public static void main(String[] args) {try {// 打开 ServerSocketChannelServerSocketChannel serverChannel = ServerSocketChannel.open();serverChannel.socket().bind(new InetSocketAddress(8080));serverChannel.configureBlocking(false);// 打开 SelectorSelector selector = Selector.open();serverChannel.register(selector, SelectionKey.OP_ACCEPT);while (true) {selector.select();Set<SelectionKey> selectedKeys = selector.selectedKeys();Iterator<SelectionKey> iterator = selectedKeys.iterator();while (iterator.hasNext()) {SelectionKey key = iterator.next();if (key.isAcceptable()) {// 接受新连接SocketChannel client = serverChannel.accept();client.configureBlocking(false);client.register(selector, SelectionKey.OP_READ);} else if (key.isReadable()) {// 读取数据SocketChannel client = (SocketChannel) key.channel();ByteBuffer buffer = ByteBuffer.allocate(256);client.read(buffer);String output = new String(buffer.array()).trim();System.out.println("Message received: " + output);client.close();}iterator.remove();}}} catch (IOException e) {e.printStackTrace();}}
}

文件操作与NIO 2.0

Java 7引入了NIO 2.0,增强了文件操作功能,简化了文件的读写、复制、移动和删除等操作。

文件读取和写入

使用Files类可以轻松读取和写入文件。

import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.List;public class NIO2FileReadWriteExample {public static void main(String[] args) {try {// 写入文件String content = "Hello, NIO 2.0!";Files.write(Paths.get("example.txt"), content.getBytes());// 读取文件List<String> lines = Files.readAllLines(Paths.get("example.txt"));for (String line : lines) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}
}

文件复制、移动和删除

import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;public class NIO2FileOperationsExample {public static void main(String[] args) {try {// 复制文件Files.copy(Paths.get("example.txt"), Paths.get("example_copy.txt"));// 移动文件Files.move(Paths.get("example_copy.txt"), Paths.get("example_moved.txt"));// 删除文件Files.delete(Paths.get("example_moved.txt"));} catch (IOException e) {e.printStackTrace();}}
}

总结

在本篇文章中,我们详细探讨了Java的I/O系统,包括传统的I/O(java.io包)和新I/O(java.nio包)。通过学习文件读写、使用Buffer和Channel、以及非阻塞I/O操作,你可以编写高效的文件操作和网络通信程序。掌握这些技术将使你能够应对各种I/O需求,提高程序的性能和可靠性。

在接下来的文章中,我们将继续深入探索Java的其他高级特性和实际应用,希望你能继续关注并享受学习的过程!

如果你有任何问题或需要进一步的解释,请在评论区留言。我们将尽快回复。感谢阅读!

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

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

相关文章

Python GNN图神经网络代码实战;GAT代码模版,简单套用,易于修改和提升,图注意力机制代码实战

1.GAT简介 GAT&#xff08;Graph Attention Network&#xff09;模型是一种用于图数据的深度学习模型&#xff0c;由Veličković等人在2018年提出。它通过自适应地在图中计算节点之间的注意力来学习节点之间的关系&#xff0c;并在节点表示中捕捉全局和局部信息。 GAT模型的核…

AI文章互评:得分最高的竟然不是GPT-4!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

Rspack + vue 修改css代码不能热更新

环境 rspack/cli0.6.5rspack/core0.6.5vue3.4.27 原因 使用了 rspack.config 中的 experiments.css:true&#xff08;默认&#xff09; export defualt {//...module: {rules:[{test: /\.css/,type: css},{test: /\.less/,use:[less-loader],type: css},]},//... } 自带的…

Dubbo的路由策略剖析

1 概述 Dubbo中的路由策略的作用是服务消费端使用路由策略对服务提供者列表进行过滤和选择&#xff0c;最终获取符合路由规则的服务提供者。 Dubbo中的路由策略主要分为两类&#xff0c;StateRouter和普通Router。 StateRouter &#xff08;如TagStateRouter、ConditionStat…

实力!云起无垠晋级“第九届安全创客汇”年度10强

2024年5月28日&#xff0c;第九届“安全创客汇”复赛在重庆圆满落幕。在本次国内最具影响力的网络安全创业大赛中&#xff0c;云起无垠凭借其技术的创新性和巨大市场价值&#xff0c;成功跻身年度十强。 随着人工智能技术的不断发展&#xff0c;特别是在大模型技术的推动下&…

【图像处理与机器视觉】XJTU期末考点

题型 选择&#xff1a;1 分10 填空&#xff1a;1 分15 简答题&#xff08;也含有计算和画图&#xff09;&#xff1a;10 分*4 计算题&#xff1a;15 分20 分 考点 选择题&#xff08;部分&#xff09; 数字图像处理基础 p(x,y),q(s,t)两个像素之间的距离由公式&#xff1a…

湖南(品牌调研)源点咨询 企业品牌调研侧重点分析

本文由湖南长沙&#xff08;市场调研&#xff09;源点咨询编辑发布 企业建立品牌&#xff0c;往往都需进行科学性的品牌调研。因为只有这样&#xff0c;才能让企业更好的把握市场的发展趋势&#xff0c;进而为品牌的建立和发展提供更有价值的数据参考&#xff01;那么品牌的调…

江淮集团分享:江淮集团数据管理实践

下文为江淮集团信息化管理部副部长丁志海的演讲全文&#xff1a; 大家下午好。我是来自江淮汽车的丁志海&#xff0c;我做IT、做信息化做这一块有二十多年了。这次得帆邀请我来讲讲数据管理的实践经验。我就想说一说我的感受&#xff0c;为什么我们当初选择得帆&#xff0c;和一…

微信小程序计算器

微信小程序计算器 index.wxml <view classscreen>{{result}}</view><view classtest-bg><view classbtnGroup><view classitem grey bindtapclickButton id"{{C}}">AC</view><view classitem grey bindtapclickButton id&q…

AI精选付费资料包【37GB】

课程介绍 一、人工智能论文合集 二、AI必读经典书籍 三、超详细人工智能学习大纲 四、机器学习基础算法教程 五、深度学习神经网络基础教程 六、计算机视觉实战项目 课程获取 资料&#xff1a;AI精选付费资料包&#xff08;37.4GB&#xff09;获取&#xff1a;扫码关注公z号…

esp8266阿里云上线(小程序控制)

此wechatproject已上传在页面最上方 由图可见&#xff0c;项目只有两个页面&#xff0c;一个是获取该产品下的设备信息列表&#xff0c;一个是某设备对应的详情控制页面&#xff0c;由于这个项目只利用esp8266板子上自带的led&#xff0c;功能简单&#xff0c;只需要控制开关即…

leetcode 575.分糖果

思路&#xff1a;开两个数组&#xff0c;一个用来存储非负数的糖果个数&#xff0c;一个用来存储负数的糖果个数&#xff0c;这两个数组都是状态数组&#xff0c;而不是计数数组 如果当前能够吃的种类大于现有的种类&#xff0c;现有的种类个数就是答案&#xff1b; 如果当前…

Update! 基于RockyLinux9.3离线安装Zabbix6.0

链接&#xff1a; Ansible离线部署 之 Zabbixhttp://mp.weixin.qq.com/s?__bizMzk0NTQ3OTk3MQ&mid2247487434&idx1&sn3128800a0219c5ebc5a3f89d2c8ccf50&chksmc3158786f4620e90afe440bb32fe68541191cebbabc2d2ef196f7300e84cde1e1b57383c521a&scene21#we…

YOLOv9改进策略 | Conv篇 | 利用YOLOv10提出的SCDown魔改YOLOv9进行下采样(附代码 + 结构图 + 添加教程)

一、本文介绍 本文给大家带来的改进机制是利用YOLOv10提出的SCDown魔改YOLOv9进行下采样,其是更高效的下采样。具体而言,其首先利用点卷积调整通道维度,然后利用深度卷积进行空间下采样。这将计算成本减少到和参数数量减少到。同时,这最大限度地保留了下采样过程中的信息,…

创新指南|提高人才回报率的重要举措和指标

员工是组织最大的投资&#xff0c;也是最深层的价值源泉。人才系统必须同时强调生产力和价值创造。让合适的人才担任合适的职位&#xff0c;并为员工提供成功所需的支持和机会&#xff0c;这是实现回报的关键。本文将介绍组织可以采取的五项行动&#xff0c;以最大化企业的人才…

postgresql常用命令#postgresql认证

PostgreSQL 是一个功能强大的开源关系数据库管理系统&#xff0c;提供了一系列命令行工具来管理和操作数据库。以下是一些常用的 PostgreSQL 命令&#xff0c;涵盖数据库和用户管理、数据操作以及查询和维护等方面。 #PostgreSQL培训 #postgresql认证 #postgreSQL考试 #PG考试…

汽车识别项目

窗口设计 这里的代码放在py文件最前面或者最后面都无所谓 # 创建主窗口 window tk.Tk() window.title("图像目标检测系统") window.geometry(1000x650) # 设置窗口大小# 创建背景画布并使用grid布局管理器 canvas_background tk.Canvas(window, width1000, height…

【Hive SQL 每日一题】统计各个商品今年销售额与去年销售额的增长率及排名变化

文章目录 测试数据需求说明需求实现分步解析 测试数据 -- 创建商品表 DROP TABLE IF EXISTS products; CREATE TABLE products (product_id INT,product_name STRING );INSERT INTO products VALUES (1, Product A), (2, Product B), (3, Product C), (4, Product D), (5, Pro…

英码科技推出鸿蒙边缘计算盒子:提升国产化水平,增强AI应用效能,保障数据安全

当前&#xff0c;随着国产化替代趋势的加强&#xff0c;鸿蒙系统Harmony OS也日趋成熟和完善&#xff0c;各行各业都在积极拥抱鸿蒙&#xff1b;那么&#xff0c;边缘计算要加快实现全面国产化&#xff0c;基于鸿蒙系统开发AI应用势在必行。 关于鸿蒙系统及其优势 鸿蒙系统是华…

Linux 问题定位查看日志文件常用命令

Linux 问题定位查看日志文件常用命令 查看日志文件的前100行中是否包含关键词&#xff1a; head -n 100 /var/log/file.log | grep "keyword"查看日志文件的最后100行中是否包含关键词&#xff1a; tail -n 100 /var/log/file.log | grep "keyword"使用l…