我用的socket来写的 
传文本文件能打开且大小都没改变 
word文档则出现乱码,而且一页传过去的乱码能有30多页
传图片文件大小没变,打开没有图片 
传视频文件,大小变了,每次都少的大小都一样,打开播放器报错 
下面是部分代码
客户端 
path为上传文件的名字,运行此代码时经得到点击的文件             Socket clientSocket = new Socket(InetAddress.getByName("192.168.18.4"),7999);
            System.out.println(path);
            
            OutputStream os = clientSocket.getOutputStream();
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
            
            File file = new File(path);
            FileReader fr = new FileReader(file);
            BufferedReader br = new BufferedReader(fr);
            char [] buffer = new char[1024]; 
            while(br.read(buffer) > 0){
                bw.write(String.copyValueOf(buffer).trim());
                System.out.println(String.copyValueOf(buffer).trim());
                buffer = new char[1024];
                bw.flush();
            }
            System.out.println(br.read(buffer));
            System.out.println(String.copyValueOf(buffer));
            br.close();
            fr.close();
            bw.close();
            os.close();
            clientSocket.close();
服务器端 
接受到客户端socket直接跳到这个线程,file为我存文件的位置和名称,由于文件不能重复,所以用上传日期为文件名import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.Date;
public class SocketRecvThread extends Thread {    Socket socket;
    public SocketRecvThread(Socket s){
        this.socket = s;
    }
    public void run() {
        InputStream is;
        File file = new File("E:\\apache-tomcat-5.5.27\\webapps\\my_graduation\\upload\\video\\"
                + Long.toString(new Date().getTime()) + ".doc");
        FileWriter fw = null;
        BufferedWriter bw = null;
        try {
            fw = new FileWriter(file);
            bw = new BufferedWriter(fw);
        }catch (IOException e) {
            e.printStackTrace();
        }
        try {
            is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            char []charbuffer = new char[1024];
            while(br.read(charbuffer) > 0){
                bw.write(String.copyValueOf(charbuffer).trim());
                charbuffer = new char[1024];
                bw.flush();
            }
            bw.close();
            fw.close();
            br.close();
            is.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}请大家帮忙看看  谢谢 指点指点 

解决方案 »

  1.   

    2进制文件不要用writer来写,改用OutputStream
    具体为什么就只能去研究编码方式了。因为writer把所有的东西都当成字符序列来写,java中就是所谓的unicode序列。
      

  2.   

    上面说的很明白了,二进制的不能用reader,writer
      

  3.   

    不是每种文件都能用reader、writer读写滴
      

  4.   

    图片文件还是用字节流InputStream来读吧。
      

  5.   

    用字节流吧  FileInputStream/FileOutputStream