文档章节

ByteBuffer方法解读

 对门王大爷
发布于 2017/03/24 11:15
字数 721
阅读 9
收藏 0
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class FileCopy {
    
    public static String fff="C://Users/dell/Desktop/test.txt";
    public static void main(String[] args) throws IOException {
        int bufSize=1024;
        byte[] bs=new byte[bufSize];
        //分配一个新的字节缓冲区。
        ByteBuffer bb = ByteBuffer.allocate(1024);
        //创建一个随机访问文件的实例,第一个参数是文件路径,第二个参数是文件的访问模式,r表示只读;getChannel方法表示获得一个与此文件
        //相关联的通道对象,而通道的作用是用于读取、写入、映射和操作文件
        FileChannel channel =new RandomAccessFile(fff, "r").getChannel();
        //read方法将字节序列从此通道读入给定的缓冲区,从此通道的当前文件位置开始读取字节,然后根据实际读取的字节数更新该文件位置,参数为
        //一个字节缓冲区,返回值为读取的字节数,可能为0,如果是读取到了文件的末尾,则返回为-1.
        while (channel.read(bb) != -1) {
            //ByteBuffer可以作为一个缓冲区,是因为它是内存中的一段连续的空间,在ByteBuffer对象内部定义了四个索引,
            //分别是mark,position,limit,capacity.
            //mark对当前position的标记,position表示当前可读写的指针,如果是向ByteBuffer对象中写入一个字节,那么就会向
            //position所指向的地址写入这个字节;如果是从bytebuffer中读出一个字节,那么就会把position所指向的地址所在数据
            //读出,读写完成之后,position的位置会加1.
            //flip方法将limit的值置为position的值,而把position置为0,在byteBuffer刚刚创建的时候,limit的
            //值和容量的值是一致的,position的初始值为0,当读取了内容之后,position的位置为新读取内容的最后一个字节的位置。
            //bb.flip();
            int size = bb.position();
            bb.rewind();//这个方法将position索引置为0,mark索引置为-1
            bb.get(bs);
            // 把文件当字符串处理,直接打印做为一个例子。
            System.out.print(new String(bs, 0, size));
            bb.clear();//clear方法并没有将bytebuffer中的内容清空,它只是将postion设置为0,将limit设置为初始容量大小
            //这样再往缓存中添加元素的时候,就会用新的元素来覆盖旧的元素,这样在最后一次读取流中的数据的时候,此缓冲区中的前面一段是新的内容
            //而后面是旧的内容,以position为分界点。所以再输出缓冲区数据的时候需要当心将旧的内容再输出一次。
            //解决办法有两种:一种是本例中的所使用的,每次都得到position的位置,以此为界限输出position之前的内容;
            //第二种是使用bb.compact(),这个方法的作用是,将byteBuffer中的没有读取完的数据剪切到byteBuffer中
            //的最前面。
        }
    }
}

 

© 著作权归作者所有

粉丝 0
博文 11
码字总数 8147
作品 0
私信 提问
源码分析 RocketMQ DLedger(多副本) 之日志追加流程

上一篇我们详细分析了源码分析 RocketMQ DLedger 多副本之 Leader 选主,本文将详细分析日志复制的实现。 根据 raft 协议可知,当整个集群完成 Leader 选主后,集群中的主节点就可以接受客户...

丁威
09/16
0
0
Direct vs non-direct ByteBuffer

先解释一下两者的区别: Non-direct ByteBuffer内存是分配在堆上的,直接由Java虚拟机负责垃圾收集,你可以把它想象成一个字节数组的包装类,如下伪码所示: HeapByteBuffer extends ByteBuf...

离人
2013/11/18
96
0
mina read方法出现BufferUnderflowException异常的解决办法

现象: 先连续发几十个很小很小的包(<10 byte) 再突然发一个大小64byte的包 这时你会发现mina就会出现以下错误 经过对mina的分析,这是由对包长度不对做成的(即,我们发的包长是大于64byte的...

JavaGG
2009/02/16
7.6K
4
【原创】掌握对 ByteBuffer 的操控感

作者:星巴刻 作为 Java Nio 的一个基础部分,其提供的 java.nio.ByteBuffer 不易被正确使用简直让人无语,无人愿意为它辩白。ByteBuffer 本质只是 byte 数组的封装,但是与 byte 数组相比起...

星巴刻
2017/11/23
0
0
JDK 源码阅读 : DirectByteBuffer

原文出处:木杉的博客 在文章JDK源码阅读-ByteBuffer中,我们学习了ByteBuffer的设计。但是他是一个抽象类,真正的实现分为两类:与。是堆内ByteBuffer,使用存储数据,是对数组的封装,比较...

木杉的博客
2018/09/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL 11.3 locking

rudi
今天
5
0
Mybatis Plus sql注入器

一、继承AbstractMethod /** * @author beth * @data 2019-10-23 20:39 */public class DeleteAllMethod extends AbstractMethod { @Override public MappedStatement injectMap......

一个yuanbeth
今天
12
1
一次写shell脚本的经历记录——特殊字符惹的祸

本文首发于微信公众号“我的小碗汤”,扫码文末二维码即可关注,欢迎一起交流! redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要...

码农实战
今天
4
0
为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接?

之前在阅读《阿里巴巴Java开发手册》时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下: 那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符串拼接的效率...

武培轩
今天
9
0
队列-链式(c/c++实现)

队列是在线性表功能稍作修改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。作用就是通过伟大的程序员来实现算法解决现实生活...

白客C
今天
81
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部