传送文件后,文件损坏的有关问题

传送文件后,文件损坏的问题
    我是一名java新手,也是第一次来****网站提问,可能这次提问在错误的地方提问题,如果真的是这样,请各位多多体谅~~
    最近在做一个聊天室的小应用。TCP协议,C/S结构,基本聊天功能已经完成,但做到传送文件的时候,出现了一个奇怪的现象,就是传送.text文档的时候,文件内容是没有缺少的,但是如果传送图片或者.doc文件,图片打不开,提示损坏;而.doc文件打开后是乱码,发送前的文件大小也小了,初步推断是发送过程少了某些字节或者文件损坏。
    之后说一下我的传送方法,我在客户端的写法是:
FileInputStream fis = new  FileInputStream("文件地址");//先打开文件流
byte[] b = new byte[3];
String rus = "";
for(;;){
int i = fis.read(b);
if(i==-1) break;
rus = rus + new String(b,0,i);//以字节的方式读出来后,强制转换,放进String类型的rus里。
}
fis.close();  //关
以上我就得到了文件的内容的String,而我是利用String传送到服务端,
PrintWriter pw = new PrintWriter(new OutputStreamWriter(so.getOutputStream()));
pw.println(rus);
pw.flush();
传送方式就是这样了。接下来说一下服务器接收方面的,
简单一点,就是:
BufferedReader br = new BufferedReader(new InputStreamReader(so.getInputStream()));
br.read();//以read的方式无限循环,直到读完为止。这种方式只能读取char类型,所以读出来的东西,我也强制转换为String类型
这样,服务端也收到了文件的String类型的文件数据。再按照服务端接收方式一样,在服务端把String类型的文件数据发送给目标聊天者,目标聊天者按接收后,接收全部的String类型的文件数据,之后强制转换的byte类型,再用下列方法生产文件
FileOutputStream fos = new FileOutputStream("文件地址+文件名");
fos.write(byte类型的文件数据);
就这样,文件生成了,只有.txt文件生成成功,其他都损坏。

总结一下文件数据的转坏:客户端的文件->转为byte类型文件数据->强制转为为String类型文件数据(为了发送)->被br.read()方法读取后生成Char文件数据(数据去到服务端)->强制转换为String类型的文件数据(为了发送)->发送给客户端,客户端以br.read()方法读取后生成Char文件数据(数据去到客户端)->强制转换为byte类型的数据文件,之后生成文件


好了,终于可以问问题了:
1:是不是强制转换的次数太多,让文件内容损坏了?
2:该不该用PrintWriter pw = new PrintWriter(new OutputStreamWriter(so.getOutputStream()));
和BufferedReader br = new BufferedReader(new InputStreamReader(so.getInputStream()));
这种方式去传送和接收文件?我用这种方式,其实是为了方便我聊天室的接收发送数据。不知道是否适合传送文件。
3:传送文件,是否有更好的方法?求举例

新手求各位大神指导~~~~感谢啦~~~~

------解决方案--------------------
建议使用字节流
------解决方案--------------------
字符串是有编码格式的,给定一组字节数组,那么就会按指定的编码格式(没有就是默认的系统编码)编码;比如是中文操作系统,可能就是GBK,那么读取字节数组的时候,根据该编码格式转义成字符,如果该字节就会被变成问号或者烫什么的乱码。楼主可以做这样一个实验,new String(new String("12图片".getBytes("UTF-8"), "GBK").getBytes("GBK"),"UTF-8"); 出现还是乱码。这个例子的意思是字节数组被编码之后,如果认不出来会改动原来的字节然后变成问号或者其他符号,不可逆了(ISO-8859-1除外,所以tomcat会先用这个编码一下)。说到这里楼主应该明白了吧,字符(串)是用来显示的,认不出它会乱来,因为它必须要显示! 所以转了一下之后,字节文件以及被玩坏了。

此外,再向楼主诚恳地提几个建议
线程安全注意了吗
聊天内容是存入数据库的吗?  频繁地读写还可以优化吗?  弄个Redis什么做个缓存
聊天可以发这样的传送文件后,文件损坏的有关问题的表情吗,或者抖动窗口?


我以前也写过这样同学称之为”约炮网站“的东西~~~~wish you better sincerely

------解决方案--------------------


FileReader fr = new FileReader("C:\\\error.txt");
BufferedReader br = new BufferedReader(fr);
String str="":
while((readStr = br.readLine())!=null){
str +=readStr ;
}//换一种试试

------解决方案--------------------
不要面向字符编程,要面向字节流编程。
文本数据,里面存在编码格式的问题。
同样,图片数据也存在编码问题,但是,两者的编码格式,是完全不相同的。
你不能用处理文本的方式(文本解码)来处理图片信息。
所以,干脆不要解码操作,直接传送二进制数据到对方就可以了。
不要关心里面到底是什么数据,传输层的代码,只管传输就可以了。
------解决方案--------------------
传文件直接用字节流,保证没问题!