Android:java.lang.OutOfMemoryError:无法分配360318346字节的内存,当前剩余5802592字节和87MB可用直到OOM。

3
我正在处理服务器到客户端文件传输的示例。当我尝试传输大文件时(例如,我有一个500MB的视频文件),它会显示错误Android:java.lang.OutOfMemoryError,无法分配360318346字节的内存空间,只有5802592自由字节和87MB直到OOM。请帮助我解决这个错误。
服务器端的一些代码:
 public class FileTxThread extends Thread {
    Socket socket;
    FileTxThread(Socket socket){
        this.socket= socket;
    }

    @Override
    public void run() {
        File file = new File(Environment.getExternalStorageDirectory(),"RAHASYA.mp4");


        byte[] bytes = new byte[(int) file.length()];


        BufferedInputStream bis;
        try {
            bis = new BufferedInputStream(new FileInputStream(file));
            bis.read(bytes, 0, bytes.length);
            OutputStream os = socket.getOutputStream();
            os.write(bytes, 0, bytes.length);
            os.flush();
           // socket.close();

            final String sentMsg = "File sent to: " + socket.getInetAddress();

            MainActivity.this.runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    Toast.makeText(MainActivity.this,sentMsg,Toast.LENGTH_LONG).show();

                }});

客户端的一些代码

private class ClientRxThread extends Thread {
    String dstAddress;
    int dstPort;

    ClientRxThread(String address, int port) {
        dstAddress = address;
        dstPort = port;
    }

    @Override
    public void run() {
        Socket socket = null;

        try {
            socket = new Socket(dstAddress, dstPort);

            out.println("Sockt "+socket.getInetAddress());

            File file = new File(Environment.getExternalStorageDirectory(),"RAHASYA.mp4");


            byte[] bytes = new byte[1024];


            InputStream is = socket.getInputStream();
         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
            while (true) {
                int bytesRead = is.read(bytes);
                if (bytesRead < 0) break;
                bos.write(bytes, 0, bytesRead);
                // Now it loops around to read some more.
            }
            bos.close();


            MainActivity.this.runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    Toast.makeText(MainActivity.this,"Finished",Toast.LENGTH_LONG).show();
                }});
2个回答

2

你在服务器端的字节数组太大了,将其改小并尝试?
供参考:

  File file = new File(Environment.getExternalStorageDirectory(),"RAHASYA.mp4");
    byte[] bytes = new byte[2048];
    BufferedInputStream bis;
    try {
        bis = new BufferedInputStream(new FileInputStream(file));
        OutputStream os = socket.getOutputStream();
        int read = bis.read(bytes, 0, bytes.length);
        while (read!=-1){
            os.write(bytes, 0, read);
            os.flush();
            read = bis.read(bytes, 0, bytes.length);
        }

        //...and so on

如何修改。我是初学者,我在哪里改变我的服务器端代码感到困惑,请帮助我。谢谢! - undefined
将此代码更改为:byte[] bytes = new byte[(int) file.length()]; - undefined
请问你能告诉我在这一行中需要添加哪段代码吗?byte[] bytes = new byte[(int) file.length()]。谢谢! - undefined

0
你的问题出在这一行: byte[] bytes = new byte[(int) file.length()]; 你正在创建一个与整个文件大小相等的数组。你需要逐步读取一部分。

是的先生,但请给我一些关于如何以位为单位读取文件的提示,我尝试过了,但由于它无法正常工作,我不知道是否正确或错误,请帮忙。谢谢先生。 - undefined
在服务器端执行与客户端相同的操作(显然是将读取更改为写入)。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接