将CLOB转换为字符串将删除所有换行符



我有一个启用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到字符串的转换。

要从数据库中的CLOB列获取String值,请使用以下操作之一:

  • 使用resultSet.getString():

    String text = resultSet.getString("MyClobColumn");
    
  • 如果数据已经作为ClobResultSet获取(使用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, 0, 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亿个字符,或仅约10亿个字符(取决于Java版本和使用的字符(非拉丁语1((。

最新更新