微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试使用 BufferedInputStream 和 Base64 在 Java 中对大文件进行编码

如何解决尝试使用 BufferedInputStream 和 Base64 在 Java 中对大文件进行编码

我是 Java I/O 的新手,所以请帮忙。

我正在尝试使用 apache commons 库处理一个文件(例如 50mb 的 pdf 文件)。 起初我尝试:

byte[] bytes = FileUtils.readFiletoByteArray(file);
String encodeBase64String = Base64.encodeBase64String(bytes);
byte[] decoded = Base64.decodeBase64(encodeBase64String);

但是知道 org.apache.commons.io 中的 FileUtils.readFiletoByteArray 会将整个文件加载到内存中,我尝试使用 BufferedInputStream 逐个读取文件

BufferedInputStream bis = new BufferedInputStream(inputStream);
StringBuilder pdfStringBuilder = new StringBuilder();
int byteArraySize = 10;
byte[] tempByteArray = new byte[byteArraySize];
while (bis.available() > 0) {
                if (bis.available() < byteArraySize) { // reaching the end of file
                    tempByteArray = new byte[bis.available()];
                }
                int len = Math.min(bis.available(),byteArraySize);
                read = bis.read(tempByteArray,len);

                if (read != -1) {
                    pdfStringBuilder.append(Base64.encodeBase64String(tempByteArray));
                } else {
                    System.err.println("End of file reached.");
                }
            }
byte[] bytes = Base64.decodeBase64(pdfStringBuilder.toString());

然而,2个解码后的字节数组看起来不太一样... ...实际上,只给出了10个字节,这是我的临时数组大小... ...

任何人都可以帮忙:

  • 逐个读取文件我做错了什么?
  • 为什么解码后的字节数组在第二个解决方案中只返回 10 个字节?

提前致谢:)

解决方法

经过一番挖掘,发现字节数组的大小必须是 3 的倍数,以避免填充。使用3的倍数的临时数组大小后,程序就可以通过了。

我只是改变了

int byteArraySize = 10;

成为

int byteArraySize = 1024 * 3;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。