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教程笔记的更多相关文章

  1. Java NIO 学习笔记(一)----概述,Channel/Buffer

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  2. Java:NIO 学习笔记-2

    Java:NIO 学习笔记-2 上一篇 NIO 学习笔记-1 看了 尚硅谷 的相应教程,此处又对比看了 黑马程序员 的课程 JAVA通信架构I/O模式,做了相应的笔记 前言 在 Java 的软件设计开 ...

  3. Java NIO教程 目录

    "Java NIO系列教程" 是笔者hans为NIO的初学者编写的一份入门教程,想仔细学习的同学可以按照顺序去阅读.由于我学的也不是特别的精,所以错误.疏漏在所难免,希望同学们指正 ...

  4. jQuery官方基础教程笔记(转载)

    本文转载于阮一峰的博文,内容基础,结构清晰,是jquery入门不可多得的资料,非常好,赞一个. 阮一峰:jQuery官方基础教程笔记 jQuery是目前使用最广泛的javascript函数库. 据统计 ...

  5. Java NIO学习笔记一 Java NIO概述

    Java NIO概述 Java NIO(新的IO)是Java的替代IO API(来自Java 1.4),这意味着替代标准的 java IO和java Networking API.Java NIO提供 ...

  6. Java IO/NIO教程

    Java IO教程 http://tutorials.jenkov.com/java-io/index.html Java NIO教程 英文版: http://tutorials.jenkov.com ...

  7. 简单脱壳教程笔记(2)---手脱UPX壳(1)

    本笔记是针对ximo早期发的脱壳基础视频教程,整理的笔记. ximo早期发的脱壳基础视频教程 下载地址如下: http://down.52pojie.cn/%E5%90%BE%E7%88%B1%E7% ...

  8. Docker 入坑教程笔记

    Docker 入坑教程笔记 视频网址B站:点这里 查询命令 man docker 简单启动和退出 docker run --name [容器名] -i -t ubuntu /bin/bash 交互启动 ...

  9. Verilog HDL实用教程笔记

    Verilog HDL实用教程笔记 DRC - Design Rule Check 几何规则检查ERC - Electrical Rule Check 电学规则检查自动参数提取LVS - Logic ...

随机推荐

  1. 安装MikTex Portable

    下载地址:http://miktex.org/portable 解压到一个目录 $(MikTex)下, 然后创建以下两个批处理程序: 1. run.bat, 用来运行.tex扩展名的文件 1: $(M ...

  2. flink中对于window和watermark的一些理解

    package com.chenxiang.flink.demo; import java.io.IOException; import java.net.ServerSocket; import j ...

  3. el-scrollbar 如何去掉横线滚动条?

    1. el-scrollbar style="height:100%" 2. 不要在scoped私有变量添加 .el-scrollbar__wrap{ overflow-x: hi ...

  4. HTTP信息头处理器

    就是HTTP请求头-Header

  5. vscode centos

    https://www.cnblogs.com/My-Jinse/articles/8400137.html rpm -ql 包名 缺少libXss.so.1()(64bit) yum install ...

  6. Vue.js 复选框

    demo <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...

  7. layui中load具体用法

    遮盖窗体,demo: layer.load(,{ // content: "加载中...", shade: [0.4,'#000'], //0.1透明度的白色背景 time:* } ...

  8. 49. ArrayList LinkedList中特有的方法

    集合的体系:--------------| Collection  单列集合的根接口 ----------| List 如果实现了List接口的集合类,该类具备的特点是:有序,可重复 ------|A ...

  9. photoshop钢笔工具简单记录

    1. 移动锚点 Ctrl + 左键 2. 增加.删除锚点 左键(显示+.-) 3. 直线曲线相互转换 Alt + 左键(注意提示) 默认情况下为直线,按住Alt鼠标左键点击目标锚点,目标锚点两边的直线 ...

  10. 理解TCP/IP,SOCKET,HTTP,FTP,RMI,RPC,webservic

    TCP/IP:网络宽带,传输数据的基础协议,所有得数据要在网络上传输都是基于TCP/IP协议(或UDP),才能送达到指定的目的地(IP,服务器硬件地址). SOCKET:SOCKET只是面对编程人员的 ...