热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaNIO(一)简介

向Buffer中写数据 写数据到Buffer有两种方式: ·        从Channel写到Buffer。·        通过Buffer的put()方法写到Buffer里。从Channel写到

一、简介


Java NIO (New IO)是JDK1.4后引入的新输入/输出API,提供基于缓冲区(buffer)的块写入/读取,而以前的I/O是基于流(Stream)的方式,NIO基于块的IO操作,将最耗时的缓存区读取和填充交由底层操作系统实现,因此速度上要快得多;主要由以下三个核心部分组成: 
1.Channel
2. Buffer 
3. Selector

二、Channel - 通道

通道可以理解为以前的“流”,数据从通道读取,也可以向通道写入数据,是双向的,但是读取和写入都必须是使用Buffer,即读取数据时,需要从通道读取到缓存区,然后再从缓冲区获取数据,写入数据也需要先将数据写入到缓存区,再将缓冲区写入通道;

NIO中主要有以下通道类型: 
- FileChannel - 文件IO 
- DatagramChannel - UDP传输 
- SocketChannel - TCP传输 
- ServerSocketChannel -TCP传输

三、Buffer - 缓冲区

缓冲区可以认为是一个数据容器,可以理解为一个基本数据类型数组,如字节数组等;NIO中任何数据输入/输出都是必须经由缓冲区实现,主要有以下缓冲区类型: 
- ByteBuffer 
- CharBuffer 
- ShortBuffer 
- IntBuffer 
- LongBuffer 
- FloatBuffer 
- DoubleBuffer 
- MappedByteBuffer

可以看出以上类型覆盖Java的全部基本类型,MappedByteBuffer(内存映射文件,后续章节讲解)对于每种Buffer都有相同的方法,只有ByteBuffer拥有部分特殊的方法

向Buffer中写数据 

写数据到Buffer有两种方式: 

·        从Channel写到Buffer。

·        通过Buffer的put()方法写到Buffer里。

从Channel写到Buffer的例子 : 

int bytesRead = inChannel.read(buf); //read into buffer.通过put方法写Buffer的例子:

buf.put(127);

从Buffer中读取数据 

从Buffer中读取数据有两种方式: 

·        从Buffer读取数据到Channel。

·       使用get()方法从Buffer中读取数据。


从Buffer读取数据到Channel的例子:

//read from buffer into channel.
int bytesWritten = inChannel.write(buf);
使用get()方法从Buffer中读取数据的例子 :

byte aByte = buf.get();


四、Selector - 选择器

选择器支持单个线程处理多个Channel,将多个Channel注册到一个选择器中,选择器基于事件的方式处理;从选择器获取注册Channel中关注的事件(如读、写)并进行数据处理,非常适用于多个数据量不大、读写不频繁的通道,使用单个线程来处理;


五、NIO简单(标准)的输入/输出

一个简单(标准)的NIO输入输出一般包含如下步骤: 
1. 从数据源获取通道 
2. 分配缓冲区 
3. 切换缓存区为写模式 
4. 从通道读取数据写入缓冲区 
5. 切换缓冲区为读模式 
6. 缓冲区数据写入通道中 
7. 关闭资源

实例代码如下:

package com.denny.aio.test;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class Test {
public static void main(String[] args) throws IOException {

RandomAccessFile formFile = new RandomAccessFile("src\\a.txt", "rw");
RandomAccessFile toFile = new RandomAccessFile("src\\b.txt", "rw");

//获取channel
FileChannel fromChannel = formFile.getChannel();
FileChannel toChannel = toFile.getChannel();

// 定义缓冲大小
int bufSize = 1024*4;

// 定义缓冲
ByteBuffer byteBuffer = ByteBuffer.allocate(bufSize);

int len = 0;

// 将数据从源channel写入到缓冲区
while( (len=fromChannel.read(byteBuffer)) !=-1 ){

//切换到读模式
byteBuffer.flip();

//读取缓冲区数据写到目标channel
toChannel.write(byteBuffer);

// 清空缓冲
byteBuffer.clear();
}

// 释放资源
toChannel.close();
fromChannel.close();
}
}



