ByteBuffer转String与解析为json对应的对象

事情是这样的,今天需要对Feign的响应进行处理,Feign在异常时返回的Body为字节缓冲,需要自己处理。

ByteBuffer是个啥

原文 https://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html

字节缓冲区可以是直接的,也可以是非直接的给定一个直接字节缓冲区,Java 虚拟机将尽最大努力直接在其上执行本机 I/O 操作。也就是说,在每次调用底层操作系统的本机 I/O 操作之前(或之后) ,它都会试图避免将缓冲区的内容复制到(或从)中间缓冲区。
可以通过调用这个类的 allocateDirect 工厂方法来创建直接字节缓冲区。通过此方法返回的缓冲区通常比非直接缓冲区具有更高的分配和释放成本。直接缓冲区的内容可能驻留在正常的垃圾收集堆之外,因此它们对应用程序的内存占用的影响可能不明显。因此,建议将直接缓冲区主要分配给受基础系统本机 I/O 操作影响的大型长寿命缓冲区。一般来说,只有当直接缓冲区产生可测量的程序性能增益时,才最好分配直接缓冲区
还可以通过将文件的区域直接映射到内存中来创建直接字节缓冲区。Java 平台的一个实现可以有选择地支持通过 JNI 从本机代码直接创建字节缓冲区。如果其中一种缓冲区的实例指的是内存中不可访问的区域,那么访问该区域的尝试将不会改变缓冲区的内容,并将导致在访问时或稍后某个时间抛出未指定的异常。
字节缓冲区是直接的还是非直接的,可以通过调用其 isDirect 方法来确定。提供此方法是为了使显式缓冲区管理可以在性能关键代码中完成。

说白了就是JVM给你的一个工具类,跟机器底层的缓冲区有关系,因为比较底层,所以也是以字节为单位

ByteBuffer转化为字符串

同样位于java.nio包下面还有一个兄弟是Charset,他给了一个方法来构造字符串

Charset charset = Charset.forName("utf-8");
String json = charset.decode(byteBuffer).toString();

转化为json后解析为对象

本来的构想是:将字节转化为字符串,然后用Jackson(Spring自带)解析为对象

			Charset charset = Charset.forName("utf-8");
            ByteBuffer byteBuffer = e.responseBody().get();
            String json = charset.decode(byteBuffer).toString();
            ObjectMapper objectMapper = new ObjectMapper();
            ObjectReader reader = objectMapper.readerFor(BaseVo.class);
            try {
    
    
                reader.readValue(byteBuffer.array());
            } catch (IOException ioException) {
    
    
                ioException.printStackTrace();
            }

但是用的时候才发现,好家伙ObjectReader提供了一个从字节数组读数据的方法
我们直接用就完事了

			ByteBuffer byteBuffer = e.responseBody().get();
            ObjectMapper objectMapper = new ObjectMapper();
            ObjectReader reader = objectMapper.readerFor(BaseVo.class);
            try {
    
    
                reader.readValue(byteBuffer.array());
            } catch (IOException ioException) {
    
    
                ioException.printStackTrace();
            }

猜你喜欢

转载自blog.csdn.net/weixin_44494373/article/details/109921106
今日推荐