2012-05-12 148 views
0

我想通过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(); 
+5

您需要在写入之前检查-1,而不是之后。您也正在以Javadoc中特别警告的方式滥用available();你假设文件大小适合int;等等等等 – EJP

+0

加上EJP指出的,你也在BufferedInputStream上检查可用,我猜它最多只返回底层输入流的缓冲区长度。 – dragon66

+0

那么如何检查文件的大小?我尝试使用byte [] mybytearray = new byte [(int)myFile.length()];但是它返回一个错误..当我尝试发送一个大文件时,它是堆外面..如600mb .. –

回答

2

的在Java中复制流的规范方法如下:

int count; 
byte[] buffer = new byte[8192]; // or whatever you like really, not too small 
while ((count = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, count); 
} 

适用于任何长度输入;不会将整个输入加载到内存中;这样做不会增加延迟。

如果您要发送多个文件,您需要先通过DataOutputStream.writeLong()发送长度;通过反函数在另一端读取它;并在读取完这么多字节后调整读取端的环路条件终止。不像它看起来那么简单;留给读者作为练习。

+0

我该如何检查文件的长度? –

+0

@BobyHartanto Err,'File.length()?' – EJP

+0

感谢您的帮助 –