Java實現文件拷貝的4種方法

          第一種方法:古老的方式

           public static long forJava(File f1,File f2) throws Exception{
            long time=new Date().getTime();
            int length=2097152;
            FileInputStream in=new FileInputStream(f1);
            FileOutputStream out=new FileOutputStream(f2);
            byte[] buffer=new byte[length];
            while(true){
             int ins=in.read(buffer);
             if(ins==-1){
              in.close();
              out.flush();
              out.close();
              return new Date().getTime()-time;
             }else
              out.write(buffer,0,ins);
            }
           }
          方法的2參數分別是原始文件,和拷貝的目的文件.這里不做過多介紹.

          實現方法很簡單,分別對2個文件構建輸入輸出流,并且使用一個字節數組作為我們內存的緩存器, 然后使用流從f1 中讀出數據到緩存里,在將緩存數據寫到f2里面去.這里的緩存是2MB的字節數組

          第2種方法:使用NIO中的管道到管道傳輸

              public static long forTransfer(File f1,File f2) throws Exception{
                  long time=new Date().getTime();
                  int length=2097152;
                  FileInputStream in=new FileInputStream(f1);
                  FileOutputStream out=new FileOutputStream(f2);
                  FileChannel inC=in.getChannel();
                  FileChannel outC=out.getChannel();
                  int i=0;
                  while(true){
                      if(inC.position()==inC.size()){
                          inC.close();
                          outC.close();
                          return new Date().getTime()-time;
                      }
                      if((inC.size()-inC.position())<20971520)
                          length=(int)(inC.size()-inC.position());
                      else
                          length=20971520;
                      inC.transferTo(inC.position(),length,outC);
                      inC.position(inC.position()+length);
                      i++;
                  }
              }
          實現方法:在第一種實現方法基礎上對輸入輸出流獲得其管道,然后分批次的從f1的管道中像f2的管道中輸入數據每次輸入的數據最大為2MB

          方法3:內存文件景象寫(讀文件沒有使用文件景象,有興趣的可以回去試試,,我就不試了,估計會更快)

              public static long forImage(File f1,File f2) throws Exception{
                  long time=new Date().getTime();
                  int length=2097152;
                  FileInputStream in=new FileInputStream(f1);
                  RandomAccessFile out=new RandomAccessFile(f2,"rw");
                  FileChannel inC=in.getChannel();
                  MappedByteBuffer outC=null;
                  MappedByteBuffer inbuffer=null;
                  byte[] b=new byte[length];
                  while(true){
                      if(inC.position()==inC.size()){
                          inC.close();
                          outC.force();
                          out.close();
                          return new Date().getTime()-time;
                      }
                      if((inC.size()-inC.position())<length){
                          length=(int)(inC.size()-inC.position());
                      }else{
                          length=20971520;
                      }
                      b=new byte[length];
                      inbuffer=inC.map(MapMode.READ_ONLY,inC.position(),length);
                      inbuffer.load();
                      inbuffer.get(b);
                      outC=out.getChannel().map(MapMode.READ_WRITE,inC.position(),length);
                      inC.position(b.length+inC.position());
                      outC.put(b);
                      outC.force();
                  }
              }
          實現方法:跟傷2個例子不一樣,這里寫文件流沒有使用管道而是使用內存文件映射(假設文件f2在內存中).在循環中從f1的管道中讀取數據到字節數組里,然后在像內存映射的f2文件中寫數據.

          第4種方法:管道對管道

              public static long forChannel(File f1,File f2) throws Exception{
                  long time=new Date().getTime();
                  int length=2097152;
                  FileInputStream in=new FileInputStream(f1);
                  FileOutputStream out=new FileOutputStream(f2);
                  FileChannel inC=in.getChannel();
                  FileChannel outC=out.getChannel();
                  ByteBuffer b=null;
                  while(true){
                      if(inC.position()==inC.size()){
                          inC.close();
                          outC.close();
                          return new Date().getTime()-time;
                      }
                      if((inC.size()-inC.position())<length){
                          length=(int)(inC.size()-inC.position());
                      }else
                          length=2097152;
                      b=ByteBuffer.allocateDirect(length);
                      inC.read(b);
                      b.flip();
                      outC.write(b);
                      outC.force(false);
                  }
              }
          這里實現方式與第3種實現方式很類似,不過沒有使用內存影射。

          posted on 2009-10-24 00:41 飛熊 閱讀(424) 評論(0)  編輯  收藏 所屬分類: java

          <2009年10月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導航

          統計

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 固安县| 连州市| 全南县| 二手房| 施秉县| 甘洛县| 治多县| 寿光市| 日喀则市| 克什克腾旗| 通州市| 文昌市| 五峰| 响水县| 周口市| 荆州市| 中江县| 岳普湖县| 时尚| 越西县| 崇州市| 祁门县| 河间市| 临湘市| 上虞市| 明光市| 陕西省| 玉林市| 阿巴嘎旗| 皋兰县| 淮南市| 台江县| 浮山县| 潮安县| 雷波县| 轮台县| 枣强县| 阿城市| 宿州市| 信丰县| 浏阳市|