JavaNIO之缓冲区(Buffers)
2017-06-28 15:20
176 查看
下面的例子来自于《Java I/O,NIO and NIO2》,阅读本书Buffers之后所作的代码笔记。
Capacity: 7
Limit: 7
Position: 0
Remaining: 7
Changing buffer limit to 5
Limit: 5
Position: 0
Remaining: 5
Changing buffer position to 3
Position: 3
Remaining: 2
java.nio.HeapByteBuffer[pos=3 lim=5 cap=7]
buffer1 array: [B@484b61fc
Buffer1 array offset: 0
Capacity: 10
Limit: 10
Position: 0
Remaining: 10
buffer2 array: [B@45fe3ee3
Buffer2 array offset: 0
Capacity: 200
Limit: 60
Position: 10
Remaining: 50
Capacity = 7
Limit = 7
Position = 0
Remaining = 7
Capacity = 7
Limit = 7
Position = 3
Remaining = 4
10
20
30
Roses are red
Violets are blue
Sugar is sweet
And so are you.
40
20
30
40
例1:Buffer的几个重要属性及修改
package chapter06; import java.nio.Buffer; import java.nio.ByteBuffer; /** * Buffer的几个重要属性及修改 */ public class BufferDemo01 { public static void main(String[] args) { //分配容量为7的字节缓冲区 Buffer buffer = ByteBuffer.allocate(7); System.out.println("Capacity: " + buffer.capacity()); System.out.println("Limit: " + buffer.limit()); System.out.println("Position: " + buffer.position()); System.out.println("Remaining: " + buffer.remaining()); System.out.println("Changing buffer limit to 5"); //修改属性limit buffer.limit(5); System.out.println("Limit: " + buffer.limit()); System.out.println("Position: " + buffer.position()); System.out.println("Remaining: " + buffer.remaining()); System.out.println("Changing buffer position to 3"); //修改属性position buffer.position(3); System.out.println("Position: " + buffer.position()); System.out.println("Remaining: " + buffer.remaining()); System.out.println(buffer); } }运行结果:
Capacity: 7
Limit: 7
Position: 0
Remaining: 7
Changing buffer limit to 5
Limit: 5
Position: 0
Remaining: 5
Changing buffer position to 3
Position: 3
Remaining: 2
java.nio.HeapByteBuffer[pos=3 lim=5 cap=7]
例2:通过分配空间和包装的方式创建字节缓冲区
package chapter06; import java.nio.ByteBuffer; /** * 通过分配空间和包装的方式创建字节缓冲区 */ public class BufferDemo02 { public static void main(String[] args) { //分配空间的方式 ByteBuffer buffer1 = ByteBuffer.allocate(10); if (buffer1.hasArray()) { System.out.println("buffer1 array: " + buffer1.array()); System.out.println("Buffer1 array offset: " + buffer1.arrayOffset()); System.out.println("Capacity: " + buffer1.capacity()); System.out.println("Limit: " + buffer1.limit()); System.out.println("Position: " + buffer1.position()); System.out.println("Remaining: " + buffer1.remaining()); System.out.println(); } //通过包装的方式创建字节缓冲区 byte[] bytes = new byte[200]; ByteBuffer buffer2 = ByteBuffer.wrap(bytes); buffer2 = ByteBuffer.wrap(bytes, 10, 50); if (buffer2.hasArray()) { System.out.println("buffer2 array: " + buffer2.array()); System.out.println("Buffer2 array offset: " + buffer2.arrayOffset()); System.out.println("Capacity: " + buffer2.capacity()); System.out.println("Limit: " + buffer2.limit()); System.out.println("Position: " + buffer2.position()); System.out.println("Remaining: " + buffer2.remaining()); } } }运行结果:
buffer1 array: [B@484b61fc
Buffer1 array offset: 0
Capacity: 10
Limit: 10
Position: 0
Remaining: 10
buffer2 array: [B@45fe3ee3
Buffer2 array offset: 0
Capacity: 200
Limit: 60
Position: 10
Remaining: 50
例3:读写字节缓冲区
package chapter06; import java.nio.ByteBuffer; /** * 读写字节缓冲区 */ public class BufferDemo03 { public static void main(String[] args) { ByteBuffer buffer = ByteBuffer.allocate(7); //初始时打印四个属性 System.out.println("Capacity = " + buffer.capacity()); System.out.println("Limit = " + buffer.limit()); System.out.println("Position = " + buffer.position()); System.out.println("Remaining = " + buffer.remaining()); //向字节缓冲区中添加数据 buffer.put((byte) 10).put((byte) 20).put((byte) 30); //添加内容后再打印这四个属性 System.out.println("Capacity = " + buffer.capacity()); System.out.println("Limit = " + buffer.limit()); System.out.println("Position = " + buffer.position()); System.out.println("Remaining = " + buffer.remaining()); for (int i = 0; i < buffer.position(); i++) System.out.println(buffer.get(i)); } }运行结果:
Capacity = 7
Limit = 7
Position = 0
Remaining = 7
Capacity = 7
Limit = 7
Position = 3
Remaining = 4
10
20
30
例4:读写字符缓冲区
package chapter06; import java.nio.CharBuffer; /** * 读写字符缓冲区 */ public class BufferDemo04 { public static void main(String[] args) { String[] poem = { "Roses are red", "Violets are blue", "Sugar is sweet", "And so are you." }; //字符缓冲区 CharBuffer buffer = CharBuffer.allocate(50); for (int i = 0; i < poem.length; i++) { //填充缓冲区 for (int j = 0; j < poem[i].length(); j++) buffer.put(poem[i].charAt(j)); //执行翻转操作,从读变为写状态 buffer.flip(); //冲缓冲区中读取数据 while (buffer.hasRemaining()) System.out.print(buffer.get()); //清空缓冲区,方便下次填充 buffer.clear(); System.out.println(); } } }运行结果:
Roses are red
Violets are blue
Sugar is sweet
And so are you.
例5:标记当前缓冲区的位置,然后重置当前位置到标记的位置
package chapter06; import java.nio.ByteBuffer; /** * 标记当前缓冲区的位置,然后重置当前位置到标记的位置 */ public class BufferDemo05 { public static void main(String[] args) { ByteBuffer buffer = ByteBuffer.allocate(7); //填充缓冲区 buffer.put((byte) 10).put((byte) 20).put((byte) 30).put((byte) 40); //设置limit属性 buffer.limit(4); //将position为1的地方做标记 buffer.position(1).mark().position(3); //这里从position为3的地方取数据 System.out.println(buffer.get()); System.out.println(); //重置,把当前position的值设置回1 buffer.reset(); //从position为1的位置重新开始读数据 while (buffer.hasRemaining()) System.out.println(buffer.get()); } }运行结果:
40
20
30
40
相关文章推荐
- java.nio.ByteBuffer 类 缓冲区
- java.nio.Buffer缓冲区基础
- java.nio.ByteBuffer 类 缓冲区
- java的nio的缓冲区
- Java IO:面向缓冲区、同步、非阻塞式IO(NIO)
- [转]java.nio.ByteBuffer 类 缓冲区
- java NIO之缓冲区学习笔记
- java.nio.ByteBuffer 类 缓冲区
- Java NIO笔记(三):NIO Buffer(缓冲区)之进阶
- 【转】java.nio.ByteBuffer 类 缓冲区
- java NIO入门简介 Buffer(缓冲区)与Channel(通道)的相关知识
- java.nio.ByteBuffer 类 缓冲区
- java.nio.ByteBuffer 类 缓冲区
- java.nio.ByteBuffer 类 缓冲区
- java.nio.ByteBuffer 类 缓冲区
- Java nio 学习笔记(一) Buffer(缓冲区)与Channel(通道)的相关知识
- java.nio.ByteBuffer 缓冲区操作
- java.nio.ByteBuffer 类 缓冲区
- java NIO(三) 缓冲区
- Java NIO —— Buffer(缓冲区)