import java.io.IOException; import java.nio.ByteBuffer; /**************************************************************************** * com.lin.channel FileChannelDemo.java Created on 2013-10-25 * * @Author: linfenliang * @Description: * @Version: 1.0 ***************************************************************************/ public class ByteBufferDemo { /** * @param args * void * @date 2013-10-25 * @version V1.0.0 * @author linfenliang * @throws IOException */ public static void main(String[] args) throws IOException { ByteBuffer buffer = ByteBuffer.allocate(16); System.out.println("ByteBuffer :"); System.out.println("capacity:" + buffer.capacity()); buffer.put(new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }); System.out .println("put byte[]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} into buffer."); System.out.println("limit:" + buffer.limit()); System.out.println("position:" + buffer.position()); buffer.flip();// 数据由写转为读取 System.out.println("ByteBuffer 执行flip,转为读取"); byte[] dst = new byte[10]; buffer.get(dst, 0, dst.length); System.out.println(String.format( "byte[]:%s,%s,%s,%s,%s,%s,%s,%s,%s,%s", dst[0], dst[1], dst[2], dst[3], dst[4], dst[5], dst[6], dst[7], dst[8], dst[9])); System.out.println("读取完10个字节的数据后:"); System.out.println("limit:" + buffer.limit()); System.out.println("position:" + buffer.position()); buffer.rewind(); System.out.println("执行rewind,重新读取数据"); System.out.println("limit:" + buffer.limit()); System.out.println("position:" + buffer.position()); byte[] dt = new byte[10]; buffer.get(dt, 0, dst.length); System.out.println(String.format( "byte[]:%s,%s,%s,%s,%s,%s,%s,%s,%s,%s", dt[0], dt[1], dt[2], dt[3], dt[4], dt[5], dt[6], dt[7], dt[8], dt[9])); System.out.println("读取完10个字节的数据后:"); System.out.println("limit:" + buffer.limit()); System.out.println("position:" + buffer.position()); System.out.println("在当前位置做标记mark"); buffer.mark(); buffer.get(); buffer.get(); buffer.get(); System.out.println("读取3个字节后position:" + buffer.position()); // buffer.rewind(); buffer.reset(); System.out.println("执行reset后position的位置:" + buffer.position()); // buffer.clear(); // System.out.println(buffer.get(3)); buffer.compact(); System.out.println("取出10个字节后,执行完compact后ByteBuffer第一个字节:"+buffer.get(0)); } // capacicty:作为一个内存块,Buffer有一个固定的大小值,也叫“capacity”. // 你只能往里写capacity个byte、long,char等类型。一旦Buffer满了,需要将其清空(通过读数据或者清除数据)才能继续写数据往里写数据。 // position // 当你写数据到Buffer中时,position表示当前的位置。初始的position值为0.当一个byte、long等数据写到Buffer后, // position会向前移动到下一个可插入数据的Buffer单元。position最大可为capacity – 1. // 当读取数据时,也是从某个特定位置读。当将Buffer从写模式切换到读模式,position会被重置为0. // 当从Buffer的position处读取数据时,position向前移动到下一个可读的位置。 // limit // 在写模式下,Buffer的limit表示你最多能往Buffer里写多少数据。 写模式下,limit等于Buffer的capacity。 // 当切换Buffer到读模式时, // limit表示你最多能读到多少数据。因此,当切换Buffer到读模式时,limit会被设置成写模式下的position值。 // 换句话说,你能读到之前写入的所有数据(limit被设置成已写数据的数量,这个值在写模式下就是position) // flip // flip方法将Buffer从写模式切换到读模式。调用flip()方法会将position设回0,并将limit设置成之前position的值。 // 换句话说,position现在用于标记读的位置,limit表示之前写进了多少个byte、char等 —— 现在能读取多少个byte、char等。 // rewind // 将position设回0,所以你可以重读Buffer中的所有数据。limit保持不变,仍然表示能从Buffer中读取多少个元素(byte、char等)。 // 一旦读完Buffer中的数据,需要让Buffer准备好再次被写入。可以通过clear()或compact()方法来完成。 // clear // 如果调用的是clear()方法,position将被设回0,limit被设置成 capacity的值。换句话说,Buffer // 被清空了。Buffer中的数据并未清除,只是这些标记告诉我们可以从哪里开始往Buffer里写数据。 // 如果Buffer中有一些未读的数据,调用clear()方法,数据将“被遗忘”,意味着不再有任何标记会告诉你哪些数据被读过,哪些还没有。 // compact // 如果Buffer中仍有未读的数据,且后续还需要这些数据,但是此时想要先先写些数据,那么使用compact()方法。 // compact()方法将所有未读的数据拷贝到Buffer起始处。然后将position设到最后一个未读元素正后面。limit属性依然像clear()方法一样,设置成capacity。现在Buffer准备好写数据了,但是不会覆盖未读的数据。 }
近期热议
推荐标签 标签
-
Lute
25 引用 • 191 回帖 • 19 关注
Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。
-
百度
63 引用 • 785 回帖 • 252 关注
百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。
-
SpaceVim
3 引用 • 31 回帖 • 68 关注
SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
即用的 Vim-IDE。 -
GitBook
3 引用 • 8 回帖 • 1 关注
GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。
-
笔记
303 引用 • 777 回帖
好记性不如烂笔头。
-
JVM
180 引用 • 120 回帖
JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。
-
jsDelivr
5 引用 • 31 回帖 • 42 关注
jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。
-
又拍云
21 引用 • 37 回帖 • 512 关注
又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。
-
Kubernetes
108 引用 • 54 回帖 • 1 关注
Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。
-
PWA
14 引用 • 69 回帖 • 132 关注
PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。
-
Electron
15 引用 • 136 回帖 • 8 关注
Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。
-
Ruby
7 引用 • 31 回帖 • 176 关注
Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。
-
V2Ray
1 引用 • 15 回帖
-
IBM
16 引用 • 53 回帖 • 118 关注
IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。
-
安全
189 引用 • 813 回帖 • 3 关注
安全永远都不是一个小问题。
-
大疆创新
2 引用 • 14 回帖
深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。
-
禅道
5 引用 • 15 回帖 • 223 关注
禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。
-
abitmean
• 21 关注
有点意思就行了
-
Spring
940 引用 • 1458 回帖 • 160 关注
Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。
-
uTools
5 引用 • 13 回帖
uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。
-
旅游
85 引用 • 895 回帖
希望你我能在旅途中找到人生的下一站。
-
Wide
30 引用 • 218 回帖 • 605 关注
Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。
欢迎访问我们运维的实例: https://wide.b3log.org
- IPFS
-
Vue.js
261 引用 • 662 回帖
Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。
-
程序员
531 引用 • 3528 回帖
程序员是从事程序开发、程序维护的专业人员。
-
Java
3167 引用 • 8207 回帖 • 2 关注
Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。
-
Webswing
1 引用 • 15 回帖 • 633 关注
Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用 。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于