是否有一种内存有效的方式来转换输入流编码
Is there a memory efficient way to convert input stream encoding
我正在使用 http 客户端从 Google Cloud Storage 读取一个可能很大的 CSV 文件。获得 CSV 文件后,我需要将其上传到另一个存储桶,并将数据加载到 BigQuery table。不幸的是,我正在下载的文件是用 UTF-16 编码的,而 BigQuery 只支持 UTF-8。我需要一种方法将数据从 UTF-16 转换为 UTF-8。我知道我可以简单地以 UTF-16 格式从 http 响应输入流中读取数据,然后将其以 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 = new InputStreamReader(is, StandardCharsets.UTF_16);
ReaderInputStream utf8IS = new ReaderInputStream(utf16Reader, StandardCharsets.UTF_8);
将is
双重包装成utf16
-解码reader然后进入utf8
编码字节流
我正在使用 http 客户端从 Google Cloud Storage 读取一个可能很大的 CSV 文件。获得 CSV 文件后,我需要将其上传到另一个存储桶,并将数据加载到 BigQuery table。不幸的是,我正在下载的文件是用 UTF-16 编码的,而 BigQuery 只支持 UTF-8。我需要一种方法将数据从 UTF-16 转换为 UTF-8。我知道我可以简单地以 UTF-16 格式从 http 响应输入流中读取数据,然后将其以 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 = new InputStreamReader(is, StandardCharsets.UTF_16);
ReaderInputStream utf8IS = new ReaderInputStream(utf16Reader, StandardCharsets.UTF_8);
将is
双重包装成utf16
-解码reader然后进入utf8
编码字节流