繁体   English   中英

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

[英]Converting CLOB to String removes all new line characters

我有一个启用了 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");
  • 如果数据已经作为ClobResultSetgetClob()使用clob.getSubString() ),请使用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)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM