Java 打印字符串时出现内存不足错误
在通过Base64编码器将字节编码为字符串后,在打印字符串时,我遇到了一个问题,即我面临OuOfMemory错误。以下是与代码相关的详细信息: 错误堆栈:Java 打印字符串时出现内存不足错误,java,android,Java,Android,在通过Base64编码器将字节编码为字符串后,在打印字符串时,我遇到了一个问题,即我面临OuOfMemory错误。以下是与代码相关的详细信息: 错误堆栈: 11-05 12:25:30.995: ERROR/AndroidRuntime(2660): FATAL EXCEPTION: main 11-05 12:25:30.995: ERROR/AndroidRuntime(2660): java.lang.OutOfMemoryError 11-05 12:25:30.995: ERROR/A
11-05 12:25:30.995: ERROR/AndroidRuntime(2660): FATAL EXCEPTION: main
11-05 12:25:30.995: ERROR/AndroidRuntime(2660): java.lang.OutOfMemoryError
11-05 12:25:30.995: ERROR/AndroidRuntime(2660): at java.lang.AbstractStringBuilder.<init>(AbstractStringBuilder.java:89)
11-05 12:25:30.995: ERROR/AndroidRuntime(2660): at java.lang.StringBuffer.<init>(StringBuffer.java:83)
11-05 12:25:30.995: ERROR/AndroidRuntime(2660): at com.example.TestCryptoActivity.onCreate(TestCryptoActivity.java:54)
11-05 12:25:30.995: ERROR/AndroidRuntime(2660): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-05 12:25:30.995: ERROR/AndroidRuntime(2660): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
11-05 12:25:30.995: ERROR/AndroidRuntime(2660): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
11-05 12:25:30.995: ERROR/AndroidRuntime(2660): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
11-05 12:25:30.995: ERROR/AndroidRuntime(2660): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
11-05 12:25:30.995: ERROR/AndroidRuntime(2660): at android.os.Handler.dispatchMessage(Handler.java:99)
11-05 12:25:30.995: ERROR/AndroidRuntime(2660): at android.os.Looper.loop(Looper.java:123)
11-05 12:25:30.995: ERROR/AndroidRuntime(2660): at android.app.ActivityThread.main(ActivityThread.java:4627)
11-05 12:25:30.995: ERROR/AndroidRuntime(2660): at java.lang.reflect.Method.invokeNative(Native Method)
11-05 12:25:30.995: ERROR/AndroidRuntime(2660): at java.lang.reflect.Method.invoke(Method.java:521)
11-05 12:25:30.995: ERROR/AndroidRuntime(2660): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-05 12:25:30.995: ERROR/AndroidRuntime(2660): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-05 12:25:30.995: ERROR/AndroidRuntime(2660): at dalvik.system.NativeStart.main(Native Method)
File file = new File("/sdcard/E0022505.mp4");
try {
is = new FileInputStream(file);
} catch (FileNotFoundException e2) {
e2.printStackTrace();
}
byte[] fileData = new byte[2097152];
int read = 0;
while(read != fileData.length) {
try {
read += is.read(fileData, read, fileData.length - read);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bos.write(fileData,0,read);
bytes = bos.toByteArray();
StringBuffer strNew = new StringBuffer(Base64.encodeToString(fileData, 0));
System.out.println("The bytes array:"+strNew);---> This line makes error
所以让我直说吧。你有一个大约2MB的文件,你想对它进行base64编码(所以它会变成2.7MB),然后打印出来 为什么??认真地您要检查输出的每个字节吗 我想提出一些更大致的建议:
System.out.println ("The bytes array:" + strNew.substring (0, 50));
因此,您至少可以在不破坏输出的情况下检查它
您的JRE(在本例中是Davlik)很有可能并不特别喜欢使用多兆字节字符串(因为StringBuilder
是这里所有东西都崩溃的地方)
如果这仍然没有帮助,您可以对base64编码进行分段,这样就不会产生巨大的字符串。Base64将
3n
字节转换为4n
字节,因此,如果处理的段是3的倍数,就不必担心对齐问题。例如,在3K块中处理2M字节数组-每个块都将提供一个4K base64编码块供您处理。这种分块将减少内存不足的可能性。删除这三行没有任何用处的代码至少可以避免内存中的2097152字节:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bos.write(fileData,0,read);
bytes = bos.toByteArray();
对于其余部分,这段代码会导致异常发生,但可能是因为之前执行的代码的其他部分内存太少
尝试使用探查器检测内存的使用位置
但是在android程序的内存中存储一个完整的大字节数组及其用base64编码的副本当然是个坏主意。base64不是专门为android设备设计的,所以它从不考虑内存利用率,当我们编码视频文件时,字符串的大小会很长,有时也会是大图像,我们有一个有限的臀部大小(约25MB)的内存大小 我也曾多次遇到过同样的问题,我相信其他人在用Base64编码将大文件上传到服务器时也遇到过同样的问题。这是一件非常困难的事情。就我而言,我从未成功过 我建议您将服务器更改为接受字节数组中的数据,然后再接受Base64中的数据。。 当以字节形式将文件发送到服务器时,请使用multi-part.。这样做的有用库是
我已经阅读了有关此问题的文档和博客,并花了很多天搜索解决方案。但是无法使用内存有限的Base64。如果您以编程方式克服在向服务器发送post请求时出现的OOM错误。实际上是Pax,我拥有的视频是DRM视频,其中2^21字节被加密,我必须借助SHA-512哈希密钥生成对其进行解密,并用生成的哈希替换2^21字节。这就是为什么我必须得到same@Sanat,没关系,我只是怀疑是否需要打印出来。这就是你的问题所在,事实上你正在为不必要的
println
.Thanx-Pax构建一个庞大的字符串,以获得有价值的答案