将 CLOB 转换为 String 会删除所有换行符

Converting CLOB to String removes all new line characters

我有一个启用了 AES 加密的 H2 数据库。它有一个 CLOB 类型的列。该列包含带有换行符的长文本(有时)。当我在 H2 控制台中检查 table 时,我得到了插入了所有新行的输出,但是当我查询 table 时,没有换行符。我正在使用此代码将 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");
    
  • 如果数据已经取自 ResultSet 作为 Clob (using getClob()), use clob.getSubString():

    String text = clob.getSubString(1, (int) clob.length());
    
  • 如果您出于某种不明原因有一个 Reader(来自 resultSet.getCharacterStream() or 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 版本和字符使用(非 Latin1)。