NIO教程笔记
NIO操作文件部分详解
NIO——New IO,也可以理解为非阻塞IO(Non Blocking IO)。可以替代旧IO,更高效的支持读写(文件读写,网络读写)。但文件操作都是阻塞的。学习NIO首先要了解缓冲区(Buffer),通道(Channel)。
一.缓冲区(七种类型)——专门用于存取各种基本类型数据(除Boolean)的地方。(如果已经了解,请点击这里)
1.缓冲区的类型有ByteBuffer,ShortBuffer,IntBuffer,LongBuffer,DoubleBuffer,FloatBuffer,CharBuffer用于存储不同类型的数据。通过xxBuffer.allocate()分配空间
2.缓冲区的几个重要属性:
(1).private int limit——缓冲区中数据的界限,即limit之后的数据不会读取。
(2).private int position = 0——缓冲区中当前操作数据的位置。
(3).private int capacity——缓冲区的最大容量,不会改变(就像数组初始化大小后不会改变一个道理)。
(4).private int mark = -1——可标记position的位置,通过reset()回到mark位置。
3.xxBuffer的几个重要方法:
(1).put();向缓冲区写数据。
(2).get();从缓冲区读数据。
(3).rewind();重复读取数据。
(4).clear();清除数据(非抹除数据,只是重置limit,position,capacity的值,原数据依然存在)。
3.举例:
ByteBuffer bf = ByteBuffer.allocate(10);
此时limit,position ,capacity的数值如图所示。

bf.put("abcde".getBytes());后各个数值如下。(写入数据)

bf.flip();后各个数值如下(flip函数为切换模式,从写模式切换到读模式)。

二、通道(Channel)(如果已经了解,请点击这里)
通道负责双向传输缓冲区的数据(传统的IO是单向的,reader读,writer写),通过缓冲区flip()来切换读、写模式。在Java NIO中,负责缓冲区中数据传输,Channel本身不存储数据,因此需要配合缓冲区进行传输。
能够获得channel的方式:
本地IO:FileInputStream FileOutputStream RandomAccessFile
网络IO: Socket ServerSocket DatagramSocket
三、代码展示
File file = new File();
Charset utfEncode = Charset.forName("UTF-8");
CharsetDecoder utfDecoder = utfEncode.newDecoder();
ByteBuffer buff = ByteBuffer.allocate((int) file.length());
CharBuffer charbuff = CharBuffer.allocate((int) file.length());
FileInputStream fis = null;
FileChannel channel = null;
StringBuilder context = new StringBuilder();
try {
//创建流
fis = new FileInputStream(file);
//获取channel
channel = fis.getChannel();
int count = channel.read(buff);
while(count > -1) {
buff.flip();
count = channel.read(buff);
}
while(buff.hasRemaining()) {
utfDecoder.decode(buff, charbuff, false);
charbuff.flip();
context.append(charbuff);
}
System.out.println(context);
} catch (IOException e) {
e.printStackTrace();
}finally {
if(fis != null) {
try {
buff.clear();
buff = null;
fis.close();
channel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
NIO教程笔记的更多相关文章
- Java NIO 学习笔记(一)----概述,Channel/Buffer
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java:NIO 学习笔记-2
Java:NIO 学习笔记-2 上一篇 NIO 学习笔记-1 看了 尚硅谷 的相应教程,此处又对比看了 黑马程序员 的课程 JAVA通信架构I/O模式,做了相应的笔记 前言 在 Java 的软件设计开 ...
- Java NIO教程 目录
"Java NIO系列教程" 是笔者hans为NIO的初学者编写的一份入门教程,想仔细学习的同学可以按照顺序去阅读.由于我学的也不是特别的精,所以错误.疏漏在所难免,希望同学们指正 ...
- jQuery官方基础教程笔记(转载)
本文转载于阮一峰的博文,内容基础,结构清晰,是jquery入门不可多得的资料,非常好,赞一个. 阮一峰:jQuery官方基础教程笔记 jQuery是目前使用最广泛的javascript函数库. 据统计 ...
- Java NIO学习笔记一 Java NIO概述
Java NIO概述 Java NIO(新的IO)是Java的替代IO API(来自Java 1.4),这意味着替代标准的 java IO和java Networking API.Java NIO提供 ...
- Java IO/NIO教程
Java IO教程 http://tutorials.jenkov.com/java-io/index.html Java NIO教程 英文版: http://tutorials.jenkov.com ...
- 简单脱壳教程笔记(2)---手脱UPX壳(1)
本笔记是针对ximo早期发的脱壳基础视频教程,整理的笔记. ximo早期发的脱壳基础视频教程 下载地址如下: http://down.52pojie.cn/%E5%90%BE%E7%88%B1%E7% ...
- Docker 入坑教程笔记
Docker 入坑教程笔记 视频网址B站:点这里 查询命令 man docker 简单启动和退出 docker run --name [容器名] -i -t ubuntu /bin/bash 交互启动 ...
- Verilog HDL实用教程笔记
Verilog HDL实用教程笔记 DRC - Design Rule Check 几何规则检查ERC - Electrical Rule Check 电学规则检查自动参数提取LVS - Logic ...
随机推荐
- package com.nps.base.xue.xd.groovyEngine import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.nps.common.service.NpsApplicationContextHolder import com.nps.data_api.service
原因: Switch this to "false" to let the transaction originator make the rollback decision. I ...
- https://blog.csdn.net/rubbertree/article/details/88877262
本文链接:https://blog.csdn.net/rubbertree/article/details/88877262 https://blog.csdn.net/mingtianhaiyouw ...
- 20140808 const和define区别 内联函数(inline) 栈和堆的地址分配 栈帧
1.const和define区别 const有数据类型(不能改变的变量),define只是简单的字符串替换,没有数据类型. C++程序用const完全取代 define. const还可以类成员函数为 ...
- 人人开源打包jar
先在renren-security执行mvn clean install 再到renren-admin目录下,执行mvn clean package,就可以打成renren-admin.jar 如果想 ...
- SaaS,PaaS,IaaS都是什么鬼?
IaaS Infrastructure as a Service,基础设施即服务. 假如你现在要做一个网站,你肯定要有一台服务器或者虚拟机,要么自己搭建,要么买服务器运营商的.说白了,IaaS就是解决 ...
- Unity中调用Windows窗口句柄以及根据需求设置并且解决扩展屏窗体显示错乱/位置错误的Bug
问题背景: 现在在搞PC端应用开发,我们开发中需要调用系统的窗口以及需要最大化最小化,缩放窗口拖拽窗口,以及设置窗口位置,去边框等功能 解决根据: 使用user32.dll解决 具体功能: Unity ...
- cmake 支持-lpthread
set(CMAKE_BUILD_TYPE "Release") if( CMAKE_BUILD_TYPE STREQUAL "Debug" ) set(C ...
- qt创建无qt工程
qt创建无qt工程,cmake . eclipse 编写makefile 代码
- Eureka中的三种角色分别是什么?
Eureka中的三种角色分别是什么? 1.Eureka Server 通过Register.Get.Renew等接口提供服务的注册和发现. 2.Application Service (Service ...
- idea 在新建一个class的时候可以选择继承的父类
1.把光标放在父类名称上按alt+enter可以生成子类 2. 选中implement abstract class