ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

【NIO】2. ByteBuffer的基本使用

【NIO】2. ByteBuffer的基本使用 ByteBuffer的基本使用1. 项目环境2. 示例代码案例1案例2使用Java NIO的API来读取文件。1. 项目环境maven项目中引入以下依赖dependencygroupIdio.netty/groupIdartifactIdnetty-all/artifactIdversion4.1.39.Final/version/dependency准备一个文本文件其中的文本内容1234567890abc2. 示例代码案例1publicstaticvoidmain(String[]args){try(FileInputStreamfileInputStreamnewFileInputStream(src/main/resources/Buffer01_HelloWorld.txt)){// 获取文件channelFileChannelchannelfileInputStream.getChannel();// 从内存中分配一个buffer大小为10个字节ByteBufferbyteBufferByteBuffer.allocate(10);// 从channel中读取数据并写到buffer中channel.read(byteBuffer);// flip方法切换到【读模式】flip在这里的意思应该是【浏览 / 快速翻阅】byteBuffer.flip();// 打印buffer中的字节数据// 当buffer中还有剩余数据则不断读取while(byteBuffer.hasRemaining()){// 每次只读一个字节bytebbyteBuffer.get();// 将字节强转成字符打印System.out.println((char)b);}}catch(IOExceptione){thrownewRuntimeException(e);}}以上案例中先获取文件数据读取通道Channel再准备一个大小为10字节的缓存区 Buffer从Channel中读取数据并写到buffer中再打印Buffer中的数据。输出结果C:\Program Files\Java\jdk-1.8\bin\java.exe ... 1 2 3 4 5 6 7 8 9 0 Process finished with exit code 0从结果中可以看到文件中的内容并没有全部读取出来是因为只从文件中读取了一次并且缓存的大小只有10要想读取文件中的全部内容就要多次读取。案例2publicstaticvoidmain(String[]args){try(FileInputStreamfileInputStreamnewFileInputStream(src/main/resources/Buffer01_HelloWorld.txt)){// 获取文件channelFileChannelchannelfileInputStream.getChannel();// 从内存中分配一个buffer大小为10个字节ByteBufferbyteBufferByteBuffer.allocate(10);intread;// read方法的返回值代表读取到的字节数当返回值为-1时代表文件中的所有数据读取完成// 使用while一直读取直到全部读取完while((readchannel.read(byteBuffer))!-1){System.out.println(读到的字节数read);// flip方法切换到【读模式】flip在这里的意思应该是【浏览 / 快速翻阅】byteBuffer.flip();while(byteBuffer.hasRemaining()){bytebbyteBuffer.get();System.out.println((char)b);}// buffer中的数据读取完成后清空buffer的数据byteBuffer.clear();}}catch(IOExceptione){thrownewRuntimeException(e);}}以上案例在案例一的基础上多次从channel中读取数据到buffer并且打印buffer中的数据直到文件中的内容全部读取完buffer中的数据读取完成后在 再次从channel中读取数据到buffer之前要清空buffer的数据。输出结果C:\Program Files\Java\jdk-1.8\bin\java.exe ... 读到的字节数10 1 2 3 4 5 6 7 8 9 0 读到的字节数3 a b c Process finished with exit code 0可以看到一共读取了两次实际上应该是3次第一个读取10个字节第二次读取剩余的3个字节第三次没有读取到数据read方法返回-1。
返回列表