利用通道以及遞歸方法拷貝文件的代碼案例

public static void main(String[] args) throws IOException {
//源文件夾
String url1="F:/file";
//目標文件夾
String url2="F:/test/項目測試數據包";
long start,end;
start = System.currentTimeMillis();
   // TODO Auto-generated method stub
for(int j=1;j<=25;j++){
//創建目標文件夾
String newUrl2 = url2+j;
 (new File(newUrl2)).mkdirs();
 //獲取源文件夾當前下的文件或目錄
  File[] file=(new File(url1)).listFiles();
  for (int i = 0; i < file.length; i++) {
   if(file[i].isFile()){
       //複製文件
    fileChannelCopy(file[i],new File(newUrl2+File.separator+file[i].getName()));
   }
   if(file[i].isDirectory()){
       //複製目錄
           String sorceDir=url1+File.separator+file[i].getName();
           String targetDir=newUrl2+File.separator+file[i].getName();
           copyDirectiory(sorceDir, targetDir);
       }
   }
}
   
  end = System.currentTimeMillis();
  System.out.println("文件通道用時"+(end-start));
  //System.out.println("緩衝流用時"+(end-start));
}
 
public static void copyFile(File sourcefile,File targetFile) throws IOException{
//新建文件輸入流並對它進行緩衝
FileInputStream input=new FileInputStream(sourcefile);
BufferedInputStream inbuff=new BufferedInputStream(input);

//新建文件輸出流並對它進行緩衝
FileOutputStream out=new FileOutputStream(targetFile);
BufferedOutputStream outbuff=new BufferedOutputStream(out);

//緩衝數組
byte[] b=new byte[1024*5];
int len=0;
while((len=inbuff.read(b))!=-1){
   outbuff.write(b, 0, len);
}

//刷新此緩衝的輸出流
outbuff.flush();

//關閉流
inbuff.close();
outbuff.close();
out.close();
input.close();
}

public static void copyDirectiory(String sourceDir,String targetDir) throws IOException{
   //新建目標目錄
   
   (new File(targetDir)).mkdirs();
   
   //獲取源文件夾當下的文件或目錄
   File[] file=(new File(sourceDir)).listFiles();
   for (int i = 0; i < file.length; i++) {
       if(file[i].isFile()){
           //源文件
           File sourceFile=file[i];
               //目標文件
           File targetFile=new File(new File(targetDir).getAbsolutePath()+File.separator+file[i].getName());
           
           copyFile(sourceFile, targetFile);
       
       }
       if(file[i].isDirectory()){
           //準備複製的源文件夾
           String dir1=sourceDir+"/"+file[i].getName();
           //準備複製的目標文件夾
           String dir2=targetDir+"/"+file[i].getName();
           
           copyDirectiory(dir1, dir2);
       }
   }
}

public static void fileChannelCopy(File s, File t) {

       FileInputStream fi = null;

       FileOutputStream fo = null;

       FileChannel in = null;

       FileChannel out = null;

       try {

           fi = new FileInputStream(s);

           fo = new FileOutputStream(t);

           in = fi.getChannel();//得到對應的文件通道

       out = fo.getChannel();//得到對應的文件通道

       in.transferTo(0, in.size(), out);//連接兩個通道,並且從in通道讀取,然後寫入out通道

   } catch (IOException e) {

       e.printStackTrace();

   } finally {

       try {
        if(null!=fi) fi.close();
        if(null!=in) in.close();
        if(null!=fo) fo.close();
        if(null!=out)out.close();
       } catch (IOException e) {
           e.printStackTrace();
       }

   }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章