首页 > 编程语言 >Java ByteBuffer 使用实例

Java ByteBuffer 使用实例

时间:2023-04-28 12:33:26浏览次数:44  
标签:java nio Charset 实例 ByteBuffer import Java

package foo;  
  
import java.io.IOException;  
import java.nio.ByteBuffer;  
import java.nio.CharBuffer;  
import java.nio.charset.Charset;  
  
/**
ByteBuffer  并且这三个指针的关系是 position<=limit<=capacity.
 position是当前读写的位置。
 limit是最大能读写的位置。
 capacity是缓存的容量。
 */  
public class App {  
  
public static void main(String[] args) throws IOException {  
          
        test001();  
        test002();  
        test003();  
          
if (true) {  
return;  
        }  
  
// 创建一个capacity为256的ByteBuffer  
256);  
while (true) {  
// System.out.println("input:");  
// 从标准输入流读入一个字符  
int c = System.in.read();  
// 当读到输入流结束时,退出循环  
if (c == -1)  
break;  
// 把读入的字符写入ByteBuffer中  
byte) c);  
// 当读完一行时,输出收集的字符  
if (c == '\n') {  
// 调用flip()使limit变为当前的position的值,position变为0,  
// 为接下来从ByteBuffer读取做准备  
                buf.flip();  
// 构建一个byte数组  
byte[] content = new byte[buf.limit()];  
// 从ByteBuffer中读取数据到byte数组中  
                buf.get(content);  
                  
// 把byte数组的内容写到标准输出  
new String(content));  
  
// 调用clear()使position变为0,limit变为capacity的值,  
// 为接下来写入数据到ByteBuffer中做准备  
                buf.clear();  
            }  
        }  
    }  
  
private static void test003() {  
16);  
"ByteBuffer :");  
"capacity:" + buffer.capacity());  
new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,  
14, 15 });  
"put byte[]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} into buffer.");  
"limit:" + buffer.limit());  
"position:" + buffer.position());  
// 数据由写转为读取  
"ByteBuffer 执行flip,转为读取");  
byte[] dst = new byte[10];  
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],  
3], dst[4], dst[5], dst[6], dst[7], dst[8], dst[9]));  
"读取完10个字节的数据后:");  
"limit:" + buffer.limit());  
"position:" + buffer.position());  
        buffer.rewind();  
"执行rewind,重新读取数据");  
"limit:" + buffer.limit());  
"position:" + buffer.position());  
byte[] dt = new byte[10];  
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],  
3], dt[4], dt[5], dt[6], dt[7], dt[8], dt[9]));  
"读取完10个字节的数据后:");  
"limit:" + buffer.limit());  
"position:" + buffer.position());  
"在当前位置做标记mark");  
        buffer.mark();  
        buffer.get();  
        buffer.get();  
        buffer.get();  
"读取3个字节后position:" + buffer.position());  
// buffer.rewind();  
        buffer.reset();  
"执行reset后position的位置:" + buffer.position());  
// buffer.clear();  
// System.out.println(buffer.get(3));  
        buffer.compact();  
"取出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准备好写数据了,但是不会覆盖未读的数据。  
      
  
  
private static void test002() {  
          
5);          
"初始化:"+buffer.position());    
"初始化:"+buffer.limit());    
"初始化:"+buffer.capacity());    
            
        System.out.println();    
byte)1);    
            
"放入1个字节:"+buffer.position());    
"放入1个字节:"+buffer.limit());    
"放入1个字节:"+buffer.capacity());    
            
        System.out.println();    
        buffer.flip();    
            
"flip之后:"+buffer.position());    
"flip之后:"+buffer.limit());    
"flip之后:"+buffer.capacity());    
            
        System.out.println();    
        buffer.get();    
            
"拿出一个字节:"+buffer.position());    
"拿出一个字节:"+buffer.limit());    
"拿出一个字节:"+buffer.capacity());    
  
    }  
  
private static void test001() {  
"helloWorld";    
        ByteBuffer buff  = ByteBuffer.wrap(str.getBytes());    
"position:"+buff.position()+"\t limit:"+buff.limit());    
//读取两个字节    
        buff.get();    
        buff.get();    
"position:"+ (char)buff.get(buff.position())+"\t limit:"+buff.limit());    
        buff.mark();    
"position:"+buff.position()+"\t limit:"+buff.limit());    
        buff.flip();    
"position:"+buff.position()+"\t limit:"+buff.limit());  
          
    }  
  
