A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 gerenvip 于 2013-5-6 19:03 编辑
  1. 为什么使用PrintWriter,上传的文本文件中汉字乱码,图片失效。换成OutputStream就好了??

  2. import java.io.*;
  3. import java.io.BufferedReader;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.io.InputStreamReader;
  9. import java.io.PrintWriter;
  10. import java.net.ServerSocket;
  11. import java.net.Socket;
  12. import java.net.UnknownHostException;

  13. /**
  14. * 第9题:使用TCP协议写一个可以上传文件的服务器和客户端。
  15. * @author
  16. *//*
  17. 思路:
  18.         1.写一个客户端,用于读取文件信息
  19.         2.写一个服务器,用于接收上传的文件
  20.         3.保证服务器和客户端相互通讯
  21. 步骤:
  22. 客户端:
  23.         1.创建socket服务,并指定要连接的主机和端口
  24.         2.客户端读取文件数据,并写到输出流
  25.         3.关闭客户端输出流
  26.         4.读取服务器返回信息
  27. 服务器:
  28.         1.创建ServerSocket服务,并设置指定端口
  29.         2.读取输入流,存储上传的文件数据
  30.         3.给客户端反馈信息
  31.         *
  32.         */
  33. //客户端
  34. class Client{
  35.         public static void main(String[] args){
  36.                 //创建服务
  37.                 Socket s=null;
  38.                 BufferedInputStream bufis = null;
  39.                 BufferedOutputStream out = null;
  40.                 //通过主函数传递上载文件的路径
  41.                 String srcPath=args[0];
  42.                 try {
  43.                         s = new Socket("192.168.1.102",9090);                                                
  44.                         //因为要上传的文件类型不确定,所以使用字节流
  45.                         bufis = new BufferedInputStream(new FileInputStream(srcPath));
  46.                         out = new BufferedOutputStream(s.getOutputStream());//为什么使用PrintWriter,上传的文本文件中汉字乱码,图片失效。换成OutputStream就好了??
  47.           int by =0;
  48.                         while((by=bufis.read())!=-1){
  49.                                 out.write(by);
  50.                         }
  51.                         out.flush();
  52.                 } catch (UnknownHostException e) {
  53.                         e.printStackTrace();
  54.                 } catch (FileNotFoundException e) {
  55.                         e.printStackTrace();
  56.                 } catch (IOException e) {
  57.                         e.printStackTrace();
  58.                 }
  59.                 finally
  60.                 {
  61.                         try {
  62.                                 if(s!=null)
  63.                                         s.shutdownOutput();//关闭客户端的输出流。相当于给流中加一个结束标记-1                                
  64.                         } catch (IOException e) {
  65.                                 e.printStackTrace();
  66.                         }
  67.                 }        
  68.                 //读取服务器返回的数据信息
  69.                 BufferedReader bufIn=null;
  70.                 try {
  71.                         bufIn = null;
  72.                         bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
  73.                         String str = bufIn.readLine();
  74.                         System.out.println(str);
  75.                 } catch (IOException e) {
  76.                         e.printStackTrace();
  77.                 }
  78.                 finally{
  79.                         try {
  80.                                 if(bufis!= null)
  81.                                         bufis.close();                                
  82.                         } catch (IOException e) {
  83.                                 e.printStackTrace();
  84.                         }
  85.                         try {
  86.                                 if(s!=null)
  87.                                         s.close();                                
  88.                         } catch (IOException e) {
  89.                                 e.printStackTrace();
  90.                         }
  91.                 }                                
  92.         }
  93. }
  94. //服务端
  95. class Server{
  96.         public static void main(String[] args) throws Exception{
  97.                 String destPath=args[0];               
  98.                 ServerSocket ss = new ServerSocket(9090);
  99.                 Socket s = ss.accept();
  100.                 //获取客户端的主机地址
  101.                 String ip = s.getInetAddress().getHostAddress();
  102.                 System.out.println(ip+"...connected");
  103.                
  104.                 //创建读取流,用于读取上载的文件信息
  105.                 BufferedInputStream bufIn = null;
  106.                 BufferedOutputStream out = null;
  107.                 //字节输入流
  108.                 bufIn = new BufferedInputStream(s.getInputStream());
  109.                 //指定上载文件的存放路径
  110.                 out= new BufferedOutputStream(new FileOutputStream(destPath));//为什么使用PrintWriter,上传的文本文件中汉字乱码,图片失效。换成OutputStream就好了??
  111.   
  112.          int by = 0;
  113.                 while((by=bufIn.read())!=-1){
  114.                         out.write(by);                        
  115.                 }
  116.                 //out.flush();
  117.                
  118.                 //给客户端返回信息
  119.                 PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
  120.                 pw.println("上传成功");
  121.                 out.close();
  122.                 s.close();
  123.                 ss.close();               
  124.         }
  125. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

6 个回复

倒序浏览
大概看了下源码。我的理解是这样的,
PrintWriter是writer结尾的字符流,一般用于处理文本类文件的复制。如果用来复制媒体文件,可以复制成功,但是因为编码问题,不一定可以看或者听,比如图片或者mp3.
而outputStream是字节流类,专门用于处理媒体文件。


希望可以帮助到你。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
PrintWriter 是Writer的子类,属于字符流。此类只处理纯文本文件,字节码文件是处理不了的。
OutputStream是Stream的子类,属于字节流,一般处理字节码(二进制)文件。
图片肯定不是文本文件吧,它是字节码文件,你用字符流,它处理出来的数据通过编码表翻译过来肯定是乱码咯

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
xuluheng718 发表于 2013-5-5 12:26
PrintWriter 是Writer的子类,属于字符流。此类只处理纯文本文件,字节码文件是处理不了的。
OutputStream ...

PrintWriter是可以接受字节流的,另外,按照你说的,使用PrintWriter处理字符应该没问题吧?那为什么我处理文本也乱码呢?

点评

首先,你用的服务器系统软件的编码表是哪种的,假如你说的处理文本文件都出问题,那就要看你服务器的编码表和你自己机器的编码表是不是一样  发表于 2013-5-5 15:42
回复 使用道具 举报
我自己的理解,不是因为PrintWriter只能处理字符流的原因,应该是需要配套使用,我读用的是Inputstream,属于字节流,而写用了PrintWriter,应该不配套,
我试验了一下,当我读用FileReader的时候,写用printWriter没问题,不知道对与不对

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
gerenvip 发表于 2013-5-5 15:04
我自己的理解,不是因为PrintWriter只能处理字符流的原因,应该是需要配套使用,我读用的是Inputstream,属 ...

字符流是处理文本文件的,用字节流处理文本文件一样可以,但是字符流为什么能处理字符是因为它根据了编码表把你要处理的字符经过编码存入文件中,而字节流它里面只写入或读取文件里面的原始字节,它并没有使用编码处理,所以假如你处理文本文件时候用字符流,他是可以在编码表里面找到相对应的编码进行写入和读取的,
,而字节码文件本身里面的数据没有经过编码表处理过的数据,你用字符流进行处理,它根据读取的数据在编码表里面找相对应字符,结果肯定就是乱码或者其它不符合你文件的数据咯
回复 使用道具 举报
本帖最后由 xuluheng718 于 2013-5-5 15:49 编辑
gerenvip 发表于 2013-5-5 15:04
我自己的理解,不是因为PrintWriter只能处理字符流的原因,应该是需要配套使用,我读用的是Inputstream,属 ...

这是没错的,PrintWriter本身就是字符流,他是处理经过编码后的文件,而字节流只处理原始文件,一个是处理原始文件,一个是处理编码后的文件,结果肯定会出问题
要么两个都用字节流或字符流,要么经过转换流进行处理
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马