<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    一個文件的復(fù)制我們大概的思維是通過流來操作,不錯。
    本文也是這樣操作的。
    至于第一種方法是我們一般的操作方式,而第二種方法其實也是一個方式,我們不妨研究一下。
    閑話少說。看程序。

    這個程序我寫的是兩個方法,支持從命令行操作。
    例一:
    package org.stonecn.kernel;
    import java.io.*;
    public class FileCopy {
     /**
      * 測試程序
      */
     public static void main(String[] args){
      if(args.length!=2)
       System.err.println("Usage: java FileCopy<source><destination>");
      else{
       try{
        copy(args[0],args[1]);
       }
       catch(IOException e){
        System.err.println(e.getMessage());
       }
      }
     }
     public static void copy(String from_name,String to_name)throws IOException{
      File from_file=new File(from_name);
      File to_file=new File(to_name);
      if(!from_file.exists())
       abort("no such source file:"+from_name);
      if(!from_file.isFile())
       abort("can't copy directory:"+from_name);
      if(!from_file.canRead())
       abort("source file is unreadable:"+from_name);
      /**
       * 如果目標(biāo)是一個目錄,則使用源文件名作為目標(biāo)文件名
       */
      if(to_file.isDirectory())
       to_file=new File(to_file,from_file.getName());
      /**
       * 如果目標(biāo)文件存在,則確保它是可寫的,并且在覆蓋之前先詢問
       * 如果目標(biāo)文件不存在,則確保存在目錄,而且是可寫的。
       */
                     // 此處支持命令行,如果不用可以注視掉。    sart  
      if(to_file.exists()){
       abort("destination file is unwriteable:"+to_name);
       //詢問是否覆蓋
       System.out.print("Overwrite existing file:"+to_file.getName()+"?(Y/N):");
       //得到用戶響應(yīng)
       System.out.flush();
       BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
       String response=in.readLine();
       //檢查響應(yīng),如果不是yes(未做確認),則終止復(fù)制
       if(!response.equals("Y") && !response.equals("y"))
        abort("existing file was not overwritten.");
      }
      else{
       /**如果文件不存在,檢查是否存在目錄且是否可寫
        * 如果getParent()返回null,則目錄就是當(dāng)前dir,
        * 因此查找user.dir系統(tǒng)特性,以得出它是什么
        */
       String parent=to_file.getParent();  //目標(biāo)目錄
       if(parent == null)
        parent=System.getProperty("user.dir");
       File dir=new File(parent);
       if(!dir.exists())
        abort("destination directory doesn't exist:"+parent);
       if(dir.isFile())
        abort("destination is not a directory:"+parent);
       if(!dir.canWrite())
        abort("destination directory is unwriteable:"+parent);
      }
                      //到此結(jié)束      end 
      /**
       * 如果走到這了,則一切正常。
       * 因此可以復(fù)制文件,一次復(fù)制一個字節(jié)緩沖區(qū)
       */
      FileInputStream from=null;   //從源讀取的流
      FileOutputStream to=null;    //寫至目標(biāo)的流
      try{
       from=new FileInputStream(from_file); //創(chuàng)建輸入流
       to=new FileOutputStream(to_file);    //創(chuàng)建輸出流
       byte[] buffer=new byte[4096];
       int bytes_read;
       /**
        * 將一塊字節(jié)讀入緩沖區(qū),然后將其寫出
        * 如果循環(huán),知道達到文件結(jié)束(read()返回-1)
        * 注意,在此while循環(huán)中結(jié)合了賦值和比較
        */
       while((bytes_read=from.read(buffer))!=-1)  //讀,直到EOF
        to.write(buffer,0,bytes_read);         //寫
      }
      finally{
       if(from!=null)
        try{
         from.close();
        }
       catch(IOException e){
        ;
       }
       if(to!=null)
        try{
         to.close();
        }
       catch(IOException e){;}
      }
     }
     /**
      * 這是拋出異常的一個便利方法
      */
     private static void abort(String msg)throws IOException{
      throw new IOException("FileCopy:"+msg);
     }

    }


    這個程序的好處是一個安全的。因為有一個靜態(tài)的copy方法。其他程序也可以使用此方法來復(fù)制文件

     

    我們來看第二個例子

    例二:
    package org.stonecn.kernel;
    import java.io.*;
    import java.nio.channels.*;

     public class FileCopy2{
      public static void main(String[] args){
       FileInputStream fin=null;       //兩個文件的流
       FileOutputStream fout=null;     //這些流要在finally塊中關(guān)閉
       try{
        //打開輸入文件的一個流,并從中得到一個通道
        fin=new FileInputStream(args[0]);
        FileChannel in=fin.getChannel();
        
        //下面得到輸出通道
        WritableByteChannel out;
        //如果有第二個文件名
        if(args.length>1){
         fout=new FileOutputStream(args[1]);
         out=fout.getChannel();
        }
        else{
         //沒有目標(biāo)文件名
         out=Channels.newChannel(System.out);   //包裝stdout流
        }
        //查詢輸入文件的大小
        long numbytes=in.size();
        /**
         *采用批量傳輸?shù)姆绞綄⑺凶止?jié)從一個通道傳輸?shù)搅硪粋€通道
         *這是fileChannel通道的一個特殊特性
         *參見FileChannel.transferForm()
         */
         in.transferTo(0,numbytes,out);
        
       }
       catch(IOException e){
        System.out.println(e);
       }
       finally{
        try{
         if(fin!=null)  fin.close();
         if(fout!=null)  fout.close();
        }
        catch(IOException e){
        }
       }
       
      }
     }


    而這個程序?qū)⑵涞谝粋€參數(shù)中指定的文件復(fù)制到第二個參數(shù)所指定的文件中。
    如果沒有第二個參數(shù)則復(fù)制到標(biāo)準輸出。

    同樣的方式,兩種實現(xiàn),這就是我們所說的結(jié)果一樣,而過程也是千變?nèi)f化。
    例二所涉及的包是我以前所沒有接觸到的。
    歡迎朋友們來指正。

     

     

     

     

    Feedback

    # re: 一個文件復(fù)制的兩種方法的實現(xiàn)  回復(fù)  更多評論   

    2007-05-25 17:36 by dennis
    static跟安全有什么關(guān)系?呵呵

    # re: 一個文件復(fù)制的兩種方法的實現(xiàn)  回復(fù)  更多評論   

    2007-05-25 17:54 by Computerboy
    呵呵,樓上的朋友說的好。
    呵呵,
    我例二的例子是展示了一個特殊的批量傳輸方法:這是FileChannel 類所有特有的:transferTo()方法將文件的全部內(nèi)容復(fù)制到指定的通道,而無需顯示的分配任何ByteBuffer對象,這個方法對于web服務(wù)器和其他的傳輸文件內(nèi)容的應(yīng)用都特別有用。但是它互有了例一的FileCopy的安全特性,而且可以重寫現(xiàn)有文件,因此我稱為安全的。這是相對的。呵呵。

    # re: 一個文件復(fù)制的兩種方法的實現(xiàn)  回復(fù)  更多評論   

    2007-05-25 18:17 by BeanSoft
    不錯, Java NIO 性能很好的, 可惜都沒時間來看了.

    # 似的  回復(fù)  更多評論   

    2007-09-21 14:32 by 似的但是
    re: 一個文件復(fù)制的兩種方法的實現(xiàn)

    posts - 40, comments - 39, trackbacks - 0, articles - 0

    Copyright © Computerboy

    主站蜘蛛池模板: 亚洲乱妇熟女爽到高潮的片| 波多野结衣一区二区免费视频| 亚洲av无码乱码国产精品| 特级毛片在线大全免费播放| 国产网站免费观看| 午夜亚洲乱码伦小说区69堂| 免费人成网站7777视频| 一级毛片在线免费播放| 亚洲综合伊人久久大杳蕉| aa级女人大片喷水视频免费| 久久精品国产精品亚洲精品| 精品亚洲永久免费精品| 亚洲一区综合在线播放| 亚洲一区免费在线观看| 亚洲一卡2卡3卡4卡5卡6卡| 国产青草视频在线观看免费影院| 狼色精品人妻在线视频免费| 亚洲国产精品狼友中文久久久| 一级一级毛片免费播放| 亚洲国产精品无码成人片久久| 91成人在线免费观看| 亚洲色偷偷综合亚洲av78| 国产免费av一区二区三区| 成人无码精品1区2区3区免费看| 无码乱人伦一区二区亚洲一| 国产又黄又爽又猛免费app| 高潮内射免费看片| 国产成人无码综合亚洲日韩 | 亚洲人成人一区二区三区| 国产午夜无码精品免费看动漫| 亚洲综合激情另类小说区| 精品国产免费观看久久久| 久久www免费人成精品香蕉| 亚洲国产成人手机在线电影bd| 免费观看的a级毛片的网站| 老司机精品免费视频| 91丁香亚洲综合社区| 久久国产成人精品国产成人亚洲| 中文字幕免费高清视频| 老司机午夜在线视频免费| 亚洲综合精品一二三区在线|