如何在java中通过编码将clob转换为字符串

如何在java中通过编码将clob转换为字符串,java,unicode,apache-commons-io,Java,Unicode,Apache Commons Io,我们正在进行大量的xml处理,将clob转换为字符串的逻辑如下所示 import java.sql.Clob import org.apache.commons.io.IOUtils String extractXml(Clob xmlClob) { log.info "DefaultCharset: " + groovy.util.CharsetToolkit.getDefaultSystemCharset() String sourceXml try {

我们正在进行大量的xml处理,将clob转换为字符串的逻辑如下所示

import java.sql.Clob
import org.apache.commons.io.IOUtils

String extractXml(Clob xmlClob) {

    log.info "DefaultCharset: " + groovy.util.CharsetToolkit.getDefaultSystemCharset()

    String sourceXml
    try {
        sourceXml = new String(IOUtils.toByteArray(xmlClob?.getCharacterStream()), encoding)            // 1. Encoding not working
        sourceXml = new String(IOUtils.toByteArray(xmlClob?.getCharacterStream(), encoding), encoding)  // 2. Encoding working
    } catch (Exception e) {
        ...
    }

    return sourceXml
}
我的问题是:

a。我不确定为什么(1)不起作用,即使我使用的是getCharacterStream()而不是GetAsciStream()。 但是(2)似乎工作得很好,可能我正在使用系统编码的显式重写

b。解决方案(2)看起来有点奇怪,因为您指定了2倍的编码格式(一个用于字节数组,一个用于字符串创建)。 我不确定是否存在任何性能问题,或者想知道是否有更好的方法来编写它们

c。我考虑不使用apachecommons库,而是使用一个简单的java包解决方案。 但令人惊讶的是,我没有给出任何明确的编码,但它似乎工作得很完美。 是因为它执行“字符流->直接到字符串缓冲”操作吗


你们能解释一下吗。

Clob已经有了编码。它是您在数据库中指定的任何内容,一旦您在Java端读取它,它将是一个
字符串
(使用隐式UTF-16编码,这一点都不重要)

无论你认为你在用这些编码技巧做什么,都是错误和无用的。您只需要在将
字节
转换为
字符
或相反方式时指定编码。您只处理
字符
(在第一个示例中,由于未知原因,您希望将它们转换为字节)

如果您想使用
IOUtils
,那么要使用的方法将是
readFully(读卡器输入,char[]buffer)

平台默认编码在整个问题中没有效果,因为您根本不应该使用字节

编辑: 使用标准JDK类的一种稍微现代一点的方法是使用
Reader.read(CharBuffer target)
like

CharBuffer cb = CharBuffer.allocate((int) xmlClob.length());
while(r.read(cb) != -1)
    ;
return cb.toString();

但是它并没有带来很大的区别(它看起来有点漂亮)。

Clob已经有了编码。它是您在数据库中指定的任何内容,一旦您在Java端读取它,它将是一个
字符串
(使用隐式UTF-16编码,这一点都不重要)

无论你认为你在用这些编码技巧做什么,都是错误和无用的。您只需要在将
字节
转换为
字符
或相反方式时指定编码。您只处理
字符
(在第一个示例中,由于未知原因,您希望将它们转换为字节)

如果您想使用
IOUtils
,那么要使用的方法将是
readFully(读卡器输入,char[]buffer)

平台默认编码在整个问题中没有效果,因为您根本不应该使用字节

编辑: 使用标准JDK类的一种稍微现代一点的方法是使用
Reader.read(CharBuffer target)
like

CharBuffer cb = CharBuffer.allocate((int) xmlClob.length());
while(r.read(cb) != -1)
    ;
return cb.toString();

但是它并没有带来太大的区别(它看起来有点漂亮)。

谢谢。。我更了解何时使用编码,并且在处理字符流时不需要将它们转换为字节。第二个例子是我只使用java标准库的好例子吗?是的,看起来不错。也许有一种更“现代”的方法可以做到这一点,但在这样的循环中读入
StringBuffer
并没有什么错。谢谢。。我更了解何时使用编码,并且在处理字符流时不需要将它们转换为字节。第二个例子是我只使用java标准库的好例子吗?是的,看起来不错。也许有一种更“现代”的方法可以做到这一点,但在这样的循环中读入
StringBuffer
并没有什么错。