java中处理blob/clob需全程流式操作:写入clob用setcharacterstream或setclob,blob用setbinarystream或setblob;读取时通过getclob/getblob获取对象,再用getcharacterstream/getbinarystream流式读取,避免内存溢出。

Java 中用 JDBC 处理 BLOB(二进制大对象)和 CLOB(字符大对象),核心是绕过字符串拼接,全程使用流式操作 + PreparedStatement 和 ResultSet 的专用方法。数据库字段类型需匹配(如 MySQL 用 LONGBLOB/LONGTEXT),且不能用普通 setString 或 getString。
写入 CLOB:文本内容存入数据库
适用于长文本、日志、HTML、XML 等。关键不是把整个字符串加载进内存,而是用字符流或 Reader 流式写入:
- 若内容纯 ASCII,可用
pstmt.setAsciiStream(1, inputStream, length) - 含中文或 Unicode 字符时,优先用
pstmt.setCharacterStream(1, reader, length)或pstmt.setClob(1, reader) - 示例:读取本地文件写入
LONGTEXT字段FileReader fr = new FileReader("D:/doc.txt");<br>pstmt.setCharacterStream(3, fr, fr.read(new char[0])); // 或直接传 fr.length()
写入 BLOB:二进制文件存入数据库
适合图片、PDF、音频、压缩包等。必须用输入流(InputStream)或 Blob 对象:
- 最简方式:
pstmt.setBinaryStream(1, is, length)—— 直接传入文件流 - 更可控方式:先调用
conn.createBlob()创建空 Blob,再用blob.setBinaryStream(1)获取输出流写入数据,最后pstmt.setBlob(1, blob) - 注意:Oracle 等数据库要求先插入空 Blob(
empty_blob()),再SELECT ... FOR UPDATE获取定位器写入,MySQL 通常可直写
读取 CLOB:从数据库取出长文本
避免一次性加载全部内容到内存,推荐用字符流逐段读取:
- 先用
rs.getClob("column_name")获取Clob对象 - 再调用
clob.getCharacterStream()得到Reader,按需读取(如read(char[])或BufferedReader.readLine()) - 也可用
clob.getSubString(1, (int) clob.length())全量转字符串(仅限内容不超内存)
读取 BLOB:从数据库取出二进制数据
同样推荐流式处理,尤其对大文件:
- 用
rs.getBlob("column_name")获取Blob对象 - 调用
blob.getBinaryStream()得到InputStream,写入文件或解码为图像等 - 也可用
blob.getBytes(1, (int) blob.length())全量读入字节数组(小文件适用) - 例如:用
ImageIO.read(blob.getBinaryStream())直接加载图片
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











