今天写的文件传输,但是只能是部分传,在传输的最后总有部分数据丢失,导致文件损坏,各位大虾帮忙看看啊
谢先Server端:
Thread t=new Thread(new Runnable(){ //使用线程,防止阻塞
    public void run(){
    try{ 
    jTextField4.setText("开始发送文件!");//标记
    String temp;
    PrintWriter putout;
    BufferedReader in=new BufferedReader(new InputStreamReader(new FileInputStream(file)));
    temp=in.readLine().trim(); //从bufferReader中按行读取
    putout=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
    while(temp!=null)
    {
        putout.println(temp);
        temp=in.readLine().trim();//写入printWriter
     }
        jTextField4.setText("文件发送完毕!");
    
    }catch(IOException e)
    {
        System.out.println(e);
    }
    }
    });
    t.start();    Client端 
    File file=new File(s);  //从指定路径创建文件
    try{
    if(!file.exists())
    {
       file.createNewFile();
    }
    PrintWriter out =new PrintWriter(
            new BufferedWriter(
              new OutputStreamWriter(
                 new FileOutputStream(file))),true);
    String temp;         temp=in.readLine().trim();
         jTextField4.setText("正在接收文件...");
         while(temp!=null)
         {
            out.print(temp);
            out.flush();
            temp=in.readLine().trim();
         }         jTextField4.setText("文件接收完毕!");
  
    }catch(IOException e)
    {
        System.out.println(e);
    }请大家帮忙看下这个程序出什么问题了呀··谢谢~~非常之谢谢

解决方案 »

  1.   

    把PrintWriter改成PrintStream试一试
    把代码发给我.我也来调一调
    [email protected]
      

  2.   

    temp=in.readLine().trim();   
    没有循环处理语句,只能读取文件的一行内容,所以文件发送不完整。
      

  3.   

    如果是发送文件,为了安全起见,建议直接用InputStream进行byte级别的处理,不要用reader和writer进行字符级别的。
      

  4.   

    服务端的PrintWriter在发送完数据后没有清空缓存,最后肯定有部分数据被留在缓存中。
    楼主可以用你上面的代码试着发一些很小的文件,例如只有几个字符的txt,你会发现客户端怎么都收不到,这是因为缓冲区在写满了之后才会网客户端发送,缓冲区一直不满,服务器又不主动清空缓冲区,就是这种结果。解决:
    方法一:PrintWriter有一个构造方法,可以设置是否自动刷新缓冲区,查api
    方法而:发送后主动调用flush()刷新缓冲区
      

  5.   

    使用byte传送,传送开始时告诉接收端有多少字节,等接受到这么多字节后就停止,这样就可以保证文件的完整。很久以前我也遇到了这样的问题,搞了很长时间。