Java 是否有一种内存有效的方法来转换输入流编码

Java 是否有一种内存有效的方法来转换输入流编码,java,character-encoding,inputstream,Java,Character Encoding,Inputstream,我正在使用http客户端从Google云存储中读取一个潜在的海量CSV文件。获得CSV文件后,我需要将其上载到另一个bucket,并将数据加载到BigQuery表中。不幸的是,我下载的文件是用UTF-16编码的,而BigQuery只支持UTF-8。我需要一种将数据从UTF-16转换为UTF-8的方法。我知道我可以简单地将http响应输入流中的数据读取为UTF-16,然后将其写入一个新的输入流(UTF-8),如下所示: byte[] data = IOUtils.toByteArray(respo

我正在使用http客户端从Google云存储中读取一个潜在的海量CSV文件。获得CSV文件后,我需要将其上载到另一个bucket,并将数据加载到BigQuery表中。不幸的是,我下载的文件是用UTF-16编码的,而BigQuery只支持UTF-8。我需要一种将数据从UTF-16转换为UTF-8的方法。我知道我可以简单地将http响应输入流中的数据读取为UTF-16,然后将其写入一个新的输入流(UTF-8),如下所示:

byte[] data = IOUtils.toByteArray(response.getEntity().getContent());
String csv = new String(data, StandardCharsets.UTF_8);
ByteArrayInputStream inputStream = new ByteArrayInputStream(csv.getBytes(StandardCharsets.UTF_8));
但是,鉴于CSV文件没有最大大小,并且可能非常大,如果可能的话,我希望避免将其读入内存。我需要这个过程的最终产品是一个InputStream,这样就不会破坏接口的契约

我曾考虑过使用BufferedReader一次读取一行输入流并转换编码,但我不确定一旦转换为新的输入流是否更有效


是否有任何方法可以以内存有效的方式将输入流中的UTF-16内容转换为UTF-8内容

因为您已经使用了
commons.io
库。这可能正是您想要的:

InputStreamReader utf16Reader=新的InputStreamReader(is,StandardCharsets.UTF_16);
ReaderInputStream utf8IS=新的ReaderInputStream(utf16Reader,StandardCharsets.UTF_8);

哪个双包装
utf16
-解码读取器,然后到
utf8
编码字节流

使用
IOUtils.copy(InputStream,Writer,Charset)
。您可以将数据从输入流重定向到输出流stream@maklas谢谢你的建议,但正如我说的,我需要这个过程的输出是一个输入流,而不是一个编写器/输出流。@Ben_Green。好的,明白了。您需要将字节解码为utf16字符,然后将其编码为utf8。那么这可能行得通。双重包装输入流<代码>java InputStreamReader utf16Reader=新的InputStreamReader(is,StandardCharsets.UTF_16);ReaderInputStream utf8IS=新的ReaderInputStream(utf16Reader,StandardCharsets.UTF_8)@maklas,这看起来像是一个像样的喊声。我假设InputStreamReader没有将输入流读入内存?如果你给我一个答案,我就投上一票:)@Ben_Green。当然有。否则它将如何解码和编码它。但它不会读取整个流并将其放入字符串中。它可能只是读取8KB的小块,在一个while循环中处理每个块。因此,它不会将所有数据加载到内存中。你的ram和垃圾收集器会很高兴的。