alibaba / jetcache

JetCache is a Java cache framework.
Apache License 2.0
5.03k stars 1.05k forks source link

JavaValueDecoder和JavaValueEncoder中均没有对inputstream和outstream 进行close操作,会不会有问题? #849

Closed luger1990 closed 8 months ago

luger1990 commented 8 months ago

JavaValueDecoder

public class JavaValueDecoder extends AbstractValueDecoder {

    public static final JavaValueDecoder INSTANCE = new JavaValueDecoder(true);

    public JavaValueDecoder(boolean useIdentityNumber) {
        super(useIdentityNumber);
    }

    @Override
    public Object doApply(byte[] buffer) throws Exception {
        ByteArrayInputStream in;
        if (useIdentityNumber) {
            in = new ByteArrayInputStream(buffer, 4, buffer.length - 4);
        } else {
            in = new ByteArrayInputStream(buffer);
        }
        ObjectInputStream ois = buildObjectInputStream(in);
        return ois.readObject();
    }

    protected ObjectInputStream buildObjectInputStream(ByteArrayInputStream in) throws IOException {
        return new ObjectInputStream(in);
    }
}

JavaValueEncoder

public class JavaValueEncoder extends AbstractValueEncoder {

    public static final JavaValueEncoder INSTANCE = new JavaValueEncoder(true);

    private static final int INIT_BUF_SIZE = 256;

    public JavaValueEncoder(boolean useIdentityNumber) {
        super(useIdentityNumber);
    }

    private static ThreadLocal<WeakReference<ByteArrayOutputStream>> threadLocal =
            ThreadLocal.withInitial(() -> new WeakReference<>(new ByteArrayOutputStream(INIT_BUF_SIZE)));

    @Override
    public byte[] apply(Object value) {
        try {
            WeakReference<ByteArrayOutputStream> ref = threadLocal.get();
            ByteArrayOutputStream bos = ref.get();
            if (bos == null) {
                bos = new ByteArrayOutputStream(INIT_BUF_SIZE);
                threadLocal.set(new WeakReference<>(bos));
            }

            try {
                if (useIdentityNumber) {
                    bos.write((SerialPolicy.IDENTITY_NUMBER_JAVA >> 24) & 0xFF);
                    bos.write((SerialPolicy.IDENTITY_NUMBER_JAVA >> 16) & 0xFF);
                    bos.write((SerialPolicy.IDENTITY_NUMBER_JAVA >> 8) & 0xFF);
                    bos.write(SerialPolicy.IDENTITY_NUMBER_JAVA & 0xFF);
                }

                ObjectOutputStream oos = new ObjectOutputStream(bos);
                oos.writeObject(value);
                oos.flush();
                return bos.toByteArray();
            } finally {
                bos.reset();
            }
        } catch (IOException e) {
            StringBuilder sb = new StringBuilder("Java Encode error. ");
            sb.append("msg=").append(e.getMessage());
            throw new CacheEncodeException(sb.toString(), e);
        }
    }
}

第一个JavaValueDecoder中未对ByteArrayInputStream和ObjectInputStream进行close操作 第二个JavaValueEncoder 中对ObjectOutputStream执行了reset但未执行close操作 这样不会有问题吗?@areyouok

areyouok commented 8 months ago

没问题,ByteArrayInputStream/OutputStream不用关

luger1990 commented 8 months ago

没问题,ByteArrayInputStream/OutputStream不用关

后来查了查文章 https://blog.csdn.net/pange1991/article/details/86575967 学习了!