问题描述
我有一个启用AES加密的H2数据库。它具有CLOB类型的列。该列包含带有换行符的长文本(有时)。当我在H2控制台中检查该表时,我得到的输出是插入了所有新行,但是当我查询该表时,没有新行字符。我正在使用以下代码将CLOB对象转换为String对象:
public String clobToString(Clob data) {
StringBuilder sb = new StringBuilder();
try {
Reader reader = data.getCharacterStream();
BufferedReader br = new BufferedReader(reader);
String line;
while(null != (line = br.readLine())) {
sb.append(line);
}
br.close();
} catch (sqlException | IOException e) {
e.printstacktrace();
}
return sb.toString();
}
我觉得这里有些事情。还有其他有效的方法可以完成CLOB到String的转换。
解决方法
要从数据库的String
列中获取CLOB
值,请使用以下方法之一:
-
String text = resultSet.getString("MyClobColumn");
-
如果已经从
ResultSet
作为Clob
(使用getClob()
)中获取数据,请使用clob.getSubString()
:String text = clob.getSubString(1,(int) clob.length());
-
如果出于某种晦涩的原因而使用
Reader
(来自resultSet.getCharacterStream()
或clob.getCharacterStream()
),请复制块中的字符,并记住使用try-with-resources,例如String text; try (Reader reader = clob.getCharacterStream()) { StringBuilder sb = new StringBuilder(); char[] buf = new char[8192]; for (int len; (len = reader.read(buf)) != -1; ) sb.append(line,len); text = sb.toString(); }
或使用Java 10 +:
String text; try (Reader reader = clob.getCharacterStream()) { StringWriter sw = new StringWriter(); reader.transferTo(sw); text = sw.toString(); }
所有这三个当然都假定文本适合String
,即少于21亿个字符,或者取决于Java版本和所使用的字符(非拉丁1),只有大约10亿个字符