IO与NIO

NIO简单来讲就是new IO,核心是一个接口两个抽象类,interface Channel、abstract class Buffer、abstract class Charset 。

1.Buffer最常用的两个子类是ByteBuffer、charBuffer。Buffer中有三个重要的概念:capacity(容量)、limit(界限)、position(位置):

capacity,缓冲区的容量表示该Buffer的最大数据容量,即最多可以存储多少数据,Buffer对象创建后,capacity不能改变,例如 ByteBuffer bbuff=ByteBuffer.allocate(8);  CharBuffer cbuff=CharBuffer.allocate(8);

另外两个概念limit、position 则参考Buffer的flip()方法,clear()方法的源码与注释理解:

/**
	 * Flips this buffer. The limit is set to the current position and then the
	 * position is set to zero. If the mark is defined then it is discarded.
	 *
	 * <p>
	 * After a sequence of channel-read or <i>put</i> operations, invoke this
	 * method to prepare for a sequence of channel-write or relative <i>get</i>
	 */
	public final Buffer flip() {
		limit = position;
		position = 0;
		mark = -1;
		return this;
	}

flip()方法为从Buffer中取数据做好准备,把limit设到原来position所在位置,这样相当于把Buffer中没有数据的存储空间挡住了,从而避免读到null。

/**
	 * Clears this buffer. The position is set to zero, the limit is set to the
	 * capacity, and the mark is discarded.
	 *
	 * <p>
	 * Invoke this method before using a sequence of channel-read or <i>put</i>
	 *
	 * <p>
	 * This method does not actually erase the data in the buffer, but it is
	 * named as if it did because it will most often be used in situations in
	 * which that might as well be the case.
	 * </p>
	 */
	public final Buffer clear() {
		position = 0;
		limit = capacity;
		mark = -1;
		return this;
	}

clear()方法为再次向Buffer中装入数据做好准备,Buffer中的原来的数据还在,没有被删除。

2.Channel的常用实现类为FileChannel,此实现类最常用的方法有MappedByteBuffer map(MapMode mode, long position, long size)、read()的一系列重载、write()的一系列重载方法:

FileChannel对象不是由构造器产生的,而是由FileInputStream、FileOutputStream的getChannel()产生的:

@Test
	public void testFileChannel() throws IOException, InterruptedException {
		File f = new File("src/main/resources/b.txt");
		// 通过fileInputStream.getChannel()方法得到FileChannel对象
		FileChannel inChannel = new FileInputStream(f).getChannel();
		/**
		 * 程序不能直接访问FileChannel中的数据,包括读取、写入都不行,FileChannel只能与MappedByteBuffer(
		 * ByteBuffer的子类)进行交互。
		 */
		// FileChannel可以将指定文件的部分或全部直接映射成ByteBuffer
		ByteBuffer bbuff = inChannel.map(MapMode.READ_ONLY, 0, f.length());
		// 通过fileOutputStream.getChannel()方法得到FileChannel对象
		FileChannel outChannel = new FileOutputStream("src/main/resources/b2.txt").getChannel();
		outChannel.write(bbuff);
	}

3.Charset主要来处理ByteBuffer和CharBuffer(或字符串,CharBuffer对象的toString()方法可以获取对应的字符串)之间的转换。利用Charset的静态方法forName(String charsetName)来获取Charset对象,之后,就可以起通过该对象的newDecoder()、newEncoder()这两个方法分别返回CharsetDecoder和CharsetEncoder对象,代表该Charset的解码器和编码器。调用CharsetDecoder的decode()方法可以将ByteBuffer转换成CharBuffer,调用CharsetEncoder的encode()方法可以将CharBuffer或者String转换成byteBuffer。

Charset charset = Charset.forName("UTF-8");
CharBuffer cbuff = charset.decode(bbuff);
System.out.println(cbuff);

decode()方法的参数是ByteBuffer对象,怎么获得呢?由FileChannel对象的map(MapMode mode, long position, long size)方法获得。FileChannel对象怎么获得呢?FileInputStream对象的getChannel()方法获得,而FileInputStream与最终处理的文件有关系。

时间: 2025-01-10 20:16:13

IO与NIO的相关文章

面试题_66_to_75_Java IO 和 NIO 的面试题

