NIO入门-----01

package com.sico.pck01_nio;

import java.nio.ByteBuffer;

import org.junit.Test;

/**

* @author Sico

* 1、NIO入门:三个核心概念如下:

*   |--通道:连接作用,连接数据源和目标地

*   |--缓冲区:用于存取数据

*   |--选择器:

*

* 2、NIO与IO的区别:

*   |--IO面向流,NIO面向缓冲区

*   |--IO阻塞,NIO非阻塞

*   |--

* 3、(1)缓冲区:负责数据的存取,底层数组(用于存取不同类型的数据),根据类型的不同有相应类型的缓冲区(boolean除外):ByteBuffer,CharBuffer,LongBuffer,IntBuffer,FloatBuffer,

*   DoubleBuffer,ShortBuffer===》》》以上缓冲区的管理方式类似,都是通过allocate换区缓冲区。最常用为ByteBuffer缓冲区

*   (2)缓冲区中存取数据的两个核心方法,put存,get取

*   (3)缓冲区中的核心属性

*    |--mark:记录当前position的位置,通过reset回复到mark记录的位置

|--position:缓冲区中正在数据的位置

|--limit:缓冲区中可以操作数据的大小,limit后面的数据无法操作

|--capacity:缓冲区的最大容量,一旦声明不允许改变,原因:底层是数组,数组大小声明后不允许更改

规律:mark<=position<=limit<=capacity

*

*/

public class Nio01 {

@Test

public void fun02(){

ByteBuffer buf = ByteBuffer.allocate(1024);

buf.put("abcde".getBytes());

printProperty(buf);

print("******************************");

buf.flip();

byte[] dst=new byte[buf.limit()];

buf.get(dst, 0, 2);

print("获取到的数据:"+new String(dst));

buf.mark();

printProperty(buf);

print("******************************");

buf.get(dst, 2, 2);

print("获取的数据:"+new String(dst));

printProperty(buf);

print("******************************");

buf.reset();

printProperty(buf);

//判断缓冲区中是否还有数据

if(buf.hasRemaining()){

print("缓冲区中还可以获取的字节数:"+buf.remaining());

}

}

@Test

public void fun01(){

//1、获取指定大小的缓冲区

ByteBuffer buf = ByteBuffer.allocate(1024);

printProperty(buf);

print("******************************");

//2、put存取数据,写模式

buf.put("abcde".getBytes());

printProperty(buf);

//3、切换模式

buf.flip();

print("******************************");

//4、读模式

printProperty(buf);

byte[] dst=new byte[buf.limit()];

buf.get(dst);

print("获取到的数据:"+new String(dst));

print("******************************");

printProperty(buf);

//5、rewind();可重复读取数据

buf.rewind();

print("******************************");

printProperty(buf);

//6、清空缓冲区clear,但是缓冲区中的数据依然存在,处于被遗忘的状态

buf.clear();

print("依然有数据:"+(char)buf.get());

print("******************************");

printProperty(buf);

}

public void  printProperty(ByteBuffer buf){

print("position:"+buf.position());

print("limit:"+buf.limit());

print("capacity:"+buf.capacity());

}

public void print(Object o){

System.out.println(o);

}

}

原文地址:https://www.cnblogs.com/sico/p/10386464.html

时间: 2024-10-02 22:39:10

NIO入门-----01的相关文章

Java NIO入门

NIO入门 前段时间在公司里处理一些大的数据,并对其进行分词.提取关键字等.虽说任务基本完成了(效果也不是特别好),对于Java还没入门的我来说前前后后花了2周的时间,我自己也是醉了.当然也有涉及到机器学习的知识,我想陆陆续续的记录下我的这一次任务的过程,也算做一个总结. 首先,手上有这么个达G级别的文件,按照Java普通I/O的方式肯定是不行的了,划分文件的话,也不知何年何月才能读完.所以后来上网查找了相关资料,才知道有这么个神奇的NIO. 在Java编程中,I/O是用流的方式读取文件,所有I

NIO入门系列之第5章:关于缓冲区的更多内容

第5章 关于缓冲区的更多内容 5.1  概述 到目前为止,您已经学习了使用缓冲区进行日常工作所需要掌握的大部分内容.我们的例子没怎么超出标准的读/写过程种类,在原来的 I/O中可以像在 NIO 中一样容易地实现这样的标准读写过程. 本节将讨论使用缓冲区的一些更复杂的方面,比如缓冲区分配.包装和分片.我们还会讨论 NIO 带给 Java 平台的一些新功能.您将学到如何创建不同类型的缓冲区以达到不同的目的,如可保护数据不被修改的只读缓冲区,和直接映射到底层操作系统缓冲区的直接缓冲区.我们将在本节的最

