面对读取和编码任何大小为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的声誉。