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

尝试使用BufferedInputStream和Base64对Java中的大型文件进行编码,java,base64,apache-commons,bufferedinputstream,Java,Base64,Apache Commons,Bufferedinputstream,我是Java I/O新手,请帮助我 我正在尝试使用apache commons库处理一个大文件(例如50mb的pdf文件)。 首先,我尝试: byte[] bytes = FileUtils.readFileToByteArray(file); String encodeBase64String = Base64.encodeBase64String(bytes); byte[] decoded = Base64.decodeBase64(encodeBase64String); 但是知道 o

我是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, 0, len);

                if (read != -1) {
                    pdfStringBuilder.append(Base64.encodeBase64String(tempByteArray));
                } else {
                    System.err.println("End of file reached.");
                }
            }
byte[] bytes = Base64.decodeBase64(pdfStringBuilder.toString());
BufferedInputStream bis=新的BufferedInputStream(inputStream);
StringBuilder pdfStringBuilder=新StringBuilder();
int-byteArraySize=10;
字节[]tempByteArray=新字节[byteArraySize];
while(bis.available()>0){
如果(bis.available()
tempByteArray=新字节[bis.available()];
}
int len=Math.min(bis.available(),byteArraySize);
read=bis.read(tempByteArray,0,len);
如果(读取!=-1){
append(Base64.encodeBase64String(tempByteArray));
}否则{
System.err.println(“到达文件末尾”);
}
}
byte[]bytes=Base64.decodeBase64(pdfStringBuilder.toString());
但是,2个解码字节数组看起来不太一样。。。事实上,只给出10个字节,这就是我的临时数组大小

请任何人帮忙:

  • 我一件一件地读文件有什么不对
  • 为什么解码字节数组在第二个解决方案中只返回10个字节

提前感谢:)

经过一些挖掘,结果表明字节数组的大小必须是3的倍数,以避免填充。使用临时数组大小为3的倍数后,程序能够通过

我只是简单的改变

int byteArraySize = 10;
将来


坦率地说,我鼓励您尝试一次对整个文件进行编码:50MB并没有那么大;Java的最大字符串长度为2GB。@paulsm4感谢您的建议:)使用InputStream.available()检查流的结尾永远都是不正确的。相反,检查
read
方法是否返回负值。有关详细信息,请参见。@VGR:谢谢您的建议:)作为一个附带问题,是否有任何关于如何删除/修剪最后一个字节数组末尾的NUL的建议?当然有一些方法可以只处理字节数组的一部分,但我首先要问您为什么要对数据进行base64编码,然后立即对相同的数据进行bse64解码。您正确地认为将整个文件加载到内存中是一个坏主意,但您最终还是这样做了(两次!),因为您仍然使用
bytes
变量。您实际上希望对文件进行什么处理?
int byteArraySize = 1024 * 3;