面对读取和编码任何大小不超过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();
任何帮助都将不胜感激。
答案 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个声誉。