java—将clob转换为字符串将删除所有新行字符

v8wbuo2f  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(437)

我有一个h2数据库与aes加密启用。它有一个clob类型的列。列包含带有新行字符的长文本(有时)。当我在h2控制台中检查表时,我得到插入了所有新行的输出,但是当我查询表时,没有新行字符。我使用以下代码将clob对象转换为字符串对象:

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到字符串的转换。

xe55xuns

xe55xuns1#

得到一个 String 来自a的值 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,例如。

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)。

相关问题