public static byte[] getBytes (char[] chars) {//将字符转为字节(编码)  
"UTF-8");  
           CharBuffer cb = CharBuffer.allocate (chars.length);  
      
           cb.put (chars);  
           cb.flip ();  
           ByteBuffer bb = cs.encode (cb);  
return bb.array();  
    }  
  
public static char[] getChars(byte[] bytes) {// 将字节转为字符(解码)  
"UTF-8");  
        ByteBuffer bb = ByteBuffer.allocate(bytes.length);  
        bb.put(bytes);  
        bb.flip();  
        CharBuffer cb = cs.decode(bb);  
return cb.array();  
    }  
  
}

标签:java,nio,Charset,实例,ByteBuffer,import,Java
From: https://blog.51cto.com/u_16091571/6233828

相关文章

  • 轻松看懂Java字节码
     计算机只认识0和1。这意味着任何语言编写的程序最终都需要经过编译器编译成机器码才能被计算机执行。所以,我们所编写的程序在不同的平台上运行前都要经过重新编译才能被执行。而Java刚诞生的时候曾经提过一个非常著名的宣传口号: "一次编写,到处运行" 。WriteOnce,RunAnyw......
  • java jar 没有主清单属性_Spring Boot jar中没有主清单属性的解决方法「建议收藏」
    javajar没有主清单属性_SpringBootjar中没有主清单属性的解决方法「建议收藏」原文链接:https://cloud.tencent.com/developer/article/2133065大家好,又见面了,我是你们的朋友全栈君。使用SpringBoot微服务搭建框架,在eclipse和Idea下能正常运行,但是在打成jar包部署或者直接......
  • java 语言与 C语言端 AES (ECB)
    注:java为no-padding注释掉了padding部分(byte数组初始化时为0x00)c为padding0x00(byte数组初始化时为0x00)代码出自网上代码地址githubhttps://github.com/mountwater/AES-128-ECB-java_and_cJAVA代码//CopyrightPopaTiberiu2011//f......
  • Web开发神器,最智能的Javascript IDE——WebStorm
    我的开发很大一部分是和Javascript打交道,很久以来,我一直在Spket、Aptana、VisualStudio、IntelliJIDEA、notepad++、vim等选择中徘徊,因为发现他们都很好,但都缺少我想要的……直到我开始使用WebStorm。 什么是我对JavascriptIDE选择的标准?1、快速智能的代码提示(全项目的)和补全2......
  • Java数据类型
    1.数据类型注意:String是一个类,属于引用类型2.自动类型转换精度小的类型自动转换为精度大的数据类型......
  • 本地java监控远程Linux服务器-jconsole
    一、配置远程服务器需要监控的服务项目(本文以ps为例)需要监控的ps项目,此项目启动文件为ps.sh,编辑sh文件,找到JAVA_OPTS项,在后面添加JAVA_OPTS="-XX:+UseParallelGC-XX:+UseParallelOldGC$JVM_FLAGS$GC_LOG-Dfile.encoding=UTF-8-DLog4jContextSelector=org.apache.logging.......
  • jar包启动基础命令 java -jar common.jar cmd 命令行执行jar包
    jar包启动基础命令命令行执行jar包java-jarcommon.jar原文链接:https://blog.csdn.net/weixin_40483369/article/details/124392170一般情况下运行jar包,当前是可运行的jar包,直接命令java-jarcommon.jar1按下ctrl+C,关闭当前ssh或者直接关闭窗口,当前程序都会退出。......
  • java serice wrapper mac M2 入门
    先下载javasericewrapperhttps://download.tanukisoftware.com/wrapper/3.5.53/wrapper-macosx-universal-64-3.5.53.tar.gz解压设置arch-x86_64zshuname-mcdwrapper-macosx-universal-64-3.5.53/bin测试用例bin/testwrapperconsole新建项目packageo......
  • java定义枚举并赋值_java中枚举的特性是什么?如何赋值?
    java定义枚举并赋值_java中枚举的特性是什么?如何赋值?原文链接:https://blog.csdn.net/weixin_32821643/article/details/114441841上次已经为大家介绍过java枚举的概念是什么的主要内容了。今天再来为大家介绍一些相关的知识,也是关于java枚举的一些内容,也就是它的特性以及如何......
  • JAVA学习笔记随记2(面向对象中级)
    现在开始学习一些java面向对象中不太容易的东西了,加油吧!(0^_^0)首当其冲的便是包的感念和使用。包包的出现其实是为了更好的管理类,其本质就是一些文件夹和目录,同名的类不能同时出现,但如果两个同名的类在不同的包下则可以共存。相当于给每个类分配了一个地址,虽然类名是一样的,......