Java CLOB 转 String 的几种方法
在Java中,将CLOB(Character Large Object)转换为String有几种常见方法,以下是几种实现方式:

方法1:使用 getCharacterStream()
import java.sql.Clob;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
public String clobToString(Clob clob) throws IOException {
if (clob == null) {
return null;
}
StringBuilder sb = new StringBuilder();
try (Reader reader = clob.getCharacterStream();
BufferedReader br = new BufferedReader(reader)) {
String line;
while ((line = br.readLine()) != null) {
sb.append(line);
}
}
return sb.toString();
}
方法2:使用 getSubString()
import java.sql.Clob;
public String clobToString(Clob clob) throws SQLException {
if (clob == null) {
return null;
}
return clob.getSubString(1, (int) clob.length());
}
方法3:使用流式处理(适用于大CLOB)
import java.sql.Clob;
import java.io.IOException;
import java.io.Reader;
public String clobToString(Clob clob) throws IOException {
if (clob == null) {
return null;
}
StringBuilder sb = new StringBuilder();
try (Reader reader = clob.getCharacterStream()) {
char[] buffer = new char[1024];
int charsRead;
while ((charsRead = reader.read(buffer)) != -1) {
sb.append(buffer, 0, charsRead);
}
}
return sb.toString();
}
方法4:使用JDBC 4.0的getClob()方法(如果从ResultSet获取)
import java.sql.ResultSet;
import java.sql.SQLException;
public String clobToString(ResultSet rs, String columnName) throws SQLException {
Clob clob = rs.getClob(columnName);
return clobToString(clob);
}
注意事项
- 性能考虑:对于非常大的CLOB,方法3(流式处理)更节省内存
- 异常处理:所有方法都可能抛出SQLException或IOException,需要适当处理
- 字符编码:确保数据库和应用程序使用相同的字符编码
- NULL检查:始终检查CLOB是否为null
- 长度限制:方法2可能因CLOB过大而抛出异常,具体取决于JDBC驱动实现
示例使用
try {
Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement stmt = conn.prepareStatement("SELECT large_text FROM documents WHERE id = ?");
stmt.setInt(1, 1);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
Clob clob = rs.getClob("large_text");
String content = clobToString(clob);
System.out.println(content);
}
rs.close();
stmt.close();
conn.close();
} catch (SQLException | IOException e) {
e.printStackTrace();
}
选择哪种方法取决于你的具体需求,特别是CLOB的大小和性能要求。

