NIO中两个核心对象为Channel(通道)和Buffer(缓冲)
Buffer,ByteBuffer,CharBuffer,DoubleBuffer,FloatBuffer,IntBuffer,LongBuffer,ShortBuffer,MappedByteBuffer(ByteBuffer的子类)
实例化Buffer的方法(MappedByteBuffer除外):
ByteBuffer bb = ByteBuffer.allocate(capacity);
capacity为缓冲区容量。
对Buffer属性的一系列操作:
public static void BufferTest() {
//创建普通的buffer
ByteBuffer bb = ByteBuffer.allocate(8);
//创建直接buffer和普通buffer对比是创建成本高,I/O操作较快
ByteBuffer bb2 = ByteBuffer.allocateDirect(8);
//buffer的三属性 关系为 容量cap>=界限lim>=位置pos
//容量
bb.capacity();
//界限
bb.limit();
//位置
bb.position();
/*
* 向普通buffer中存入元素,position随添加的元素而增涨初始为0
* pos=0 lim=8 cap=8
*/
bb.put((byte) 'a');
bb.put((byte) 'b');
/*
* pos=2 lim=8 cap=8
* buffer为非空调用flip()为输出做准备
* 执行flip()后 limit指到有效长度position指到0的位置
*/
bb.flip();
/*
* pos=0 lim=2 cap=8
* 输出数据结束后调用clear()为下次输入做准备
* 执行clear()后 limit指到capacity位置position指到0位置
*/
bb.clear();
/*
* pos=0 lim=8 cap=8
* 如果再添加c元素到buffer 这时的position应该向后+1,并且覆盖掉原来的a
*/
bb.put((byte) 'c');
//pos=1 lim=8 cap=8
}
Channel类
通过下面这个方法来了解:
/**
* 传统的IO效率不高因为是依赖与字节来处理
* nio是依赖于映射内存区块来处理处理效率高
* 该方法典型的就是oc.write(mbbuffer);
* mbbuffer是Struts2Test.java的缓冲区块,这里是直接整块写出
* 传统的一般会类似:
* String str = "";
* while(str = buffer.readLine() != null) {
* xxx.write(str);
* }
*/
public static void channelTest() throws IOException {
/*
* Channel的实现类有:
* java.nio.channels包下
* DatagramChannel,FileChannel,SelectableChannel
* ServerSocketChannel,SocketChannel(支持tcp网络通信的管道)
* java.nio.channels.Pipe包下
* SinkChannel,SourceChannel(线程之间的通信管道)
*/
//创建Channel实例 一般通过节点流创建Channel
File fileIn = new File("F:"+File.separator+"testSource"+File.separator+"Struts2Test.java");
File fileOut = new File("F:"+File.separator+"testSource"+File.separator+"nioTest.txt");
//创建节点流
FileInputStream fis = new FileInputStream(fileIn);
FileOutputStream fos = new FileOutputStream(fileOut);
//创建Channel
FileChannel ic = fis.getChannel();
FileChannel oc = fos.getChannel();
//Channel常用三方法map write read
//通过map方法把Channel包装成Buffer
MappedByteBuffer mbbuffer = ic.map(MapMode.READ_ONLY, 0, fileIn.length());
//Channel只能与buffer交互不能直接访问Channel的数据
oc.write(mbbuffer);
mbbuffer.clear();
ic.close();
oc.close();
}
Channel的read类似write操作
如果在noiTest.txt文件末尾追加Struts2Test.java的内容,可以在上面代码中
26行改为
//追加到文件末尾
FileOutputStream fos = new FileOutputStream(fileOut, true);
32、33行之间加入
oc.position(fileOut.length());
结合Buffer的position属性不难推知这句代码的含义
编码解码就是ByteBuffer和CharBuffer之间的转换
Char转Byte为编码 反之为解码
下面代码简单说明了编码和解码:
public static void main(String[] args) throws CharacterCodingException {
//Encode编码(Char->Byte) Decode解码(Byte->Char)
//获取Charset
Charset cs = Charset.forName("GBK");
//实例化普通Buffer
CharBuffer cb =CharBuffer.allocate(8);
cb.put("牛");
cb.put("羊");
cb.put("马");
cb.flip();
//Charset自带编码
ByteBuffer bb = cs.encode(cb);
for(int i=0;i<bb.capacity();i++) {
System.out.println(bb.get(i)+"\t");
}
System.out.println();
//Charset自带解码
CharBuffer cbNext = cs.decode(bb);
System.out.println(cbNext);
//编码 nio
CharsetEncoder ce = cs.newEncoder();
ByteBuffer niobb = ce.encode(cbNext);
for(int i=0;i<niobb.capacity();i++) {
System.out.println(niobb.get(i)+"\t");
}
//解码 nio
CharsetDecoder cd = cs.newDecoder();
CharBuffer niocb = cd.decode(niobb);
System.out.println(niocb);
}
}
上面代码分别说明了两种编码和解码
转自:www.itlanguageexpress.info
分享到:
相关推荐
- **基本概念**:缓冲区是指在内存中预先分配的一段连续的空间,用于暂时存储输入/输出数据。 - **作用**:缓冲区作为 I/O 操作的数据中转站,提高了数据处理效率。 - **类型**:根据数据类型的不同,Java 提供了...
Java输入输出流是Java编程语言中的重要组成部分,用于处理数据的输入和输出操作。Java的I/O机制基于数据流的概念,涉及数据从源到目的地的传输。数据流分为两种主要类型:输入数据流(Input Stream)和输出数据流...
Java中的输入输出流(I/O)是处理数据输入输出的关键技术。 - **阻塞I/O(Blocked I/O)**:传统的输入输出方式,读取或写入数据时会阻塞当前线程。 - **非阻塞I/O(Non-blocking I/O)**:也称为NIO,提供了一种非阻塞的...
Java NIO(New Input/Output)是一种改进的输入输出处理方式,它在JDK 1.4中被引入。与传统的面向流的I/O模型相比,NIO主要关注于提高I/O操作的速度,并提供了一种面向块的数据处理方法。NIO通过引入新的API,如`...
为了解决这些问题,在JDK 1.4中引入了一个全新的输入/输出库——NIO(New Input/Output),它提供了高速、面向块的I/O操作,极大地提高了网络编程的效率。 #### 二、NIO核心概念介绍 NIO的核心概念包括缓冲区...
Java I/O 文件操作是Java编程中的重要组成部分,它允许开发者处理输入和输出,涉及文件的创建、读取、写入、删除以及复制等任务。在Java中,这些操作主要是通过java.io包提供的类来实现的。下面将详细介绍这些知识点...
在Java中,文件传输可以利用多种API,如Java IO(输入/输出)和NIO(非阻塞输入/输出)。IO API包括File类、InputStream和OutputStream等,用于读写文件和网络流;NIO提供更高效的数据传输方式,适合处理大量并发...
Java API文档是Java开发者不可或缺的参考资料,它详细记录了Java平台标准版(Java SE)的各种类库、接口、方法和常量,为编程者提供了全面的API信息。这份"javaAPI文档.rar"压缩包文件包含了Java 1.6版本的官方API...
Java的I/O和NIO(New I/O)是Java对输入/输出操作进行管理的两种方式。传统的I/O是阻塞式IO模型,而NIO提供了非阻塞式IO模型、多路复用IO模型、信号驱动IO模型和异步IO模型等。Java NIO核心组件包括通道(Channel)...
Java IO体系是Java编程语言中用于处理输入输出操作的核心组件,它允许程序与各种数据源(如文件、网络、内存缓冲区等)进行交互。在Java中,输入输出操作是通过流(Stream)的概念来实现的,流是数据传输的通道,可以...
Java I/O库主要由java.io包提供,后来在Java NIO(非阻塞I/O)和Java NIO.2(新I/O API,也称为NIO.2或Java 7的File API)中进行了扩展,提供了更高效和灵活的I/O操作。 1. 基本I/O:如InputStream和OutputStream...
Java NIO,全称为New Input/Output,是Java平台中用于处理输入输出操作的重要部分,自Java 1.4版本引入。NIO的核心目标是提供一种更高效、更灵活的I/O模型,以应对高性能应用的需求。传统的Java IO API基于流(Stream...
Java I/O和NIO(New I/O)是处理输入/输出操作的两种方式。I/O模型包括阻塞IO模型、非阻塞IO模型、多路复用IO模型、信号驱动IO模型和异步IO模型。Java NIO提供了基于通道(Channel)和缓冲区(Buffer)的IO操作方式...
8. **输入/输出流**:理解I/O流的概念,包括文件读写,字节流和字符流,以及缓冲区的概念。 9. **多线程**:线程的创建(Thread类和Runnable接口),同步机制(synchronized关键字,wait(), notify(), notifyAll()...
5. **IO与NIO**:Java的输入/输出系统支持流式操作,而NIO(非阻塞I/O)提供了更高效的I/O模型。理解这两种模式并选择合适的场景使用,对优化数据传输至关重要。 6. **网络编程**:Java的Socket编程接口允许创建...
3. **IO与NIO**:`java.io`包提供了传统输入/输出流,而`java.nio`包则引入了非阻塞I/O,提高了数据传输效率。 4. **网络编程**:`java.net`包包含了进行网络通信所需的所有类和接口,如Socket和ServerSocket,用于...
Java IO流是Java平台中用于处理输入/输出操作的核心组件,它允许程序与各种数据源(如文件、网络连接、内存缓冲区等)进行交互。Java IO流的精讲涵盖了许多概念和技术,包括流的分类、流的方向、缓冲区的使用、字符...
一旦连接建立,双方就可以通过输入输出流进行数据交换。 其次,Java的NIO框架为高性能网络通信提供了可能。与传统的IO模型不同,NIO是非阻塞的,这意味着当数据不可用时,读取操作不会阻塞,而是返回一个状态。`...
5. **IO与NIO**:输入/输出和非阻塞IO在Java中扮演着重要角色。这部分将探讨如何有效利用流、缓冲区以及NIO的优势进行数据传输。 6. **反射与注解**:Java的反射机制允许程序在运行时检查类和接口的信息,而注解则...