Closed luger1990 closed 8 months ago
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); } }
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
没问题,ByteArrayInputStream/OutputStream不用关
后来查了查文章 https://blog.csdn.net/pange1991/article/details/86575967 学习了!
JavaValueDecoder
JavaValueEncoder
第一个JavaValueDecoder中未对ByteArrayInputStream和ObjectInputStream进行close操作 第二个JavaValueEncoder 中对ObjectOutputStream执行了reset但未执行close操作 这样不会有问题吗?@areyouok