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

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的安卓开发笔记

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

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

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

相关文章

java手机飞行模式_用了这么多年手机才知道,飞行模式还藏着这6个功能!太好用了...

说起“飞行模式”很多朋友们都会说我又不坐飞机&#xff0c;要它有啥用&#xff1f;当然有用&#xff01;而且用处可多了不纠结手机辐射问题很多朋友担心晚上不关机手机会有辐射&#xff0c;但是又觉得关机开机很繁琐&#xff0c;真是很纠结。其实只要把手机飞行模式打开就行啦…

Ubuntu下一个openldapserver部署步骤

1&#xff1a;安装zlib 下载zlib-1.2.3.tar.gz&#xff08;或其它版本号&#xff09; wget http://down1.chinaunix.net/distfiles/zlib-1.2.3.tar.gz # ./configure --shared # make # make install 2&#xff1a;安装openssl 不要卸载系统自带的Openssl,否则非常多服务都起不…

dentity在Java里是什么意思_注释@Id和@GeneratedValue(strategy = GenerationType.IDENTITY)的用途是什么?为什么世代类型是身份?...

小编典典让我回答这个问题&#xff1a;首先&#xff0c;使用注释作为我们的configure方法只是一种便捷的方法&#xff0c;而不是应对无休止的XML配置文件。的Id注释是继承自javax.persistence.Id&#xff0c;指示构件字段下面是当前实体的主键。因此&#xff0c;您的Hibernate和…

ACM配置指南

Ubuntu桌面入门指南  ACM比赛系统ubuntu 使用指南 ACM核武器 简明 Vim 练级攻略  Vim命令合集  代码编辑神器VIM&#xff08;附我写acm程序时的配置&#xff09; my_vimrc in ubuntu set cin nu et ts4 sw4 sts4 noswapfile nobackup cursorline set backgrounddark synt…

前端学习(1545):模型和控制器

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> <!-- 需要…

java是不是饱和了_广州Java难学吗?Java是不是已经饱和了

无论是在校的学生也好&#xff0c;还是转行的也好&#xff0c;如今学Java开发的人越来越多&#xff0c;造成了如今新手越来越多&#xff0c;有人说前端饱和了&#xff0c;Java饱和了&#xff0c;Java才刚开始以一种好的势头发展就饱和了&#xff1f;怎么可能&#xff0c;一般说…

Hello Indigo

Windows Communication Foundation (WCF),formerly code-named “Indigo,” is Microsoft’s platform for Service-Oriented Architecture (SOA),designed for building distributed service-oriented applications for the enterprise and the web. WCF was released with Wi…

java apk安装路径_android apk安装过程源码解析

前言&#xff1a;前一篇博客分析了一下PackageManagerService是如何解析apk的以及我们如何解析未安装apk中的androidManifest.xml文件。解析完肯定要安装的&#xff0c;索性写一篇关于android系统是如何安装我们apk的流程分析。不过这里仅仅只分析java层面的代码&#xff0c;C层…

复杂度

一、引言 一个算法是由控制结构&#xff08;顺序、分支和循环3种&#xff09;和原操作&#xff08;指固有数据类型的操作&#xff09;构成的&#xff0c;则算法时间取决于两者的综合效果。为了便于比较同一问题的不同算法&#xff0c;通常的做法是&#xff1a;从算法中选取一种…

几个不错的素材站

w3cplus : http://www.w3cplus.com/JQUERY插件库 jq22.com 牛客 http://www.nowcoder.com/html/aboutusjQuery之家模板之家 http://www.cssmoban.com/动效不错的&#xff1a;http://www.templatemonster.com/demo/54933.htmlhttp://www.templatemonster.com/demo/54935.htmlht…

x3-02 java_Day13 -- Java流程控制02

1. 顺序结构Java的基本结构就是顺序结构&#xff0c;除非特别指明&#xff0c;否则就按照顺序一句一句执行。是任何一个算法都离不开的一种基本算法结构。2. 选择结构if单选择结构if双选择结构if多选择结构嵌套的if结构switch多选择结构1) if单选择结构语法&#xff1a;if(布尔…

css3 多列布局使用

css3的出现&#xff0c;解决了不少前端的问题&#xff0c;比如动画&#xff0c;圆角等&#xff1b; 这里总结一下css3 的多列布局&#xff1b; w3c上给出了很多属性&#xff1b; 我们一般用到column-count、column-gap、column-width这三个属性&#xff0c; 其中column-count和…

string容量JAVA_java的StringBuilder类的长度和容量有什么区别呢?

StringBuilder是使用char[] value;存储数据的Overridepublic int length() {return count;}AbstractStringBuilder(int capacity) {value new char[capacity];}长度表示的是字符的个数&#xff0c;容量表示的是可用于最新插入字符的存储量。例如&#xff1a;StringBuilder sbn…

一个TextView使用不同的颜色

一个TextView使用不同的颜色&#xff1a; textview中首先需要已经有内容了 public static void ColorFormatTextView(TextView tv,int color,String textStr){if (TextUtils.isEmpty(textStr) || tv null|| TextUtils.isEmpty(tv.getText())) {return;}String showString tv.…

java集合的某项相加_java8实现list集合中按照某一个值相加求和,平均值等操作代码...

集合: List user = new User(); user .stream().collect(Collectors.summingInt(User::getAge)) 参数类型: summarizingDouble 统计数据(double)状态, 其中包括count min max sum和平均值 summarizingInt 统计数据(int)状态, 其中包括count min max sum和平均值 summarizingLo…