Java:全面 & 清晰的 NIO 学习攻略

发布时间:2018-11-19 09:19,

浏览次数:202

, 标签:

Java

NIO

<>前言

* JDK 1.4后,Java提供了一个全新的IO API,即 Java New IO

* 本文 全面 & 详细解析Java New IO,希望你们会喜欢

<>目录

<>储备知识:Java IO

<>1. 定义

* 即 Java New IO

* 是1个全新的、 JDK 1.4后提供的 IO API

<>2. 作用

* 提供了与标准IO不同的IO工作方式

* 可替代 标准Java IO 的IO API

<>3. 新特性

对比于 Java IO,NIO具备的新特性如下

<>4. 核心组件

Java NIO的核心组件 包括:

* 通道(Channel)

* 缓冲区(Buffer)

* 选择器(Selectors)

下面将详细介绍:

<>5. 具体使用

<>5.1 基于通道 & 缓冲数据

具体步骤如下:

// 1. 获取数据源 和 目标传输地的输入输出流(此处以数据源 = 文件为例) FileInputStream fin = new

FileInputStream(infile); FileOutputStream fout = new FileOutputStream(outfile);

// 2. 获取数据源的输入输出通道 FileChannel fcin = fin.getChannel(); FileChannel fcout =

fout.getChannel(); // 3. 创建 缓冲区 对象:Buffer(共有2种方法) // 方法1:使用allocate()静态方法

ByteBuffer buff = ByteBuffer.allocate(256); // 上述方法创建1个容量为256字节的ByteBuffer //

注:若发现创建的缓冲区容量太小,则重新创建一个大小合适的缓冲区 // 方法2:通过包装一个已有的数组来创建 //

注:通过包装的方法创建的缓冲区保留了被包装数组内保存的数据 ByteBuffer buff = ByteBuffer.wrap(byteArray); //

额外:若需将1个字符串存入ByteBuffer,则如下 String sendString="你好,服务器. "; ByteBuffer sendBuff =

ByteBuffer.wrap(sendString.getBytes("UTF-16")); // 4. 从通道读取数据 & 写入到缓冲区 // 注:若

以读取到该通道数据的末尾,则返回-1 fcin.read(buff); // 5. 传出数据准备:将缓存区的写模式 转换->> 读模式

buff.flip(); // 6. 从 Buffer 中读取数据 & 传出数据到通道 fcout.write(buff); // 7. 重置缓冲区 //

目的:重用现在的缓冲区,即 不必为了每次读写都创建新的缓冲区,在再次读取之前要重置缓冲区 // 注:不会改变缓冲区的数据,只是重置缓冲区的主要索引值

buff.clear();

<>5.2 基于选择器(Selecter)

具体步骤如下:

// 1. 创建Selector对象 Selector sel = Selector.open(); // 2. 向Selector对象绑定通道 // a.

创建可选择通道,并配置为非阻塞模式 ServerSocketChannel server = ServerSocketChannel.open();

server.configureBlocking(false); // b. 绑定通道到指定端口 ServerSocket socket =

server.socket(); InetSocketAddress address = new InetSocketAddress(port);

socket.bind(address); // c. 向Selector中注册感兴趣的事件 server.register(sel,

SelectionKey.OP_ACCEPT); return sel; // 3. 处理事件 try { while(true) { //

该调用会阻塞,直到至少有一个事件就绪、准备发生 selector.select(); // 一旦上述方法返回,线程就可以处理这些事件

Set keys = selector.selectedKeys(); Iterator iter =

keys.iterator(); while (iter.hasNext()) { SelectionKey key = (SelectionKey)

iter.next(); iter.remove(); process(key); } } } catch (IOException e) {

e.printStackTrace(); }

<>6. 实例讲解

* 实例说明:实现文件复制功能

* 实现方式:通道FileChannel、 缓冲区ByteBuffer import java.io.FileInputStream; import

java.io.FileOutputStream; import java.io.IOException; import

