Java 深拷贝(对象和IO流)

import lombok.extern.slf4j.Slf4j;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;



@Slf4j
public class InputStreamCopy {

    /**
     * 深拷贝输入流
     * 通过读取输入流的内容并将其写入新的字节输入流中,从而创建一个与原始输入流 identical 的新输入流
     * 这允许在不从原始数据源继续读取的情况下,多次读取或处理相同的数据
     *
     * @param is 要深拷贝的输入流
     * @return 一个新的 ByteArrayInputStream,其内容与原始输入流相同
     * @throws RuntimeException 如果在拷贝过程中发生错误,将抛出运行时异常
     */
    public static InputStream deepCopyInputStream(InputStream is) {
        // 创建一个字节数组输出流,用于存储从输入流读取的字节
        ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
        try {
            // 定义缓冲区大小
            int bufferSize = 1024;
            // 创建缓冲区
            byte[] buffer = new byte[bufferSize];

            // 循环读取输入流数据,直到到达流的末尾
            int len;
            while ((len = is.read(buffer)) != -1) {
                // 将读取到的数据写入字节数组输出流
                byteBuffer.write(buffer, 0, len);
            }
            // 将字节数组输出流转换为字节数组
            byte[] byteArray = byteBuffer.toByteArray();

            // 使用字节数组创建新的字节输入流
            return new ByteArrayInputStream(byteArray);
        } catch (Exception e) {
            // 记录错误日志
            log.error("deepCopyInputStream error", e);
            // 抛出运行时异常,包含错误信息和原因
            throw new RuntimeException("deepCopyInputStream error:" + e.getMessage(), e);
        }
    }

}

import java.io.*;
import java.util.List;



public class DeepCopyUtil {

    public static <T extends Serializable> T deepCopy(T obj) {
        try {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(obj);

            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bis);
            return (T) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

    public static <T extends Serializable> List<T> deepCopyList(List<T> originalList) {
        try {
            // 将 List 对象写入字节流
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
            objectOutputStream.writeObject(originalList);

            // 从字节流中读取 List 对象
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
            ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
            List<T> copiedList = (List<T>) objectInputStream.readObject();

            return copiedList;
        } catch (IOException | ClassNotFoundException e) {
            throw new RuntimeException("Deep copy failed", e);
        }
    }
}

 

 

### 回答1: Java深拷贝对象可以使用Java序列化来实现。具体实现步骤如下: 1. 将待拷贝对象序列化为字节数组; 2. 将字节数组反序列化为新的对象。 以下是一个简单的深拷贝对象工具类: ``` import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class DeepCopyUtil { public static <T> T deepCopy(T obj) throws Exception { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(obj); oos.flush(); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return (T) ois.readObject(); } } ``` 使用方法: ``` MyObject obj1 = new MyObject(); MyObject obj2 = DeepCopyUtil.deepCopy(obj1); ``` 需要注意的是,MyObject类必须实现Serializable接口才能被序列化。 ### 回答2: 深拷贝是指在复制对象时,不仅复制对象本身,还复制对象所引用的其他对象,使得原对象和拷贝对象完全独立,互不影响。在Java中,我们可以通过以下方式实现深拷贝对象的工具类: 1. 首先,确保需要复制的对象以及其引用的对象都实现了Serializable接口,这是Java提供的用于对象序列化的接口。这个接口没有任何方法,只是一个标识接口,用于告诉Java虚拟机该对象可以被序列化和反序列化。 2. 创建一个工具类,命名为DeepCopyUtils,该工具类提供静态方法用于进行深拷贝操作。 3. 在DeepCopyUtils中,创建一个方法,命名为deepCopy,该方法传入一个需要深拷贝对象作为参数,并返回一个新的拷贝对象。 4. 在deepCopy方法中,使用输入流和输出流的方式实现对象的序列化和反序列化。首先,创建一个ByteArrayOutputStream对象outputStream,用于将对象序列化为字节数组。然后,创建一个ObjectOutputStream对象objectOutputStream,将对象写入outputStream中。 5. 接着,创建一个ByteArrayInputStream对象inputStream,将之前序列化得到的字节数组作为参数传入。然后,创建一个ObjectInputStream对象objectInputStream,将inputStream传入对象输入流,用于反序列化。 6. 最后,通过objectInputStream的readObject方法,将反序列化得到的对象返回。 7. 在使用时,我们可以通过调用DeepCopyUtils.deepCopy方法,并将需要深拷贝对象作为参数传入,即可得到一个新的拷贝对象。 通过以上步骤,我们可以实现一个Java深拷贝对象的工具类,该工具类可以复制对象及其引用的其他对象,从而实现完全独立的拷贝对象。 ### 回答3: Java中的深拷贝对象工具类可以通过以下方式实现: 1. 首先,确保要拷贝的对象和它的所有引用类型成员变量都实现了`Serializable` 接口,这是因为深拷贝需要将对象序列化为字节流来进行拷贝。 2. 创建一个包含静态方法的工具类,该方法接收一个要拷贝的对象,并返回一个拷贝后的对象。 3. 在该方法内部,创建一个新的`ByteArrayOutputStream`对象和一个`ObjectOutputStream`对象。 4. 将要拷贝的对象写入到`ObjectOutputStream`中,然后将其转化为字节数组,并关闭流。 5. 创建一个`ByteArrayInputStream`对象和一个`ObjectInputStream`对象。 6. 使用`ObjectInputStream`从字节数组中读取对象,并将读取到的对象返回。 这样就完成了一个简单的深拷贝对象工具类。以下是示例代码: ```java import java.io.*; public final class DeepCopyUtils { private DeepCopyUtils() { // 私有构造函数,禁止实例化 } /** * 对象深拷贝方法 * * @param obj 要拷贝的对象 * @return 拷贝后的对象 * @throws IOException IO异常 * @throws ClassNotFoundException 类找不到异常 */ public static Object deepCopy(Object obj) throws IOException, ClassNotFoundException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(obj); oos.close(); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); Object copy = ois.readObject(); ois.close(); return copy; } } ``` 使用该工具类,你可以对任意复杂的对象进行深拷贝,而不需要手动实现`Cloneable`接口和重写`clone()`方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值