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 ...
随机推荐
- 2019牛客多校第三场J-LRU management(map+双向链表)
LRU management 题目传送门 解题思路 用map索引对应地址,用双向链表维护序列. 代码如下 #include <bits/stdc++.h> #define INF 0x3f ...
- VC++ 2010 创建高级Ribbon界面详解(1)
运用 VC++ 2010 创建高级 Ribbon 界面详解,包括 Ribbon 界面的结构层次.Ribbon 控件的使用等,ribbon 用户界面,ribbon interface ,ribbon 高 ...
- zabbix--zabbix server的配置以及zabbix agent的安装配置
1.zabbix server端的配置在进行源码安装zabbix时已经配置好了,具体要配置的参数如下: ListenPort=10051 server服务的监听端口,默认是10051 DBHost= ...
- SDL系列之 - 用SDL动态地画一个圆喽 && 设置背景色
#include <SDL.h> #include <stdlib.h> #include <string.h> #include <math.h> # ...
- C预处理之宏定义
#include <stdio.h> //定义不带参数的宏 #define PI 3.14 /*********************************************** ...
- opencv 图像细化
图像细化多用于机器人视觉,OCR字符识别等领域,细化后的图像经过去毛刺就成为了我们常说的图像的骨架. 该图像细化代码依据论文: T. Y. ZHANG and C. Y. SUEN A Fast P ...
- C# 消息队列 多线程 委托
发消息 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...
- SQLServer2008上的SDE备份和还原
一.备份 右键数据库>任务>备份.选择完整模式,导出为xxx.bak文件即可. 二.还原 1.创建sde用户名,新建同名数据库xxx,并指定sde为xxx的拥有者. 2.在master上创 ...
- C++ 数组作为参数的传递
//#include <iostream> //#include <conio.h> //using namespace std; // // //void are7(int( ...
- Go 动态类型声明
Go 动态类型声明 package main import "fmt" func main() { var x float64 = 20.0 y := 42 fmt.Println ...