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技术站