传送文件后,文件损坏的问题
纯光驿站 2014-05-02 03:37:07 我是一名java新手,也是第一次来CSDN网站提问,可能这次提问在错误的地方提问题,如果真的是这样,请各位多多体谅~~
最近在做一个聊天室的小应用。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:传送文件,是否有更好的方法?求举例
新手求各位大神指导~~~~感谢啦~~~~