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

纯光驿站 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:传送文件,是否有更好的方法?求举例

新手求各位大神指导~~~~感谢啦~~~~
...全文
1260 18 打赏 收藏 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
纯光驿站 2014-05-17
  • 打赏
  • 举报
回复
这个我觉得可以结贴了。我这边也算是完成了一个基本的聊天程序。我最后发现,传送文件,还是用两个端口好一点,这样跟聊天的那个端口就不会有冲突。 另外, 读文件用的流是:DataInputStream disfile = new DataInputStream(new FileInputStream(file)); 而传送文件的字节用的是对象流:DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); 接收也是用的是对象流:DataInputStream dis = new DataInputStream(socket.getInputStream()); 写文件用的流是:DataOutputStream out = new DataOutputStream(new FileOutputStream(file)); 还有,貌似是因为TCP是单传输的,每次真的保证只有一条信息发给服务器,一条信息返回。如果同一个客户端的端口进行多条信息,小心无法识别啊。所以传文件和聊天我分开两个端口来做了。 最后,谢谢大家的各种帮忙和关注 结贴咯!
纯光驿站 2014-05-07
  • 打赏
  • 举报
回复
回复16楼: 嗯嗯,好的,正在看。 顺便问一下大家,你们如果做接收文件,是否会开另外一个socket端口和线程?
食得落 2014-05-07
  • 打赏
  • 举报
回复
请通通用type传和接受,你看一下buffereader,printwrite的API就明白了
cwhow 2014-05-07
  • 打赏
  • 举报
回复
關注中,還不會用TCP傳文件。
纯光驿站 2014-05-07
  • 打赏
  • 举报
回复
回复11楼: 用得是TCP,传文件防丢包,安全可靠啦
纯光驿站 2014-05-07
  • 打赏
  • 举报
回复
回复9楼: 嗯,现在我是针对传送字节方面思考了。
纯光驿站 2014-05-07
  • 打赏
  • 举报
回复
回复5楼: 面向字节,这一点我现在清楚了。 不过传送字节,就得用传送直接的write()和接收字节的read() 不过现在有一个问题困扰着我,能有上面这些方法的,现在只是找到对象流 如:ObjectInputStream ois=new ObjectInputStream(so.getInputStream()); 这个流的read()方法可以读取字节; 而另外一张BufferedReader br = new BufferedReader(new InputStreamReader(so.getInputStream())); 这种流,不能read方法不能接收字节,只能收字符。 综上,我是用BufferedReader 传送聊天信息,用ObjectInputStream 传送文件,但现在的进度是,又是成功,有时失败,完全搞不懂为什么。
食得落 2014-05-07
  • 打赏
  • 举报
回复
请问用的udp还是tcp
纯光驿站 2014-05-07
  • 打赏
  • 举报
回复
居然一个用户不能连续回复3条以上,所以回复不了3楼一下的,现在补上去: 回复4楼: 现在我用的是这种流读取文件: DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(file))); 感觉可以,读取成功。你的我也会作为一种参考啦,谢谢您的帮忙啦
wangzhidavl 2014-05-07
  • 打赏
  • 举报
回复
传文件直接用字节流,保证没问题!
兄怀娇妻 2014-05-07
  • 打赏
  • 举报
回复
额。新手都这么厉害了
纯光驿站 2014-05-06
  • 打赏
  • 举报
回复
回复3楼: 经过您这样一说,我立刻去尝试了, 代码如下: System.out.println("实验转码:"+new String(new String("12图片".getBytes("UTF-8"), "GBK").getBytes("GBK"),"UTF-8")); 结果如下: 实验转码:12图片 上面不是吐槽啊, 虽然没有出现乱码,但是我还是能理解您你想表达的是什么意思,这样也的确说得通为什么.txt没问题,而.doc和.png出问题。 之后,关于您后面的问题,我真心是初学者,所以,现在只是在做传送文件,关于线性安全这些,真心还没有想过= = 不过,你给的意见对我的确很大作用,非常感谢!
纯光驿站 2014-05-06
  • 打赏
  • 举报
回复
刚才发错了,上一条是回复1楼。 好,现在到2楼了, 回复2楼: 我现在正在尝试这个,谢谢您的回复和关注。
纯光驿站 2014-05-06
  • 打赏
  • 举报
回复
回复2楼: 不好意思,我理解不了你的话,抱歉。不过也谢谢您看完我这么一大堆话,感谢啦!
冰思雨 2014-05-05
  • 打赏
  • 举报
回复
不要面向字符编程,要面向字节流编程。 文本数据,里面存在编码格式的问题。 同样,图片数据也存在编码问题,但是,两者的编码格式,是完全不相同的。 你不能用处理文本的方式(文本解码)来处理图片信息。 所以,干脆不要解码操作,直接传送二进制数据到对方就可以了。 不要关心里面到底是什么数据,传输层的代码,只管传输就可以了。
中华雪碧 2014-05-04
  • 打赏
  • 举报
回复


FileReader fr = new FileReader("C:\\\error.txt");
		BufferedReader br = new BufferedReader(fr);
String str="":
		while((readStr = br.readLine())!=null){
			str +=readStr ;
		}//换一种试试
yuhouqingchen_2648 2014-05-03
  • 打赏
  • 举报
回复
建议使用字节流
卖水果的net 2014-05-03
  • 打赏
  • 举报
回复
我是初学者,简单的提示一下:是不是要设置一下 bi n 格式 ,就类似通过 FTP 传文件一样。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