问题遇到的现象和发生背景
关于ByteArrayOutputStream 引起的 OOM,ByteArrayOutputStream居然还要最大限制,byte数组最长就是int最大值
用代码块功能插入代码,请勿粘贴截图
public static byte[] getBytesByFile(File file) throws IOException {
FileInputStream fis = null;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
fis = new FileInputStream(file);
byte[] b = new byte[1024 * 1024];
int n;
while ((n = fis.read(b)) != -1) {
bos.write(b, 0, n);
System.out.println(bos.size() / 1024 / 1024 + "(MB)");
}
byte[] data = bos.toByteArray();
return data;
} catch (Exception e) {
System.out.println("将文件转换成Byte数组失败" + e);
} finally {
if (fis != null) {
fis.close();
}
bos.close();
}
return null;
}
运行结果及报错内容
994(MB)
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:933)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:824)
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:436)
at javax.crypto.Cipher.doFinal(Cipher.java:2165)
at cn.hutool.crypto.symmetric.SymmetricCrypto.encrypt(SymmetricCrypto.java:207)
at com.nice.videoview.App2.encrypt(App2.java:56)
at com.nice.videoview.App2.main(App2.java:24)
我的解答思路和尝试过的方法
尝试过很多办法,重写过OutputStream子类,发现byte[] 长度最大就是int的最大值
我想要达到的结果
现在计算机内存都16G了, 有时候需要处理一个大1G的文件,转换字节流时候就会报OOM