Java Base64数据的流解码
我有一些大的base64编码数据(存储在hadoop文件系统的snappy文件中)。 此数据最初是gzip文本数据。 我需要能够读取这些编码数据的块,对其进行解码,然后将其刷新到GZIPOutputStream 有什么想法可以代替将整个base64数据加载到数组中并调用base64.decodeBase64(字节[])来实现这一点吗 如果我将字符读到“\r\n”分隔符并逐行解码,对吗? e、 g: 这给了我一个机会 java.io.IOException:损坏的GZIP拖车让我们一步一步走:Java Base64数据的流解码,java,hadoop,base64,gzipinputstream,Java,Hadoop,Base64,Gzipinputstream,我有一些大的base64编码数据(存储在hadoop文件系统的snappy文件中)。 此数据最初是gzip文本数据。 我需要能够读取这些编码数据的块,对其进行解码,然后将其刷新到GZIPOutputStream 有什么想法可以代替将整个base64数据加载到数组中并调用base64.decodeBase64(字节[])来实现这一点吗 如果我将字符读到“\r\n”分隔符并逐行解码,对吗? e、 g: 这给了我一个机会 java.io.IOException:损坏的GZIP拖车让我们一步一步走: 您
gzip输入流
来读取压缩数据(而不是gzip输出流
;输出流用于压缩数据)。有了这个流,您将能够读取未压缩的原始二进制数据。这需要构造函数中有一个InputStream
doEncode=false
来解码数据。这反过来又需要另一个输入流——原始的Base64编码数据InputStream
——问题已解决。如果不是,您可能必须使用ByteArrayInputStream
(如果是二进制的)、StringBufferInputStream
(如果是字符串)等InputStream fromHadoop = ...; // 3rd paragraph
Base64InputStream b64is = // 2nd paragraph
new Base64InputStream(fromHadoop, false, 80, "\n".getBytes("UTF-8"));
GZIPInputStream zis = new GZIPInputStream(b64is); // 1st paragraph
请注意
Base64InputStream
(行长和行尾字节数组)的参数,您可能需要调整它们。感谢Nikos为我指出了正确的方向。
具体来说,我就是这么做的:
private static final byte NEWLINE = (byte) '\n';
private static final byte CARRIAGE_RETURN = (byte) '\r';
byte[] lineSeparators = new byte[] {CARRIAGE_RETURN, NEWLINE};
Base64InputStream b64is = new Base64InputStream(inputStream, false, 76, lineSeparators);
GZIPInputStream zis = new GZIPInputStream(b64is);
76不是基线64的长度吗?不过,我没有尝试使用80。
byteBuffer.put(Base64.decodeBase64(record))
不应该是byteBuffer.put(Base64.encodeBase64(record))代码>记录是Base64编码的。我正试图得到解码后的数据并将其添加到ByteBuffer中。非常感谢,Nikos。Base64InputStream类有帮助。如果它的长度固定为76,那么它们就不会包含构造函数参数。还可以考虑数据URI,其中所有内容都是一行。
InputStream fromHadoop = ...; // 3rd paragraph
Base64InputStream b64is = // 2nd paragraph
new Base64InputStream(fromHadoop, false, 80, "\n".getBytes("UTF-8"));
GZIPInputStream zis = new GZIPInputStream(b64is); // 1st paragraph
private static final byte NEWLINE = (byte) '\n';
private static final byte CARRIAGE_RETURN = (byte) '\r';
byte[] lineSeparators = new byte[] {CARRIAGE_RETURN, NEWLINE};
Base64InputStream b64is = new Base64InputStream(inputStream, false, 76, lineSeparators);
GZIPInputStream zis = new GZIPInputStream(b64is);