InputStream.read() 在读取文件时挂起
InputStream.read() hangs on reading a file
在我的应用程序中,我使用套接字从客户端发送文件。另一方面,另一个客户端使用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);
}
在两端使用它。如果您通过同一个连接发送多个文件,它会变得更加复杂,但您没有说明。
在我的应用程序中,我使用套接字从客户端发送文件。另一方面,另一个客户端使用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);
}
在两端使用它。如果您通过同一个连接发送多个文件,它会变得更加复杂,但您没有说明。