Pra*_*ash 1 java string clob h2 java-11
我有一个启用了 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();
}
Run Code Online (Sandbox Code Playgroud)
我觉得这里有事。有没有其他有效的方法来进行这种 CLOB 到字符串的转换。
要从数据库中String的CLOB列中获取值,请使用以下方法之一:
String text = resultSet.getString("MyClobColumn");
Run Code Online (Sandbox Code Playgroud)
如果数据已经从ResultSetas a Clob(using getClob()) 中获取,请使用clob.getSubString():
String text = clob.getSubString(1, (int) clob.length());
Run Code Online (Sandbox Code Playgroud)
如果您出于某种晦涩的原因有Reader(fromresultSet.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, 0, len);
text = sb.toString();
}
Run Code Online (Sandbox Code Playgroud)
或者使用 Java 10+:
String text;
try (Reader reader = clob.getCharacterStream()) {
StringWriter sw = new StringWriter();
reader.transferTo(sw);
text = sw.toString();
}
Run Code Online (Sandbox Code Playgroud)
当然,所有三个都假设文本适合 a String,即它少于大约 21 亿个字符,或者只有大约 10 亿个字符,这取决于 Java 版本和使用的字符(非拉丁语 1)。