Java 在android中创建大文件块时发生OutOfMemory错误

Java 在android中创建大文件块时发生OutOfMemory错误,java,android,Java,Android,我正在尝试读取文件并将其上载到具有1MB块大小的服务器。它可以正常工作,高达13MB,但在这之后,它给我OutOfMemory异常。我检查了缓冲区,它总是1MB大小,但我不知道为什么它会出现异常。我预测系统不会立即释放以前读取的字节,所以我试图找到一些方法来释放它,但没有任何方法可以释放字节[] ByteArrayOutputStream byteBuffer = null; try { byteBuffer = new ByteArray

我正在尝试读取文件并将其上载到具有1MB块大小的服务器。它可以正常工作,高达13MB,但在这之后,它给我OutOfMemory异常。我检查了缓冲区,它总是1MB大小,但我不知道为什么它会出现异常。我预测系统不会立即释放以前读取的字节,所以我试图找到一些方法来释放它,但没有任何方法可以释放字节[]

ByteArrayOutputStream byteBuffer = null;
            try {
                byteBuffer = new ByteArrayOutputStream();
                byte[] buffer = new byte[maxchunksize];
                int len = 0;
                int startpoint = 0;
                while ((len = is.read(buffer)) != -1) {
                    Log.i("Upload Chunk",""+buffer.length);
                    byteBuffer.write(buffer, 0, len);
                    String uploadresponse = UploadChunk(fileHandle, buffer, startpoint, EmailID);
                    if(!uploadresponse.equals("Chunk Added"))
                    {
                        Log.e("Upload Chunk", "something went wrong. Aborting upload");
                        break;
                    }
                    startpoint += buffer.length; 

                }
有人能帮我解决这个问题吗?我的文件最大大小是25MB

这是我得到的一个例外

06-26 22:49:22.329: E/AndroidRuntime(15645): java.lang.OutOfMemoryError
06-26 22:49:22.329: E/AndroidRuntime(15645):    at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:91)
06-26 22:49:22.329: E/AndroidRuntime(15645):    at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:201)
06-26 22:49:22.329: E/AndroidRuntime(15645):    at com.desiengineer.backgroundtask.EvidenceUploadService.onHandleIntent(EvidenceUploadService.java:101)
06-26 22:49:22.329: E/AndroidRuntime(15645):    at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
06-26 22:49:22.329: E/AndroidRuntime(15645):    at android.os.Handler.dispatchMessage(Handler.java:99)
06-26 22:49:22.329: E/AndroidRuntime(15645):    at android.os.Looper.loop(Looper.java:137)
06-26 22:49:22.329: E/AndroidRuntime(15645):    at android.os.HandlerThread.run(HandlerThread.java:60)

您必须将代码更改为:

while ((len = is.read(buffer)) != -1) {
    Log.i("Upload Chunk",""+buffer.length);
    byteBuffer.write(buffer, 0, len);
    String uploadresponse = UploadChunk(fileHandle, buffer, startpoint, EmailID);
    if(!uploadresponse.equals("Chunk Added"))
    {
        Log.e("Upload Chunk", "something went wrong. Aborting upload");
        break;
    }
    startpoint += buffer.length; 
    byteBuffer.reset(); 
}

如果没有byteBuffer.reset(),您的缓冲区仍在扩展,并导致OutOfMemoryException。

删除
ByteArrayOutputStream
。你没有使用它,这是你内存问题的根源。

你是在UI线程上做的吗?不,是在IntentService上。我猜你是在
OnHandleContent
中弹出由
InternetService
创建的当前线程的堆栈内存(注意这里:
06-26 22:49:22.329:E/AndroidRuntime(15645):在java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:201)
)。尝试调试以测试缓冲区逻辑是否正确。byteBuffer的用途是什么?这会导致内存不足…无法在缓冲区中写入数据块。有没有其他方法我可以用。我在互联网上看到了这个代码示例。如果你知道更好的方法,请发布代码。我的缓冲区工作得很好。我犯的错误是在我不使用它的时候,通过tearrayoutputstream增加
。啊!我以为ByteArrayOutputStream出现在那里是有原因的,可能与代码的其他部分有关。谢谢你的回答,但我在你发布答案时发现了它。;)谢谢。