千家信息网

如何进行Java NIO中缓冲区的分析

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇文章为大家展示了如何进行Java NIO中缓冲区的分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。对于NIO中缓冲区来说,还有很多的内容值的学习,如缓冲
千家信息网最后更新 2026年11月02日如何进行Java NIO中缓冲区的分析

本篇文章为大家展示了如何进行Java NIO中缓冲区的分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

对于NIO中缓冲区来说,还有很多的内容值的学习,如缓冲区的分片与数据共享,只读缓冲区等。下面我们来看一下缓冲区一些更细节的内容。

缓冲区的分配

在前面的几个例子中,我们已经看过了,在创建一个缓冲区对象时,会调用静态方法allocate()来指定缓冲区的容量,其实调用 allocate()相当于创建了一个指定大小的数组,并把它包装为缓冲区对象。或者我们也可以直接将一个现有的数组,包装为缓冲区对象,如下示例代码所示:

[java] view plain copy

print?

  1. public class BufferWrap {

  2. public void myMethod()

  3. {

  4. // 分配指定大小的缓冲区

  5. ByteBuffer buffer1 = ByteBuffer.allocate(10);

  6. // 包装一个现有的数组

  7. byte array[] = new byte[10];

  8. ByteBuffer buffer2 = ByteBuffer.wrap( array );

  9. }

  10. }

缓冲区分片

在NIO中,除了可以分配或者包装一个缓冲区对象外,还可以根据现有的缓冲区对象来创建一个子缓冲区,即在现有缓冲区上切出一片来作为一个新的缓冲区,但现有的缓冲区与创建的子缓冲区在底层数组层面上是数据共享的,也就是说,子缓冲区相当于是现有缓冲区的一个视图窗口。调用slice()方法可以创建一个子缓冲区,让我们通过例子来看一下:

[java] view plain copy

print?

  1. import java.nio.*;

  2. public class Program {

  3. static public void main( String args[] ) throws Exception {

  4. ByteBuffer buffer = ByteBuffer.allocate( 10 );

  5. // 缓冲区中的数据0-9

  6. for (int i=0; i

  7. buffer.put( (byte)i );

  8. }

  9. // 创建子缓冲区

  10. buffer.position( 3 );

  11. buffer.limit( 7 );

  12. ByteBuffer slice = buffer.slice();

  13. // 改变子缓冲区的内容

  14. for (int i=0; i

  15. byte b = slice.get( i );

  16. b *= 10;

  17. slice.put( i, b );

  18. }

  19. buffer.position( 0 );

  20. buffer.limit( buffer.capacity() );

  21. while (buffer.remaining()>0) {

  22. System.out.println( buffer.get() );

  23. }

  24. }

  25. }

在该示例中,分配了一个容量大小为10的缓冲区,并在其中放入了数据0-9,而在该缓冲区基础之上又创建了一个子缓冲区,并改变子缓冲区中的内容,从最后输出的结果来看,只有子缓冲区"可见的"那部分数据发生了变化,并且说明子缓冲区与原缓冲区是数据共享的。

只读缓冲区

只读缓冲区非常简单,可以读取它们,但是不能向它们写入数据。可以通过调用缓冲区的asReadOnlyBuffer()方法,将任何常规缓冲区转 换为只读缓冲区,这个方法返回一个与原缓冲区完全相同的缓冲区,并与原缓冲区共享数据,只不过它是只读的。如果原缓冲区的内容发生了变化,只读缓冲区的内容也随之发生变化:

[java] view plain copy

print?

  1. import java.nio.*;

  2. public class Program {

  3. static public void main( String args[] ) throws Exception {

  4. ByteBuffer buffer = ByteBuffer.allocate( 10 );

  5. // 缓冲区中的数据0-9

  6. for (int i=0; i

  7. buffer.put( (byte)i );

  8. }

  9. // 创建只读缓冲区

  10. ByteBuffer readonly = buffer.asReadOnlyBuffer();

  11. // 改变原缓冲区的内容

  12. for (int i=0; i

  13. byte b = buffer.get( i );

  14. b *= 10;

  15. buffer.put( i, b );

  16. }

  17. readonly.position(0);

  18. readonly.limit(buffer.capacity());

  19. // 只读缓冲区的内容也随之改变

  20. while (readonly.remaining()>0) {

  21. System.out.println( readonly.get());

  22. }

  23. }

  24. }