IO 是 Java 面试中一个非常重要的点.你应该很好掌握 Java IO,NIO,NIO2 以及与操作系统,磁盘 IO 相关的基础知识.下面是 Java IO 中经常问的问题. 66)在我 Java 程序中,我有三个 socket,我需要多少个线程来处理? 67)Java 中怎么创建 ByteBuffer? 68)Java 中,怎么读写 ByteBuffer ? 69)Java 采用的是大端还是小端? 70)ByteBuffer 中的字节序是什么? 71)Java 中,直接缓冲区与非直接缓冲器

Nio学习4——EchoServer在Io,Nio,Nio.2中的实现

阻塞IO实现: public class PlainEchoServer { public void serve(int port) throws IOException { final ServerSocket socket = new ServerSocket(port); try { while (true) { final Socket clientSocket = socket.accept(); System.out.println("Accepted connection from

IO和NIO的区别

java NIO和IO的主要区别是: IO                NIO 面向流            面向缓冲 阻塞IO           非阻塞IO 无 选择器 IO是为每一次连接创建一个线程,当并发数量非常大的时候,线程所占用的栈内存和cup线程切换的开销非常大,而NIO不在是为每个线程创建单独的线程,而是缓冲区,缓存了一定数量的线程. 面向流与面向缓冲 Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的. Java IO面向流意味着每次从流中读一

IO,NIO浅析

IO:传统的java输入输出. 1.字节流:inputstream(读),outputstream(写): 2.字节流:reader (读),writer(写). 字符流和字节流的区别: 1.字节流读一个字节返回一个字节,字符流读取一个或者多个字节(中文用utf8编码表中对应的字节数是三个),先查询编码表再返回字符. 2.字节流可以处理所有类型的数据如mp3,图片,avi,而字符流只能处理字符数据. 如果处理纯文本数据要优先考虑使用字符流,其他都是用字节流.因为硬盘上的所有文件都是以字节的形式进

java对比IO和NIO的文件读写性能测试

原文:java对比IO和NIO的文件读写性能测试 源代码下载地址:http://www.zuidaima.com/share/1550463508466688.htm 1. NIO采用更接近操作系统执行IO的方式:通道和缓存器:顾名思义,数据源的数据由缓存器通过通道进行传输. 2. 在JDK5之后,原始IO系统底层用NIO进行了优化,这可以通过sun公布的源码中找到,但是,NIO系统性还是比IO强. 3. 在稍微研究了IO源码以及部分sun源码,我觉得IO系统的性能瓶颈主要是由于原始的IO架构因

Java NIO:IO与NIO的区别

一.概念 NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多.在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO. 二.NIO和IO的主要区别 下表总结了Java IO和NIO之间的主要区别: IO NIO 面向流 面向缓冲 阻塞IO 非阻塞IO 无 选择器 1.面向流与面向缓冲 Java IO和NIO之间第一个最大的区别是,IO是面向流的,NIO是

java的nio之:java的nio系列教程之java的io和nio的区别

当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景,以及它们如何影响您的代码设计. Java NIO和IO的主要区别 下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分的差异. IO                NIO 面向流            面向缓冲 阻塞IO           非阻塞IO 无 选择器 面向流与面向缓冲 Java NIO

Java IO模型&amp;NIO

Java IO模型&NIO Java IO模型NIO 楔子 概述 网络服务 经典的服务设计 经典的SocketServer循环阻塞 可伸缩目标 分而治之 事件驱动设计 背景知识AWT 事件 Reactor 模式 Reactor基础模式 Java NIO 支持 Channels Buffers Selectors SelectionKeys Reactor 模式实践 第一步初始化 第二步循环分发 第三步接收者 第四步 Handler设置 第五步请求处理 还有一种状态Handler 多线程版本Rea

IO与NIO的区别

一.概念 NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多.在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO. 二.NIO和IO的主要区别 下表总结了Java IO和NIO之间的主要区别: IO NIO 面向流 面向缓冲 阻塞IO 非阻塞IO 无 选择器 1.面向流与面向缓冲 Java IO和NIO之间第一个最大的区别是,IO是面向流的,NIO是

Java IO与NIO的总结、比较

一.IO流总结 1.Java I/O主要包括如下3层次: 流式部分--最主要的部分.如:OutputStream.InputStream.Writer.Reader等 非流式部分--如:File类.RandomAccessFile类和FileDescriptor等类 其他--文件读取部分的与安全相关的类,如:SerializablePermission类,以及与本地操作系统相关的文件系统的类,如:FileSystem类和Win32FileSystem类和WinNTFileSystem类. 2.流