在写一个简单的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资源下载资源下载
找了好久,终于找到了,java刷新同步获取网络资源
Java.nio 与Java.io比较
java.io clojure.java.io 的 JK7 java.nio.file.Path 兼容性依赖信息该库托管在 Releases 上。 依赖: [me.moocar/java.io " 0.1.0 " ]用法是 JDK7 中引入的文件路径的抽象。 这个库提供了和 Paths 之间的兼容性。 ...
但 Java 在后期版本中引入了 java.nio.file 库来提高 Java 对文件操作的能力。还增加的流的功能,似乎使得文件变成更好用了。所以本章,我们就来主要介绍 java.nio.file 中常用的类和模块,大致如下: Path 路径:...
java.nio包的学习总结,看看确实有收获
Java.NIO_网络编程_入门讲解,初学者适合的资料
下面小编就为大家分享一篇JDK1.7 之java.nio.file.Files 读取文件仅需一行代码实现,具有很好的参考价值,希望对大家有所帮助
o Clojure对java.nio的支持。 将clojure.java.io的输入流,输出流和复制功能扩展到java.nio类。 定义新的强制功能缓冲区,字节缓冲区,字符缓冲区,双缓冲区,浮点缓冲区,整数缓冲区,长缓冲区,短缓冲区,通道,可...
java 1.4中推出的java.nio(新输入/输出)软件包允许像在其他低级语言——如C语言——中一样进行输入/输出。许多开发者认为这些新功能只能进行非阻塞操作;但是,这些新功能提供许多其他新鲜有趣的特性,它们包括:...
java NIO详细教程,包括使用背景,实现原理,代码实现
重新写的Java.nio的socket异步通讯,包含客户端及服务端完整版, 注:解析信息CLASS及进制转换CLASS需要自己去写,项目直接导入,需要自己写一些解析及转换类,这样你才能读懂SOCKET的异步,否则光拿代码没用 ...
Apress.Pro.Java.7.NIO.2.2011
java nio 编程一个实例子.服务端程序
NULL 博文链接:https://shihuan830619.iteye.com/blog/1159544
Java的IO操作集中在java.io这个包中,是基于流的同步(blocking)API。对于大多数应用来说,这样的API使用很方便,然而,一些对性能要求较高的应用,尤其是服务端应用,往往需要一个更为有效的方式来处理IO。从JDK ...
在JDK 1.4以前,Java的IO操作集中在java.io这个包中,是基于流的同步(blocking)API。对于大多数应用来说,这样的API使用很方便,然而,一些对性能要求较高的应用,尤其是服务端应用,往往需要一个更为有效的方式来...
java NIO.zip