Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 打印字符串时出现内存不足错误_Java_Android - Fatal编程技术网

Java 打印字符串时出现内存不足错误

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

在通过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/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构建一个庞大的字符串,以获得有价值的答案