JAVA对象和字节数组互转操作

Java对象和字节数组互转操作是Java编程中常见的技巧之一。在某些情况下,我们需要把Java对象序列化成字节数组,再把字节数组反序列化为Java对象,这样可以在网络传输、文件存储等场景中实现数据的传输和存储。本文以Java 8为例,讲解Java对象和字节数组互转的完整攻略。

1. Java对象转字节数组

Java对象转字节数组需要使用到Java的序列化机制,即将Java对象转化为字节序列的过程。Java标准库中提供了java.io.Serializable接口,实现该接口的类对象可以被序列化。具体操作如下:

import java.io.*;

public class ObjectToByteArray {
    public static byte[] toBytes(Object object) throws IOException {
        ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
        ObjectOutputStream objectStream = new ObjectOutputStream(byteStream);
        objectStream.writeObject(object);
        objectStream.flush();
        return byteStream.toByteArray();
    }
}

在上面的代码中,我们通过字节数组输出流ByteArrayOutputStream将对象序列化为字节数组,具体步骤如下:

  • 创建一个ByteArrayOutputStream对象byteStream,这个对象将Java对象序列化成字节数组。
  • 创建一个ObjectOutputStream对象objectStream,这个对象将Java对象写入byteStream。
  • 调用writeObject()方法将Java对象写入byteStream中。
  • 调用flush()方法刷新objectStream,将Java对象的字节数组刷新到byteStream中。
  • 调用toByteArray()方法,将byteStream中的字节数组返回。

2. 字节数组转Java对象

Java中的字节数组转对象需要用到反序列化机制,即将字节序列转换为Java对象的过程。我们可以使用Java标准库中的ObjectInputStream类来实现反序列化,具体操作如下:

import java.io.*;
public class ByteArrayToObject {
    public static Object toObject(byte[] bytes) throws IOException, ClassNotFoundException {
        ByteArrayInputStream byteStream = new ByteArrayInputStream(bytes);
        ObjectInputStream objectStream = new ObjectInputStream(byteStream);
        Object object = objectStream.readObject();
        objectStream.close();
        return object;
    }
}

在上面的代码中,我们使用byte[]数组作为参数,并通过ByteArrayInputStream将其转换为InputStream,通过ObjectInputStream将其反序列化成Java对象。具体步骤如下:

  • 创建一个ByteArrayInputStream对象byteStream,这个对象将字节流转为Java对象。
  • 创建一个ObjectInputStream对象objectStream,这个对象将byteStream中的字节流反序列化成Java对象。
  • 调用readObject()方法从对象输入流中读取Java对象,并返回。
  • 调用close()方法关闭objectStream,释放资源。

3. 示例说明

为了说明Java对象和字节数组互转的用法,我们可以以Java中的基本类型为例来进行演示。先看到一个示例:

public class SerializationDemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        int intObj = 123456;
        byte[] bytes = ObjectToByteArray.toBytes(intObj);
        int intObjAfterDeserialization = (int) ByteArrayToObject.toObject(bytes);
        System.out.println("intObj = " + intObj);
        System.out.println("intObjAfterDeserialization = " + intObjAfterDeserialization);
    }
}

在上面的代码中,我们定义了一个int类型变量intObj,并将它序列化为字节数组。在反序列化的时候,我们将字节数组使用ByteArrayToObject.toObject()方法反序列化为Java对象,并将其赋值给int类型变量intObjAfterDeserialization。最后,我们打印了intObj和intObjAfterDeserialization的值。

输出结果如下:

intObj = 123456 
intObjAfterDeserialization = 123456 

从上面的结果可以看出,我们成功地将Java对象序列化成字节数组并反序列化回来,得到了相同的值。此外,我们还可以以字符串为例进行演示。

public class SerializationDemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        String strObj = "Hello, world!";
        byte[] bytes = ObjectToByteArray.toBytes(strObj);
        String strObjAfterDeserialization = (String) ByteArrayToObject.toObject(bytes);
        System.out.println("strObj = " + strObj);
        System.out.println("strObjAfterDeserialization = " + strObjAfterDeserialization);
    }
}

在上面的代码中,我们定义了一个String类型变量strObj,并将它序列化为字节数组。在反序列化的时候,我们将字节数组使用ByteArrayToObject.toObject()方法反序列化为Java对象,并将其赋值给String类型变量strObjAfterDeserialization。最后,我们打印了strObj和strObjAfterDeserialization的值。

输出结果如下:

