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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔政 中级黑马   /  2012-11-18 21:00  /  1316 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在毕老师的视频中,我们学会了复制文件,但是,文件的后缀名都是起好的。
有的用的是ip地址,有的则是重新起的名字。
我想知道如何获取文件的名字,并且也能同时获取文件的数据。
我自己试了不可行, 有没有高手来解答下

以下是我的代码
  1. class UploadFileClient{
  2.         public static void main(String[] args){
  3.                 try{
  4.                        
  5.                         File file=new File("exercise.txt");
  6.                         if(!(file.exists()||file.isDirectory())){
  7.                                 System.out.println("上传文件不存在或不是文件");
  8.                                 return ;
  9.                         }
  10.                         Socket s=new Socket("192.168.1.3",9000);
  11.                         BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));
  12.                        
  13.                         PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
  14.                         String filename=file.getName();
  15.                         pw.println(filename);
  16.                        
  17.                         BufferedOutputStream bos=new BufferedOutputStream(s.getOutputStream());
  18.                         byte[]buf=new byte[1024];
  19.                         int len=0;
  20.                         while((len=bis.read(buf))!=-1){
  21.                                 bos.write(buf,0,len);
  22.                                 bos.flush();
  23.                         }
  24.                         s.shutdownOutput();//定义结束标记
  25.                         BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
  26.                         String line=br.readLine();
  27.                         System.out.println(line);
  28.                                
  29.                 }catch(Exception e){
  30.                         throw new RuntimeException("客户端上传异常");
  31.                 }
  32.         }
  33. }
  34. class UploadThread implements Runnable{
  35.         private Socket s;
  36.         public UploadThread(Socket s){
  37.                 this.s=s;
  38.         }
  39.         public void run() {
  40.                 String ip=s.getInetAddress().getHostAddress();
  41.                 BufferedInputStream bis=null;
  42.                 FileOutputStream fos=null;
  43.                 BufferedOutputStream bos=null;
  44.                 BufferedReader br=null;
  45.                 PrintWriter pw=null;
  46.                 try{
  47.                        
  48.                         br=new BufferedReader(new InputStreamReader(s.getInputStream()));
  49.                         String filename=br.readLine();
  50.                         fos=new FileOutputStream(new File(ip+filename));
  51.                         bis=new BufferedInputStream(s.getInputStream());
  52.                         int len=0;
  53.                         byte[]buf=new byte[1024];
  54.                         len=bis.read(buf);
  55.                         while((len=bis.read(buf))!=-1){
  56.                                 fos.write(buf,0,len);
  57.                                 fos.flush();
  58.                                 System.out.println(new String(buf,0,len        ));
  59.                         }
  60.                        
  61.                         pw=new PrintWriter(s.getOutputStream(),true);
  62.                         pw.println("文件上传成功!");
  63.                         s.close();
  64.                 }catch(Exception e){
  65.                         throw new RuntimeException("服务器上传文件失败!");
  66.                 }finally{
  67.                         try{
  68.                                 if(bis!=null)
  69.                                         bis.close();
  70.                         }catch(IOException io1){
  71.                                 throw new RuntimeException("服务器读取流关闭失败");
  72.                         }
  73.                        
  74.                         if(pw!=null)
  75.                                 pw.close();
  76.                        
  77.                         try{
  78.                                 if(fos!=null)
  79.                                         fos.close();
  80.                         }catch(IOException io1){
  81.                                 throw new RuntimeException("服务器文件输出流关闭失败");
  82.                         }
  83.                 }
  84.                
  85.         }
  86.        
  87. }
  88. class UploadServer{
  89.         public static void main(String[] args){
  90.                 try{
  91.                         ServerSocket ss=new ServerSocket(9000);
  92.                         Socket s=ss.accept();
  93.                         new Thread(new UploadThread(s)).start();
  94.                 }catch(Exception e){
  95.                         throw new RuntimeException("服务器上传异常");
  96.                 }
  97.         }
  98. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
本帖最后由 曹自祥 于 2012-11-18 22:06 编辑

使用文件类File进行操作:

File file=new File("F:\\a.txt");//file是F盘里文件名为“a.txt”的文件。
File file_1=new File("D:\\"+file.getName);//getName返回的是文件名“a.txt”,而不是绝对路径“F:\\a.txt”
这样file_1就是在D盘里与file同名的文件了。

再把file和file_1封装进数据流里面。
回复 使用道具 举报
标红色的代码你看下,你都已经封装成字符流去读取了,下面的字节流当然读取不出来的,这一点上个人认为是这样的Socket输出的时候可以,但是输入的时候就不行了。
蓝色的代码是我加的,你打印看看。

class UploadThread implements Runnable{
        private Socket s;
        public UploadThread(Socket s){
                this.s=s;
        }
        public void run() {
                String ip=s.getInetAddress().getHostAddress();
                BufferedInputStream bis=null;
                FileOutputStream fos=null;
                BufferedOutputStream bos=null;
                BufferedReader br=null;
                PrintWriter pw=null;
                try{
                        
                        br=new BufferedReader(new InputStreamReader(s.getInputStream()));
                        String filename=br.readLine();
                        String line = null;
                        while((line = br.readLine)!= null){
                           System.out.println(line);
                        }

                        fos=new FileOutputStream(new File(ip+filename));
                        bis=new BufferedInputStream(s.getInputStream());
                        int len=0;
                        byte[]buf=new byte[1024];
                        len=bis.read(buf);
                        while((len=bis.read(buf))!=-1){
                                fos.write(buf,0,len);
                                fos.flush();
                                System.out.println(new String(buf,0,len        ));
                        }
                        
                        pw=new PrintWriter(s.getOutputStream(),true);
                        pw.println("文件上传成功!");
                        s.close();
                }catch(Exception e){
                        throw new RuntimeException("服务器上传文件失败!");
                }finally{
                        try{
                                if(bis!=null)
                                        bis.close();
                        }catch(IOException io1){
                                throw new RuntimeException("服务器读取流关闭失败");
                        }
                        
                        if(pw!=null)
                                pw.close();
                        
                        try{
                                if(fos!=null)
                                        fos.close();
                        }catch(IOException io1){
                                throw new RuntimeException("服务器文件输出流关闭失败");
                        }
                }
               
        }
        
}
回复 使用道具 举报
我给你个建议: 你可以设计一个简单协议。 在文件传输之前发送。

协议用来封装你要在文件传输之前要发送的信息(比如文件名,大小,验证信息等等)。

这样就可以实现网络传输文件。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马