在写一个简单的Buffer的小例子的时候,抛出一个异常:
Exception in thread "main" java.nio.BufferUnderflowException at java.nio.Buffer.nextGetIndex(Buffer.java:498) at java.nio.HeapByteBuffer.getChar(HeapByteBuffer.java:253) at com.malone.nio.BufferDemo.main(BufferDemo.java:22)
例子的代码为:
public class BufferDemo { public static void main(String[] args) throws IOException { RandomAccessFile file = new RandomAccessFile ("D:\\https.txt", "rw"); FileChannel fc = file.getChannel(); ByteBuffer b = ByteBuffer.allocate(64); while (true) { int readFlag = fc.read(b); if (readFlag == -1) { break; } b.flip(); while (b.hasRemaining()) { System.out.println(b.getChar() + " " + b.position() + " " + b.remaining()); } b.clear(); } file.close(); } }
根据异常定位,在打印Buffer里面的内容的时候报错的,仔细分析一下,猜想错误原因可能是:
调用getChar()方法,char的字符长度为2个字节,而ByteBuffer的remaining长度为1时,强行获取两个字节应该会抛出异常
基于以上思路,修改例子代码,把打印代码改为:
System.out.println(b.getChar() + " " + b.position() + " " + b.remaining());
控制台打印结构为:
쳡 44 20 쪾 46 18 ꎬ 48 16 듋 50 14 솴 52 12 뷓 54 10 늻 56 8 뿉 58 6 탅 60 4 죎 62 2 ꎬ 64 0 퓲 2 19 엤 4 17 훃 6 15 桴 8 13 瑰 10 11 玻 12 9 랾 14 7 뎳 16 5 즹 18 3 ꚣ 20 1 Exception in thread "main" java.nio.BufferUnderflowException at java.nio.Buffer.nextGetIndex(Buffer.java:498) at java.nio.HeapByteBuffer.getChar(HeapByteBuffer.java:253) at com.malone.nio.BufferDemo.main(BufferDemo.java:22)
有控制台打印结果可以看出,每次从ByteBuffer的数组中每次取出两个字节来打印,并移动position的值,当移动到最后时,position和limit之间只有一个字节时,再试图获取两个字节时,就抛出了异常!
如果在打印ByteBuffer里的内容时,使用ByteBuffer的get()方法,就不会出现上面的问题,get()方法每次获取一个字节
相关推荐
根据提供的文件信息,我们可以提取并总结出关于Java NIO(New Input/Output)的重要知识点。 ### Java NIO 概述 Java NIO 是 Java 平台的一个重要特性,首次出现在 Java 1.4 版本中。它为 Java 开发者提供了一套...
在探讨Java.nio与Java.io之间的比较时,我们首先需要理解这两个包在Java编程语言中的核心作用和它们各自的优势。Java.io和Java.nio是Java中处理输入/输出操作的两个主要框架,它们各自拥有独特的特性和应用场景。 #...
Java.nio,全称为Java Non-blocking Input/Output,是Java平台从1.4版本开始引入的一套全新的I/O API,旨在替代传统的Java.io流API。它提供了更高效、更灵活的I/O操作方式,特别是在处理大量并发连接时,性能显著...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统的I/O模型的新技术。自Java 1.4版本引入NIO后,它为Java开发者提供了更高效的数据传输方式,尤其是在处理大量并发...
【java.nio.file库详解】 Java 早期版本的文件I/O操作功能相对有限,存在几个显著问题:不支持现代文件系统特性、API设计复杂且冗长、处理大文件和并发性能不足。为了解决这些问题,Java引入了`java.nio.file`库,...
找了好久,终于找到了,java刷新同步获取网络资源
JDK1.7 之 java.nio.file.Files 读取文件仅需一行代码实现 java.nio.file.Files 类是 JDK1.7 中引入的新的文件操作类,该类包含了许多有用的方法来操作文件。其中,Files.readAllBytes(Path) 方法可以将整个文件...
java.io clojure.java.io 的 JK7 java.nio.file.Path 兼容性依赖信息该库托管在 Releases 上。 依赖: [me.moocar/java.io " 0.1.0 " ]用法是 JDK7 中引入的文件路径的抽象。 这个库提供了和 Paths 之间的兼容性。 ...
标题“nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio”表明这个压缩包包含了一个关于Java NIO的实例,特别是关于NIO套接字(Socket)的编程示例。NIO套接字是Java NIO库中用于网络通信的关键组件,它们允许...
3. `java.nio.charset`:这个包提供了字符编码和解码的相关类,如Charset、CharsetDecoder和CharsetEncoder,用于处理字符串和字节之间的转换。 4. `java.nio.charset.spi`:这是一个服务提供者接口(SPI)包,定义...
### Java NIO 详细教程知识点解析 #### 一、Java NIO 概述 Java NIO(New IO)是Java平台提供的一种新的IO操作模式,它首次出现在Java 1.4版本中,并在后续版本中不断完善。Java NIO 的设计目的是为了克服传统Java ...
o Clojure对java.nio的支持。 将clojure.java.io的输入流,输出流和复制功能扩展到java.nio类。 定义新的强制功能缓冲区,字节缓冲区,字符缓冲区,双缓冲区,浮点缓冲区,整数缓冲区,长缓冲区,短缓冲区,通道,可...
java.NIO与Files工具类(解决方案).md
重新写的Java.nio的socket异步通讯,包含客户端及服务端完整版, 注:解析信息CLASS及进制转换CLASS需要自己去写,项目直接导入,需要自己写一些解析及转换类,这样你才能读懂SOCKET的异步,否则光拿代码没用 ...
java.NIO与Files工具类(处理方案示例).md
Java NIO,全称为New Input/Output,是Java在1.4版本引入的一个新的I/O API,用于替代标准的Java IO API。这个新的API提供了一种不同于传统阻塞I/O模型的非阻塞I/O处理方式,使得在处理高并发、大数据传输场景时性能...