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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值