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



面对读取和编码任何大小为100 MB的文件的问题。我的代码在小文本文件和代码上工作得很好,可以处理大量数据。问题是最后一个不知道为什么不工作。我试着用谷歌搜索,但没有运气,这就是为什么我在这里。

//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();

你不能在小块上继续使用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的声誉。

相关内容

  • 没有找到相关文章

最新更新