Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Base64数据的流解码_Java_Hadoop_Base64_Gzipinputstream - Fatal编程技术网

Java Base64数据的流解码

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拖车让我们一步一步走: 您

我有一些大的base64编码数据(存储在hadoop文件系统的snappy文件中)。 此数据最初是gzip文本数据。 我需要能够读取这些编码数据的块,对其进行解码,然后将其刷新到GZIPOutputStream

有什么想法可以代替将整个base64数据加载到数组中并调用base64.decodeBase64(字节[])来实现这一点吗

如果我将字符读到“\r\n”分隔符并逐行解码,对吗? e、 g:

这给了我一个机会 java.io.IOException:损坏的GZIP拖车

让我们一步一步走:

  • 您需要一个
    gzip输入流
    来读取压缩数据(而不是
    gzip输出流
    ;输出流用于压缩数据)。有了这个流,您将能够读取未压缩的原始二进制数据。这需要构造函数中有一个
    InputStream

  • 您需要一个能够读取Base64编码数据的输入流。我建议你买一个方便的。使用构造函数,您可以设置行长度、行分隔符,并设置
    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);