如果尝试修改只读缓冲区的内容,则会报ReadOnlyBufferException异常。只读缓冲区对于保护数据很有用。在将缓冲区传递给某个 对象的方法时,无法知道这个方法是否会修改缓冲区中的数据。创建一个只读的缓冲区可以保证该缓冲区不会被修改。只可以把常规缓冲区转换为只读缓冲区,而不能将只读的缓冲区转换为可写的缓冲区。

直接缓冲区

直接缓冲区是为加快I/O速度,使用一种特殊方式为其分配内存的缓冲区,JDK文档中的描述为:给定一个直接字节缓冲区,Java虚拟机将尽最大努 力直接对它执行本机I/O操作。也就是说,它会在每一次调用底层操作系统的本机I/O操作之前(或之后),尝试避免将缓冲区的内容拷贝到一个中间缓冲区中 或者从一个中间缓冲区中拷贝数据。要分配直接缓冲区,需要调用allocateDirect()方法,而不是allocate()方法,使用方式与普通缓冲区并无区别,如下面的拷贝文件示例:

[java] view plain copy

print?

  1. import java.io.*;

  2. import java.nio.*;

  3. import java.nio.channels.*;

  4. public class Program {

  5. static public void main( String args[] ) throws Exception {

  6. String infile = "c:\\test.txt";

  7. FileInputStream fin = new FileInputStream( infile );

  8. FileChannel fcin = fin.getChannel();

  9. String outfile = String.format("c:\\testcopy.txt");

  10. FileOutputStream fout = new FileOutputStream( outfile );

  11. FileChannel fcout = fout.getChannel();

  12. // 使用allocateDirect,而不是allocate

  13. ByteBuffer buffer = ByteBuffer.allocateDirect( 1024 );

  14. while (true) {

  15. buffer.clear();

  16. int r = fcin.read( buffer );

  17. if (r==-1) {

  18. break;

  19. }

  20. buffer.flip();

  21. fcout.write( buffer );

  22. }

  23. }

  24. }

内存映射文件I/O

内存映射文件I/O是一种读和写文件数据的方法,它可以比常规的基于流或者基于通道的I/O快的多。内存映射文件I/O是通过使文件中的数据出现为 内存数组的内容来完成的,这其初听起来似乎不过就是将整个文件读到内存中,但是事实上并不是这样。一般来说,只有文件中实际读取或者写入的部分才会映射到内存中。如下面的示例代码:

[java] view plain copy

print?

  1. import java.io.*;

  2. import java.nio.*;

  3. import java.nio.channels.*;

  4. public class Program {

  5. static private final int start = 0;

  6. static private final int size = 1024;

  7. static public void main( String args[] ) throws Exception {

  8. RandomAccessFile raf = new RandomAccessFile( "c:\\test.txt", "rw" );

  9. FileChannel fc = raf.getChannel();

  10. MappedByteBuffer mbb = fc.map( FileChannel.MapMode.READ_WRITE,

  11. start, size );

  12. mbb.put( 0, (byte)97 );

  13. mbb.put( 1023, (byte)122 );

  14. raf.close();

  15. }

  16. }

上述内容就是如何进行Java NIO中缓冲区的分析,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

缓冲区 缓冲 数据 内容 方法 文件 内存 对象 分配 数组 示例 包装 个子 大小 常规 拷贝 变化 分析 也就是 也就是说 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技有限公司 互联网科技公司发展 万易互联网科技有限公司 美国互联网黑科技 米客互联网科技 居家互联网科技有限公司 互联网科技公司的市场部门 常德市电业局互联网科技部 南山科技园互联网公司有哪些 宁夏众和广鑫互联网科技有限公司 成都铂石互联网科技做什么的 互联网科技公司有风险吗 中国科技创新与世界互联网大会 广东工业互联网大赛深圳学泰科技 科技互联网行业投资研究 易租星互联网科技有限公司 杭州科技互联网公司有哪些 河南商务圈互联网科技有限公司 恒生互联网科技趋势 武汉亿视互联网科技有限公司 瑰夏咖啡 互联网与科技 广州紫鲸互联网科技有限公司 中关村互联网科技集团 科技和互联网公司 互联网科技集团 卓越科技(互联网 ) 上海万想互联网科技 厦门江牛科技互联网 国产互联网科技公司
0