java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class Test {

public static void main(String[] args) throws IOException { // 设置输入源 & 输出地 = 文件

String infile = "C:\\copy.sql"; String outfile = "C:\\copy.txt"; // 1. 获取数据源 和

目标传输地的输入输出流(此处以数据源 = 文件为例) FileInputStream fin = new FileInputStream(infile);

FileOutputStream fout = new FileOutputStream(outfile); // 2. 获取数据源的输入输出通道

FileChannel fcin = fin.getChannel(); FileChannel fcout = fout.getChannel(); //

3. 创建缓冲区对象 ByteBuffer buff = ByteBuffer.allocate(1024); while (true) { // 4.

从通道读取数据 & 写入到缓冲区 // 注:若 以读取到该通道数据的末尾,则返回-1 int r = fcin.read(buff); if (r ==

-1) { break; } // 5. 传出数据准备:调用flip()方法 buff.flip(); // 6. 从 Buffer 中读取数据 &

传出数据到通道 fcout.write(buff); // 7. 重置缓冲区 buff.clear(); } } }

<>7. 与Java IO的区别

<>8. 总结

* 本文全面讲解了Java中的NIO的相关知识

* 下面我将继续对 Android & Java中的知识进行深入讲解 ,有兴趣可以继续关注Carson_Ho的安卓开发笔记

<>请帮顶 / 评论点赞!因为你的鼓励是我写作的最大动力!

传图识字java_Java:全面 清晰的 NIO 学习攻略相关推荐

  1. 传图识字有次数限制吗_告诉你一个免费的微信小程序,可以传图识字

    我们几乎天天都要用微信,如果他能提供一些简单又好用的功能,还免费,岂不快哉? 今天我就介绍一个能把图片上的文字,读取出来,方便你编辑和传送的小程序. 2.输入"传图识字"几个字,点 ...

  2. 传图识字显示服务器开小差,传图识字小程序

    传图识字小程序是一款非常厉害的图片识字软件.传图识字app运用图片扫描识别技术为广大用户提供图片识字服务,打开传图识字小程序就能将图片上的文字以文档的形式整理出来! 传图识字是一款专门用来让人工智能来 ...

  3. 传图识字有次数限制吗_传图识字常见付费问题解答

    传图识字常见付费问题解答 1.什么是一次性买断式会员,可以享受哪些权益? 答:一次性买断式买断式会员是指一次性购买会员服务,无限期使用所有会员特权,享受会员服务:后期升级及增设新功能,可以继续使用会员 ...

  4. 微信传图识字显示服务器开小差,微信小妙招——传图识字怎么使用?

    在手机像素越来越强大的今天,拍摄保存资料似乎已经成为了我们多数人的一个常态.相信不论是学生党.还是已经踏入社会的工作人士,这一方面的需求肯定都不会少. 而拍摄后的后续整理该怎么办呢?用手动录入的方式去 ...

  5. 手机上如何传图识字?

    手机都会用到微信,如果我们需要识别图片中的文字怎么办?手机上如何传图识字?微信小程序现在可以传图识字,这里就教大家如何传图识字. 1.打开手机里的微信,如果没有可以下载,接着在微信发现中找到小程序或者 ...

  6. [日推荐]『传图识字』让人工智能帮你识别照片里的文字!

    小编最近遇到这样一个问题,看到一些图片上,有一段很棒的话,但是尴尬的发现图片上的文字是不能复制的,只能一个字一个字打出来,你也为此而烦恼过吗?哈哈哈,这个问题已经被我破解,今天,给你们分享一款神器:『 ...

  7. Dataset:机器学习和深度学习中对数据集进行高级绘图(数据集可视化,箱线图等)的简介、应用之详细攻略——daidingdaiding

    Dataset:机器学习和深度学习中对数据集进行高级绘图(数据集可视化,箱线图等)的简介.应用之详细攻略--daidingdaiding 目录 箱线图 箱线图 箱线图(box plots):这些图显示 ...

  8. Py之matplotlibseaborn :matplotlibseaborn绘图的高级进阶之高级图可视化(基础图(直方图等),箱线图、密度图、小提琴图等)简介、案例应用之详细攻略

    Py之matplotlib&seaborn :matplotlib&seaborn绘图的高级进阶之高级图可视化(基础图(直方图等),箱线图.密度图.小提琴图等)简介.案例应用之详细攻略 ...

  9. ​​​​​​​DL之RNN/LSTM/GRU:RNN/LSTM/GRU算法动图对比、TF代码定义之详细攻略

    DL之RNN/LSTM/GRU:RNN/LSTM/GRU算法动图对比.TF代码定义之详细攻略 目录 RNN.LSTM.GRU算法对比 1.RNN/LSTM/GRU对比 2.RNN/LSTM/GRU动图 ...

最新文章

  1. delete mysql 大表_无语了,直到今天,我才揪出MySQL磁盘消耗迅猛的“真凶”!
  2. jenkins 中 svn 插件配置
  3. javaweb各种乱码问题处理
  4. 5.UNIX 环境高级编程--标准I/O库
  5. PHP报错:Warning: Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars
  6. 网络操作系统发展历程
  7. php微信转发无法显示标题图片,完美解决:微信分享为什么不显示图片呢? - 老牛博客...
  8. 读取xls格式的文件
  9. 电脑屏幕莫名其妙变成绿色
  10. 北大编程网格【练习题】,北医计算概论课程编程题答案整理,C语言/python/C++
  11. 任务管理器不显示磁盘
  12. Asp.NET Excel导入数据返回JSON字符
  13. mui+html5+实现扫描二维码操作
  14. Dacom G150双模耳机,为爱发声,呵护孩子听力健康成长
  15. UiPress – 现代WordPress仪表板主题
  16. Python | 输入逗号分隔的元素,转换为列表并打印
  17. 7-5 百分制成绩转换为等级成绩 (15分)c语言
  18. [584]python给生僻字注拼音(pypinyin库)
  19. JavaWeb学习-监听器
  20. 易宝支付 下单失败! 失败原因: 业务接口维护中,请您稍候再试!

热门文章

  1. 前端学习(1862)vue之电商管理系统电商系统之绘制默认头像
  2. 歌谣对自己的“自勉“
  3. STM32 CubeMX 利用设置串口UART采用DMA接收
  4. 剑指offer--重建二叉树
  5. [机器学习笔记]Note10--支持向量机(SVM)
  6. python读取扫描形成的pdf_Python利用PyPDF2库获取PDF文件总页码实例
  7. Redis在windows下安装过程
  8. str和unicode类
  9. eclipse/myeclipse中快捷键 Ctrl+shift+down/up 出现屏幕颠倒的解决方法
  10. idea maven web工程明明添加了maven lib的依赖,但启动web容器时始终报No Class Found?...