NIO入门系列之第6章:分散和聚集

第6章 分散和聚集 6.1  概述 分散/聚集 I/O 是使用多个而不是单个缓冲区来保存数据的读写方法. 一个分散的读取就像一个常规通道读取,只不过它是将数据读到一个缓冲区数组中而不是读到单个缓冲区中.同样地,一个聚集写入是向缓冲区数组而不是向单个缓冲区写入数据. 分散/聚集 I/O 对于将数据流划分为单独的部分很有用,这有助于实现复杂的数据格式. 6.2  分散/聚集 I/O 通道可以有选择地实现两个新的接口: ScatteringByteChannel 和 GatheringByteChan

NIO入门系列之第7章:文件锁定

第7章 文件锁定 7.1  概述 文件锁定初看起来可能让人迷惑.它似乎指的是防止程序或者用户访问特定文件.事实上,文件锁就像常规的 Java 对象锁-它们是劝告式的(advisory)锁.它们不阻止任何形式的数据访问,相反,它们通过锁的共享和获取赖允许系统的不同部分相互协调. 您可以锁定整个文件或者文件的一部分.如果您获取一个排它锁,那么其他人就不能获得同一个文件或者文件的一部分上的锁.如果您获得一个共享锁,那么其他人可以获得同一个文件或者文件一部分上的共享锁,但是不能获得排它锁.文件锁定并不总

NIO入门系列之第4章:缓冲区内部细节

4.1  概述 本节将介绍 NIO 中两个重要的缓冲区组件:状态变量和访问方法 (accessor). 状态变量是前一节中提到的"内部统计机制"的关键.每一个读/写操作都会改变缓冲区的状态.通过记录和跟踪这些变化,缓冲区就可能够内部地管理自己的资源. 在从通道读取数据时,数据被放入到缓冲区.在有些情况下,可以将这个缓冲区直接写入另一个通道,但是在一般情况下,您还需要查看数据.这时使用访问方法 get() 来完成的.同样,如果要将原始数据放入缓冲区中,就要使用访问方法 put(). 在本

NIO入门系列之第3章:从理论到实践:NIO 中的读和写

3.1  概述 读和写是 I/O 的基本过程.从一个通道中读取很简单:只需创建一个缓冲区,然后让通道将数据读到这个缓冲区中.写入也相当简单:创建一个缓冲区,用数据填充它,然后让通道用这些数据来执行写入操作. 在本节中,我们将学习有关在Java 程序中读取和写入数据的一些知识.我们将回顾 NIO 的主要组件(缓冲区.通道和一些相关的方法),看看它们是如何交互以进行读写的.在接下来的几节中,我们将更详细地分析这其中的每个组件以及其交互. 3.2  从文件中读取 在我们第一个练习中,我们将从一个文件中

NIO入门系列之第一章:输入/输出:概念性描述

第1章 输入/输出:概念性描述 1.1  I/O 简介 I/O 或者输入/输出指的是计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键,因而所有 I/O 的主体实际上是内置在操作系统中的.单独的程序一般是让系统为它们完成大部分的工作. 在 Java 编程中,直到最近一直使用流的方式完成 I/O.所有 I/O 都被视为单个的字节的移动,通过一个称为 Stream 的对象一次移动一个字节.流 I/O 用于与外部世界接触.它也在内部使用,用于将对象转换为字节,然

NIO入门系列之第二章:通道和缓冲区

第2章 通道和缓冲区 2.1  概述 通道和缓冲区是 NIO 中的核心对象,几乎在每一个I/O 操作中都要使用它们. 通道是对原 I/O 包中的流的模拟.到任何目的地(或来自任何地方)的所有数据都必须通过一个 Channel 对象.一个 Buffer 实质上是一个容器对象.发送给一个通道的所有对象都必须首先放到缓冲区中:同样地,从通道中读取的任何数据都要读到缓冲区中. 2.2  什么是缓冲区? Buffer 是一个对象,它包含一些要写入或者刚读出的数据.在 NIO 中加入 Buffer 对象,体

NIO入门系列之第8章:连网和异步 I/O

8.1  概述 连网是学习异步 I/O 的很好基础,而异步 I/O 对于在 Java 语言中执行任何输入/输出过程的人来说,无疑都是必须具备的知识.NIO 中的连网与 NIO 中的其他任何操作没有什么不同--它依赖通道和缓冲区,而您通常使用InputStream 和 OutputStream来获得通道. 本节首先介绍异步 I/O 的基础-它是什么以及它不是什么,然后转向更实用的.程序性的例子. 8.2  异步 I/O 异步 I/O 是一种没有阻塞地读写数据的方法.通常,在代码进行 read()