当前位置: 首页 > 知识库问答 >
问题:

用于流的Java缓冲base64编码器

南门野
2023-03-14

我有很多PDF文件,我需要得到它的内容编码使用Base64。我有一个Akka应用程序,它以流的形式获取文件,并分发给许多工人来编码这些文件,并为每个文件返回字符串base64。我得到了一个编码的基本解决方案:

    org.apache.commons.codec.binary.Base64InputStream;
    ...
    Base64InputStream b64IStream = null;
    InputStreamReader reader = null;
    BufferedReader br = null;
    StringBuilder sb = new StringBuilder();
    try {
        b64IStream = new Base64InputStream(input, true);
        reader = new InputStreamReader(b64IStream);
        br = new BufferedReader(reader);
        String line;
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }
    } finally {
        if (b64IStream != null) {
            b64IStream.close();
        }
        if (reader != null) {
            reader.close();
        }
        if (br != null) {
            br.close();
        }
    }

它工作,但我想知道什么将是最好的方式,我可以使用缓冲区编码文件,如果有一个更快的替代这一点。

测试了一些其他方法,例如:

    null

任何投入都是很有帮助的。谢谢你!

共有1个答案

龙弘盛
2023-03-14

关于Base64的有趣事实:它需要三个字节,并将它们转换成四个字母。这意味着,如果您读取可被3整除的块中的二进制数据,您可以将块提供给任何Base64编码器,它将以与您提供整个文件相同的方式对其进行编码。

现在,如果您希望您的输出流仅仅是一长行Base64数据--这是完全合法的--那么您需要做的就是以下内容:

private static final int BUFFER_SIZE = 3 * 1024;

try ( BufferedInputStream in = new BufferedInputStream(input, BUFFER_SIZE); ) {
    Base64.Encoder encoder = Base64.getEncoder();
    StringBuilder result = new StringBuilder();
    byte[] chunk = new byte[BUFFER_SIZE];
    int len = 0;
    while ( (len = in.read(chunk)) == BUFFER_SIZE ) {
         result.append( encoder.encodeToString(chunk) );
    }
    if ( len > 0 ) {
         chunk = Arrays.copyOf(chunk,len);
         result.append( encoder.encodeToString(chunk) );
    }
}

这意味着只有最后一个块的长度不能被三整除,因此将包含填充字符。

上面的示例使用的是Java8base64,但您可以真正使用任何编码器,它接受任意长度的字节数组并返回该字节数组的Base64字符串。

这意味着您可以随心所欲地使用缓冲区大小。

但是,如果希望输出与MIME兼容,则需要将输出分隔成行。在这种情况下,我会将上面示例中的块大小设置为一个值,当它乘以4/3时,会得到一个整数行数。例如,如果希望每行有64个字符,则每行编码64/4*3,即48个字节。如果你编码48个字节,你将得到一行。如果您编码480字节,您将得到10个完整的行。

 类似资料:
  • 我正在阅读有关流的信息,发现我们可以使用setvbuf()函数来控制流......它写的是在行缓冲模式中,当遇到换行符时流将数据发送到文件中,在无缓冲状态下没有缓冲......所以我写了以下代码...... 所以我认为,因为这些是无缓冲流,所以输入应该在我写入屏幕后立即发送到标准输出。。。但程序在写入每一行后等待我按enter键,然后屏幕上只显示输出(由于fwrite)。。。我的问题是,当这些是无

  • 本文向大家介绍详解java IO流之缓冲流的使用,包括了详解java IO流之缓冲流的使用的使用技巧和注意事项,需要的朋友参考一下 java缓冲流本身不具IO功能,只是在别的流上加上缓冲提高效率,像是为别的流装上一种包装。当对文件或其他目标频繁读写或操作效率低,效能差。这时使用缓冲流能够更高效的读写信息。因为缓冲流先将数据缓存起来,然后一起写入或读取出来。所以说,缓冲流还是很重要的,在IO操作时记

  • 我正在使用Google Protocol Buffers向服务器发送消息。我对如何发送图像与如何接收图像感到困惑。有关详细信息,请参阅下面的代码,但我的问题是: 我需要base64_decode从未经过base64编码的返回字符串吗,因为它是使用char*和size发送的?也许Google Protocol Buffers处理了这个问题,但我在生成的类中找不到任何证据。 我可能在这里找到了答案,但

  • 正在为以下内容编写javadoc: 但是,将缓冲的输入流传入真的是一个问题吗?因此: 是否将is缓冲到bis中,或者java是否检测到is已缓冲并设置bis=is?如果是,不同的缓冲区大小是否会有所不同?如果没有,为什么不呢<注意:我说的是输入流,但实际上这个问题也适用于输出流

  • 问题内容: 在Java中将字节[]转换为Base64字符串的正确方法是什么?最好还是使用Grails / Groovy,因为它告诉我该函数已被弃用。不建议使用该软件包,并且在某些Windows平台上会输出不同大小的字符串。 问题答案: Apache Commons有许多实用程序: 二进制包:http : //commons.apache.org/codec/apidocs/org/apache/c

  • 介绍 Base64编码是用64(2的6次方)个ASCII字符来表示256(2的8次方)个ASCII字符,也就是三位二进制数组经过编码后变为四位的ASCII字符显示,长度比原来增加1/3。 使用 String a = "伦家是一个非常长的字符串"; //5Lym5a625piv5LiA5Liq6Z2e5bi46ZW/55qE5a2X56ym5Liy String encode = Base64.en