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

问题描述

我有一个启用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值,请使用以下方法之一:

  • 使用resultSet.getString()

    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亿个字符