2017-02-10 29 views
0

我有以下代码上传文件从客户端到服务器TCP,但是当我尝试打开手动文件是空的为什么好的重量.. 我看了很多帖子stackOverflow但没有任何改变 THX (对不起我的英文不好)
服务器:BufferedOuputStream使空白文件

ThreadServer扩展公共Thread类{

private Socket soc; 
private FileOutputStream fos; 
private BufferedOutputStream bos; 
private InputStream in; 

public ThreadServer (Socket soc) { 
    this.soc = soc; 
} 

public void run(){ 
    try { 
     fos = new FileOutputStream("C:/Users/erwan/workspace/Word/server/text.txt"); 
    } catch (FileNotFoundException e1) { 
     e1.printStackTrace(); 
    } 
    bos = new BufferedOutputStream(fos); 
    byte[] buffer = new byte[1024]; 
    try { 
     in = soc.getInputStream(); 
     int count = 0; 
     while((count= in.read(buffer, 0 , buffer.length)) != -1) { 
      System.out.println(count+" octets received...");     
      bos.write(buffer); 
     } 
     bos.flush(); 
     bos.close(); 
     in.close(); 
     soc.close(); 
     System.out.println("File sent succesfully!"); 
    }catch(IOException e){ 
     e.printStackTrace(); 
     System.out.println("Une erreur est survenu"); 
    } 
} 

}

客户端:

public class Client { 
private static Socket as; 
private static FileInputStream fis; 
private static BufferedInputStream bis; 
private static OutputStream out; 
public static void main(String[] args){ 
    as = null; 
    try{ 
     as = new Socket(InetAddress.getLocalHost(),4020); 

     File f = new File (args[0]); 
     byte [] buffer = new byte [(int) f.length()]; 
     fis = new FileInputStream(f); 
     setBis(new BufferedInputStream(fis)); 
     out = as.getOutputStream(); 
     System.out.println("uploading..."); 
     out.write(buffer,0,buffer.length); 
     out.flush(); 
     out.close(); 
     System.out.println("the file is uploaded."); 
     as.close(); 
    }catch(IOException e){ 
     e.printStackTrace(); 
    } 

}

回答

0

在客户机缓冲似乎不与数据填充。它被初始化为具有文件长度的字节数组,但是在输入流上没有读取方法调用。为了测试fis.read(缓冲区),可能会很快将一些数据存入缓冲区。请记住,读取不能保证填充整个缓冲区。特别是如果你的文件包含零,那么缺乏将实际数据读入(客户端的)缓冲区是可能的罪魁祸首。

除此之外,服务器代码还假定read方法完全填充缓冲区,所以write方法调用应指定长度(count)。所以把bos.write(buffer)改成bos.write(bos,0,count)。这可能会在文件末尾变得很明显(如果文件长度超过1024个字节),因为文件末尾将成为前一个块中某些数据的重复。

+0

我真的不明白为什么fis.read(buffer,0,buffer.lenght)解决了这个问题,但真的非常感谢你回答:)如果你能再次解释我的dos是如何工作的? thx –

+0

是的。这并不复杂。你做了一个新的字节[(int)f.length()]。所做的是分配一个存储区域来存储f.length()字节。它不会将任何数据放入这些内存字节中。在大多数情况下,数组将被jvm初始化为0个字节(二进制零,因此经常在编辑器中显示为奇怪的字符)。为了将您的输入文件中的数据动态地放入新创建的数组中,您需要执行fis.read。 –