嗨,当我试图读取blob得到异常。正在发布如何写入DB并获得对DB的友好建议,这导致了太多问题。
ava.io.StreamCorruptedException: invalid stream header: 4920616D at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:782) at java.io.ObjectInputStream.(ObjectInputStream.java:279) at com.jiit.jfx.persistence.TypeHelper.readBlob(TypeHelper.java:137) at com.jiit.jfx.persistence.TypeHelper.get(TypeHelper.java:84) at com.jiit.jfx.persistence.dataaccess.OracleSQLQuery.get(OracleSQLQuery.java:116) at com.jiit.jfx.persistence.dataaccess.OracleSQLQuery.doOperation(OracleSQLQuery.java:65) at com.jiit.jfx.persistence.dataaccess.AbstractDAO.execute(AbstractDAO.java:181) at com.jiit.jfx.persistence.dataaccess.AbstractDAO.executeSQL(AbstractDAO.java:208) at com.jiit.ngcs.mx.server.model.rail.ASMMessageStore.getASMMessageStore(ASMMessageStore.java:196) enter code here Reading BOLB : public static Blob createBlob(Object serializable) throws PersistenceException{ try { ByteArrayOutputStream bStream = new ByteArrayOutputStream(); ObjectOutputStream oStream = new ObjectOutputStream(bStream); oStream.writeObject(serializable); oStream.flush(); oStream.close(); return createBlob(bStream.toByteArray()); } catch (Exception e) { throw new PersistenceException(e.getMessage()); } } in TypeHelper.java -- > createBlob private static Object readBlob(int index, ResultSet rs) throws SQLException { try { InputStream is = rs.getBinaryStream(index); if(is != null) { ObjectInputStream os = new ObjectInputStream(is); return os.readObject(); } return null; } catch (IOException e) { e.printStackTrace(); throw new SQLException(e.getMessage()); } catch (ClassNotFoundException e) { e.printStackTrace(); throw new SQLException(e.getMessage()); }
尝试了stackoverflow和其他博客中给出的所有案例。仍然不了解确切的问题。
让我们开始 4920616D
。如果将其解码为ASCII字符,则会得到“我是” ...英文文本。现在这可能是一个巧合,但请假设并非如此。
是什么导致文本出现在您期望序列化对象的地方?
好吧,一种可能是您弄错了结果集索引值。如果结果集中的索引1对应于CHAR或VARCHAR或类似字段中的值,则您的JDBC驱动程序可以返回由一堆编码文本组成的“二进制流”。您可能会看到数据库中可能用于存储文本的多种字符编码方案的那些字符,包括ASCII,LATIN-1和UTF-8。