java缓冲器的作用_java IO缓冲器

java IO缓冲器

a4c26d1e5885305701be709a3d33442f.png

(2012-04-22 12:41:21)

标签:

杂谈

分类:

IT

1、用缓冲器操纵数据

这个图解阐明了 nio 类之间的关系,便于我们理解怎么移动和转换数据。例如,如果我们想

把一个字节数组写到文件中去,那么我们就应该使用ByteBuffer.wrap( )方法把字节数组

包装起来,然后用getChannel( )方法在FileOutputStream 上打开一个通道,接着将来

自于ByteBuffer 的数据写到FileChannel 中。

blog_6ca78f3601012he8.html

注意:ByteBuffer 是将数据移进移出通道的唯一方式,并且我们只能创建一个独立的基本

类型缓冲器,或者使用“as”方法从ByteBuffer 中获得。也就是说,我们不能把基本类型的

缓冲器转换成ByteBuffer。然而,由于我们可以经由视图缓冲器将基本类型数据移进移出

ByteBuffer,所以这也就不是什么真正意义上的限制了。

2、缓冲器的细节

缓冲器由数据和可以高效地访问及操纵这些数据的四个索引组成,这四个索引是:mark,

position,limit 和capacity。下面是用于设置和复位索引以及查询数据的方法。

capacity( ) 返回缓冲区容量

clear( ) 清空缓冲区,将position 设置为0,limit 设置为容量。

我们可以调用此方法覆写缓冲区。

flip( ) 将 limit 设置为position , position 设置为 0。此方

法用于准备从缓冲区读取已经写入的数据。

limit( ) 返回 limit 值

limit(int lim) 设置 limit 值.

mark( ) 将 mark 设置为position.

position( ) 返回 position 值.

position(int pos) 设置 position 值。

remaining( ) 返回 (limit - position).

hasRemaining( ) 若有介于 position 和 limit.之间的元素,则返回

trueReturns true。

下面的示例用到一个很简单的算法(交换相邻字符)对CharBuffer 中的字符进行编码和译

码。

//: c12:UsingBuffers.java

import java.nio.*;

import com.bruceeckel.simpletest.*;

public class UsingBuffers {

private static Test monitor = new Test();

private static void symmetricScramble(CharBuffer buffer){

while(buffer.hasRemaining()) {

buffer.mark();

char c1 = buffer.get();

char c2 = buffer.get();

buffer.reset();

buffer.put(c2).put(c1);

}

}

public static void main(String[] args) {

char[] data = "UsingBuffers".toCharArray();

ByteBuffer bb = ByteBuffer.allocate(data.length * 2);

CharBuffer cb = bb.asCharBuffer();

cb.put(data);

System.out.println(cb.rewind());

symmetricScramble(cb);

System.out.println(cb.rewind());

symmetricScramble(cb);

System.out.println(cb.rewind());

monitor.expect(new String[] {

"UsingBuffers",

"sUniBgfuefsr",

"UsingBuffers"

});

}

} ///:~

尽管你可以通过对某个char 数组调用wrap( )方法来直接产生一个CharBuffer,但是在

本例中取而代之的是分配一个底层的ByteBuffer,产生的CharBuffer 只是ByteBuffer

上的一个视图而已。这里要强调我们总是以操纵使用ByteBuffer 为目标这个事实,因为它

可以和通道进行交互。

下面是 Put()之后,缓冲器的样子:

blog_6ca78f3601012he8.html

position 指针指向缓冲器中的第一个元素,capacity 和limit 则指向最后一个元素。

在程序的 symmetricScramble( )方法中,迭代执行while 循环直到position 等于limit。

一旦调用缓冲器上的相对的get()或put()功能,position 指针就会随之相应改变。我

们也可以调用绝对的、包含一个参数的get()和put()方法,参数指待get()或put

()的发生位置。不过,这些方法不会改变缓冲器的position 指针。

当操纵到 while 循环时,使用 mark()调用来设置mark 的值。此时,缓冲器状态如下:

blog_6ca78f3601012he8.html

两个相对的get()调用把前两个字符保存到变量c1 和c2 中,调用完这两个方法后,缓

冲器如下:

blog_6ca78f3601012he8.html

为了实现交换,我们要在position=0 时写入c2,position=1 时写入c1。我们也可以使

用绝对输入方法来实现,或者使用reset()把position 的值设为mark 的值:

blog_6ca78f3601012he8.html

这两个 put()方法先写c2,接着写c1:

blog_6ca78f3601012he8.html

在下一次循环迭代期间,将 mark 设置成position 的当前值:

blog_6ca78f3601012he8.html

这个过程将会持续到遍历完整个缓冲器。在 while 循环的最后,position 指向缓冲器的末

尾。所以如果想要打印缓冲器,只能打印出position 和limit 之间的字符。因此,如果想

显示缓冲器的全部内容,我们必须使用rewind()把position 设置到缓冲器的开始位置。

下面是调用rewind()之后缓冲器的状态(mark 的值则变得不明确):

blog_6ca78f3601012he8.html

当再次调用symmetricScramble( )功能时,会对CharBuffer 进行同样的处理,并将其

恢复到初始状态。

分享:

a4c26d1e5885305701be709a3d33442f.png喜欢

0

a4c26d1e5885305701be709a3d33442f.png赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

评论并转载此博文

a4c26d1e5885305701be709a3d33442f.png

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java面试中,Java IO是一个常见的考点。以下是一些常见的Java IO面试题及答案: 1. 什么是Java IO流?有哪些不同类型的流? Java IO流是用于处理输入和输出的机制。Java提供了两种类型的流:字节流和字符流。字节流以字节为单位读取和写入数据,而字符流以字符为单位读取和写入数据。 2. 什么是输入流和输出流? 输入流用于从源中读取数据,而输出流用于将数据写入目标。 3. 什么是字节流和字符流? 字节流用于读取和写入字节数据,适用于处理二进制数据。字符流用于读取和写入字符数据,适用于处理文本数据。 4. 请举例说明如何使用Java IO流进行文件读写操作。 例如,可以使用FileInputStream和FileOutputStream类来读取和写入字节数据,使用FileReader和FileWriter类来读取和写入字符数据。 5. 什么是缓冲流?为什么使用缓冲流? 缓冲流是一种带有缓冲区的流,它可以提高IO性能。它通过在内存中缓冲一部分数据,减少了对底层资源的频繁访问,从而提高了效率。 6. 什么是序列化和反序列化?如何在Java中进行对象的序列化和反序列化? 序列化是将对象转换为字节流的过程,反序列化是将字节流转换为对象的过程。在Java中,可以通过实现Serializable接口来使一个类可被序列化。使用ObjectOutputStream类可以将对象序列化为字节流,使用ObjectInputStream类可以将字节流反序列化为对象。 7. 什么是文件过滤器?如何使用文件过滤器来筛选文件? 文件过滤器是用于筛选文件的工具。在Java中,可以使用File类的listFiles()方法结合文件过滤器来筛选文件。例如,可以使用FileFilter接口的实现类来过滤指定类型的文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值