参考:https://www.cnblogs.com/ostenant/p/9695177.html
在Java NIO中,缓冲区用来临时存储数据,可以理解为是I/O *** 作中数据暂存的中转站。缓冲区直接为通道(Channel)服务,数据是从通道读入缓冲区,从缓冲区写入到通道中的。
缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问这块内存。
Buffer的类型Java NIO提供以下几种Buffer类型:
- ByteBuffer
- MappedByteBuffer
- ShortBuffer
- LongBuffer
- FloatBuffer
- CharBuffer
- IntBuffer
- DoubleBuffer
这些Buffer类型代表了Java中7种基本数据类型。换句话说,就是可以通过byte、char、short、int、long、float或double类型来 *** 作缓冲区中的数据。
使用Buffer读写数据一般遵循以下四个步骤:
- 写入数据到Buffer中;
- 调用Buffer的flip()方法;
- 从Buffer中读取数据;
- 调用clear()方法或者compact()方法。
当向Buffer写入数据时,Buffer会记录下写了多少数据。一旦要读取数据,需要通过flip()方法将Buffer从写模式切换到读模式。在读模式下,可以读取之前写入到Buffer的所有数据。
一旦读完了所有的数据,就需要清空缓冲区,让它可以再次被写入。两种方式能清空缓冲区:调用clear()或compact()方法。
clear()方法:清空整个缓冲区,包括已读和未读的数据。
compact()方法:只会清空已读的数据,未读的数据都被移到缓冲区的起始处,新写入的数据将放到缓冲区未读数据的后面。
下面给出一个ByteBuffer的简单使用示例,其他缓冲区API的使用类似:
package com.example.dtest.nio.buffer; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class BufferTest01 { public static void main(String[] args) { testReadFromBuffer(); } public static void testReadFromBuffer(){ try { RandomAccessFile randomAccessFile = new RandomAccessFile("D:\test.txt", "rw"); FileChannel fileChannel = randomAccessFile.getChannel(); StringBuilder stringBuilder = new StringBuilder(); // 创建容量为10byte的buffer ByteBuffer byteBuffer = ByteBuffer.allocate(10); // 不断地写入缓冲区,写一次读一次 while (fileChannel.read(byteBuffer) != -1){ // 设置buffer切换模式为读模式 byteBuffer.flip(); while (byteBuffer.hasRemaining()){ // 每次读取1byte,也就是1字节 // System.out.println((char) byteBuffer.get()); stringBuilder.append((char) byteBuffer.get()); } // 清空整个缓冲区,准备下次写入 byteBuffer.clear(); } System.out.println(stringBuilder.toString()); fileChannel.close(); } catch (FileNotFoundException e) { e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } } }
结果:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)