版权声明:本文为idiandi原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/idiandi/article/details/60756104
推荐阅读
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • 在Spring框架中,基于Schema的异常通知与环绕通知的实现方法具有重要的实践价值。首先,对于异常通知,需要创建一个实现ThrowsAdvice接口的通知类。尽管ThrowsAdvice接口本身不包含任何方法,但开发者需自定义方法来处理异常情况。此外,环绕通知则通过实现MethodInterceptor接口来实现,允许在方法调用前后执行特定逻辑,从而增强功能或进行必要的控制。这两种通知机制的结合使用,能够有效提升应用程序的健壮性和灵活性。 ... [详细]
  • Java 8 引入了 Stream API,这一新特性极大地增强了集合数据的处理能力。通过 Stream API,开发者可以更加高效、简洁地进行集合数据的遍历、过滤和转换操作。本文将详细解析 Stream API 的核心概念和常见用法,帮助读者更好地理解和应用这一强大的工具。 ... [详细]
  • 高效排序算法是提升数据处理速度的重要技术。通过优化排序算法,可以显著提高数据处理的效率和性能。本文介绍了几种常见的高效排序算法,如快速排序、归并排序和堆排序,并通过实例代码展示了它们的具体实现。实验结果表明,这些算法在大规模数据集上的表现尤为突出,能够有效减少数据处理时间,提升系统整体性能。 ... [详细]
  • 利用Java开发功能完备的电话簿应用程序,支持添加、查询与删除操作
    本研究基于Java语言开发了一款功能全面的电话簿应用程序,实现了与数据库的高效连接。该应用不仅支持添加、查询和删除联系人信息,还具备输出最大和最小ID号的功能,并能够对用户输入的ID号进行有效性验证,确保数据的准确性和完整性。详细实现方法可参阅相关文档。 ... [详细]
  • 使用 MyEclipse 和 TestNG 测试框架在 Java 中高效进行单元测试
    通过MyEclipse集成TestNG测试框架,可以在Java开发中高效地进行单元测试。本文介绍了在JDK 1.8.0_121和MyEclipse 10.0离线环境下配置和使用TestNG的具体步骤,帮助开发者提高测试效率和代码质量。 ... [详细]
  • 在使用群报数小程序进行高效接龙与统计时,可以通过创建 `LinkedList` 对象并利用 `for` 循环生成指定数量的 `Person` 对象,为每个人员分配唯一的编号,并将其添加到 `LinkedList` 集合中。这一过程确保了数据的有序性和高效管理,便于后续的接龙和统计操作。此外,该小程序还支持实时更新和查看参与人员的状态,进一步提升了活动组织的便利性和准确性。 ... [详细]
  • 如何在 Java LinkedHashMap 中高效地提取首个或末尾的键值对? ... [详细]
  • 如何在Java中高效构建WebService
    本文介绍了如何利用XFire框架在Java中高效构建WebService。XFire是一个轻量级、高性能的Java SOAP框架,能够简化WebService的开发流程。通过结合MyEclipse集成开发环境,开发者可以更便捷地进行项目配置和代码编写,从而提高开发效率。此外,文章还详细探讨了XFire的关键特性和最佳实践,为读者提供了实用的参考。 ... [详细]
  • 深入解析 iOS Objective-C 中的对象内存对齐规则及其优化策略
    深入解析 iOS Objective-C 中的对象内存对齐规则及其优化策略 ... [详细]
  • C#中实现高效UDP数据传输技术
    C#中实现高效UDP数据传输技术 ... [详细]
  • 如何使用 net.sf.extjwnl.data.Word 类及其代码示例详解 ... [详细]
  • 开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用
    开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用 ... [详细]
  • 深入解析JWT的实现与应用
    本文深入探讨了JSON Web Token (JWT) 的实现机制及其应用场景。JWT 是一种基于 RFC 7519 标准的开放性认证协议,用于在各方之间安全地传输信息。文章详细分析了 JWT 的结构、生成和验证过程,并讨论了其在现代 Web 应用中的实际应用案例,为开发者提供了全面的理解和实践指导。 ... [详细]
author-avatar
手机用户2602884231
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有