android - InputStream.read() 在读取文件时挂起

标签 android sockets inputstream fileinputstream

在我的应用程序中,我使用套接字从客户端发送文件。另一方面,另一个客户端使用 InputStream 接收文件,然后 bufferedOutputStream 将文件保存在系统中。

我不知道为什么,文件没有完全传输。我认为这是因为网络过载,无论如何,我不知道如何解决。

发射器是:

Log.d(TAG,"Reading...");
                bufferedInputStream.read(byteArrayFile, 0, byteArrayFile.length);
                Log.d(TAG, "Sending...");
                bufferedOutputStream.write(byteArrayFile,0,byteArrayFile.length);

bufferedOutputStream.flush();

接收者是:

 bufferedOutputStream=new BufferedOutputStream(new FileOutputStream(file));
                            byteArray=new byte[fileSize];

                            int currentOffset = 0;

                            bytesReaded = bufferedInputStream.read(byteArray,0,byteArray.length);
                            currentOffset=bytesReaded;

                            do {
                                bytesReaded = bufferedInputStream.read(byteArray, currentOffset, (byteArray.length-currentOffset));
                                if(bytesReaded >= 0){ currentOffset += bytesLeidos;
                               }
                            } while(bytesReaded > -1 && currentOffset!=fileSize);


                            bufferedOutputStream.write(byteArray,0,currentOffset);

最佳答案

您没有说明 filesize 的来源,但是这段代码存在很多问题。不胜枚举。扔掉它并使用 DataInputStream.readFully()。或者使用以下复制循环,它不需要文件大小的缓冲区,这是一种不缩放的技术,假定文件大小适合 int,并增加延迟:

byte[] buffer = new byte[8192];
int count;
while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}

在两端使用它。如果您通过同一个连接发送多个文件,它会变得更加复杂,但您没有说明这一点。

关于android - InputStream.read() 在读取文件时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36821795/

相关文章:

android - 如何将膨胀的自定义 View 与工具栏中的其余菜单项对齐

php - PHP套接字create_socket block

java - Jena:使用输入流读取模型

java - 用java修改xml版本

android - 如何知道图库小部件何时停止滚动?

android - 创建密码选项 - android

node.js - 多个监听器和removeListener删除所有Socket.io

sockets - 在bind9上安装pihole

string - 在 Scala 中将输入流转换为字符串的惯用方法

android - 访问第二个项目的 "Remote config"