Java读取和编码大型二进制文件

时间:2014-03-20 09:47:22

标签: java file jsp binary base64

面对读取和编码任何大小不超过100 MB的文件的问题。我的代码可以很好地处理小txt文件和代码,可以处理大量数据。问题是最后一个不能用于未知原因。 试图谷歌周围没有运气,这就是为什么我在这里。

//Working snippet. Readind putty does nothing.
final String fileName = "C:\\putty.exe";
InputStream inStream = null;
BufferedInputStream bis = null;

try {
    inStream = new FileInputStream(fileName);
    bis = new BufferedInputStream(inStream);

    int numByte = bis.available();
    byte[] buf = new byte[numByte];

    bis.read(buf, 0, numByte);
    buf = Base64.encodeBase64(buf);
    for (byte b : buf) {
        out.write(b);
    }
} catch (Exception e) {
    e.printStackTrace();
} finally { 
    if (inStream != null)
        inStream.close();
    if (bis != null)
        bis.close();
}

以下代码段来自其他回复。

BufferedReader br = null;
long fsize;
int bcap;
StringBuilder sb = new StringBuilder();

FileChannel fc = new FileInputStream(fileName).getChannel();
fsize = fc.size();
ByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fsize);
bb.flip();
bcap = bb.capacity();
while (bb.hasRemaining() == true) {
    bcap = bb.remaining();
    byte[] bytes = new byte[bcap];
    bb.get(bytes, 0, bytes.length);
    String str = new String(Base64.encodeBase64(bytes));            
    sb.append(str);
}
fc.close();
((DirectBuffer) bb).cleaner().clean();

String resultString = sb.toString();
out.write(resultString);
out.write("test");

这是我得到的例外

org.apache.jasper.JasperException: An exception occurred processing JSP page /read.jsp at line 57
54:         while (bb.hasRemaining() == true)
55:             bcap = bb.remaining();
56:             byte[] bytes = new byte[bcap];
57:             bb.get(bytes, 0, bytes.length);
58:             String str = new String(Base64.encodeBase64(bytes));            
59:             sb.append(str);
60:         fc.close();

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

你不能在小块上继续使用base64你以后不知道如何解码它,因为所有base64字符串组合起来会创建一个大的base64字符串,你无法弄清楚每个块的位置base64字符串的开头或结尾。另外,您无法预测base64字符串的大小

您必须立即在整个文件字节上创建base64字符串。

尝试替换

bb.get(bytes, 0, bytes.length);

bb.get(bytes, 0, bcap);

bb.get(bytes, 0, bb.remaining());

或者

byte[] bytes = new byte[bcap+1];

我无法评论我没有50个声誉。