我想通过java中的套接字传输文件..实际上,我已经能够传输..但是有一个问题发生..问题是文件发送的是缩小的..例如,我传送300MB的文件,客户端将只接收299mb ....我想知道可能是什么问题..通过Java中的套接字传输文件
服务器端
File myFile = new File (basePath+"\\"+input.readUTF());
byte [] mybytearray = new byte [1024];
FileInputStream fis = new FileInputStream(myFile);
BufferedInputStream bis = new BufferedInputStream(fis);
txtArea.append("Sending... \n");
while (true)
{
int i = bis.read(mybytearray, 0, mybytearray.length);
if (i == -1) {
break;
}
output.write(mybytearray, 0, i);
txtArea.append("Sending chunk " + i + "\n");
}
output.flush();
客户端
output.writeUTF("get");
txtArea.append("Starting to recive file... \n");
long start = System.currentTimeMillis();
byte [] mybytearray = new byte [1024];
txtArea.append("Connecting... \n");
output.writeUTF(remoteSelection);
FileOutputStream fos = new FileOutputStream(basePath+"\\"+remoteSelection);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int bytesRead = input.read(mybytearray, 0, mybytearray.length);
while(bytesRead != -1)
{
bos.write(mybytearray, 0, bytesRead);
txtArea.append("got chunk" + bytesRead +"\n");
bytesRead = input.read(mybytearray, 0, mybytearray.length);
}
bos.flush();
您需要在写入之前检查-1,而不是之后。您也正在以Javadoc中特别警告的方式滥用available();你假设文件大小适合int;等等等等 – EJP
加上EJP指出的,你也在BufferedInputStream上检查可用,我猜它最多只返回底层输入流的缓冲区长度。 – dragon66
那么如何检查文件的大小?我尝试使用byte [] mybytearray = new byte [(int)myFile.length()];但是它返回一个错误..当我尝试发送一个大文件时,它是堆外面..如600mb .. –