strObj = Hello, world!
strObjAfterDeserialization = Hello, world!

从上面的结果可以看出,我们也成功地将Java对象序列化成字节数组并反序列化回来,得到了相同的字符串值。

综上所述,Java对象和字节数组互转是Java编程中常用的技巧之一,实现方法简单易懂,可以用于数据的序列化和反序列化,是Java编程中的常见操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA对象和字节数组互转操作 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 常见的Java字节码操纵库有哪些?

    常见的Java字节码操纵库 Java字节码操纵库是指一些工具类库,用于在运行时动态修改Java字节码。常见的Java字节码操纵库有以下几种: ASM:是一个直接以Java字节码的形式生成、修改类的框架。它提供了一些比较底层的API,可以让开发者精细地控制字节码的生成和修改过程。 Javassist:是一个基于字节码操作的程序库,可以在运行时对字节码进行修改、…

    Java 2023年5月11日
    00
  • Java时间工具类Date的常用处理方法

    下面是“Java时间工具类Date的常用处理方法”完整攻略: 一、Date类的创建方法 Date类的实例可以用以下两种方法创建: 1. 使用无参构造函数创建 Date date = new Date(); System.out.println(date); //2022-03-16 14:11:52 2. 使用long类型的构造函数创建,参数为从1970年1…

    Java 2023年5月20日
    00
  • Java中HashMap与String字符串互转的问题解决

    Java中HashMap与String字符串互转的问题解决 在Java开发中,我们经常会使用到HashMap来做键值对的操作。有时候我们需要把HashMap转换成字符串,或者把字符串转换成HashMap。那么,如何进行这样的操作呢?下面是两种方式来解决问题。 使用Java中自带的方法进行转换 Java中提供了很多可以直接转换的方法,我们可以使用这些方法来进行…

    Java 2023年5月27日
    00
  • 一文搞懂Java正则表达式的使用

    一文搞懂Java正则表达式的使用 什么是正则表达式 正则表达式是一种专门用于匹配字符串的工具,它由一些字符和符号构成,这些字符和符号用于描述字符串中某些部分的模式。Java中的正则表达式使用java.util.regex包进行支持,它提供了许多方法和类用于操作正则表达式。 正则表达式基本语法 字符 在正则表达式中,每个普通字符(除了特殊字符)都表示对应的一个…

    Java 2023年5月26日
    00
  • tomcat性能优化(性能总览)

    Tomcat性能优化(性能总览) 为了提高Tomcat的性能,可以考虑以下几个方面的优化: 1. 确定性能瓶颈 我们需要确定Tomcat的性能瓶颈。可以使用JProfiler等工具来对Tomcat进行性能分析和优化。通过分析Tomcat的CPU利用率、内存使用情况、I/O和网络延迟情况等指标,可以帮助我们定位性能瓶颈。 2. Tomcat服务器配置优化 2.…

    Java 2023年5月19日
    00
  • SpringMVC文件上传中要解决的问题大汇总

    针对“SpringMVC文件上传中要解决的问题大汇总”的完整攻略,我将从以下几个方面一一介绍: 文件上传的大致流程及相关注意点; 文件上传时可能出现的问题; 解决问题的具体方式及示例。 1. 文件上传的大致流程及相关注意点 一般来说,SpringMVC文件上传的大致流程是这样的: 客户端通过表单提交文件的请求到后台; 后台获取到上传请求后,将文件进行存储。 …

    Java 2023年5月20日
    00
  • JVM的垃圾回收算法工作原理详解

    JVM的垃圾回收算法工作原理详解 什么是垃圾回收? 垃圾回收是指自动管理程序中动态分配的内存的过程。在垃圾回收的过程中,垃圾收集器会扫描程序中的内存,查找出无用的对象,然后将它们的内存空间释放掉。这样就可以避免内存泄漏和程序崩溃。 垃圾回收算法 垃圾回收算法的目标是找出内存中无用的对象,然后回收这些对象所占用的内存空间。JVM采用的主要的垃圾回收算法有标记-…

    Java 2023年5月19日
    00
  • Java Map集合使用方法全面梳理

    Java Map集合使用方法全面梳理 什么是Java Map集合 在Java编程中,Map是一个非常有用的接口,它可以帮助我们管理具有键值对的数据集合。具体来说,一个Map对象是由一组键值对组成,其中每个键(key)都必须是唯一且不变的,而每个值(value)可以是任意对象(包括null)。Map中的键值对是没有固定的顺序的。 Java提供了多种不同的Map…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部