欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java實(shí)現(xiàn)文件復(fù)制上傳操作

 更新時(shí)間:2016年11月30日 14:06:41   作者:qq_27298687  
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)文件復(fù)制上傳操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

利用Java復(fù)制文件到處都可以用到,這里總結(jié)了一個(gè)類供大家參考。里面總共有兩個(gè)方法:

public static boolean copyFile(String srcFileName, String destFileName,boolean overlay); 
public static boolean copyDirectory(String srcDirName, String destDirName,boolean overlay) ; 

其中:
srcFileName 待復(fù)制的文件名
descFileName  目標(biāo)文件名
overlay  如果目標(biāo)文件存在,是否覆蓋
如果復(fù)制成功返回true,否則返回false

代碼:

 import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
 
import javax.swing.JOptionPane; 
 
/** 
 * 復(fù)制文件或文件夾 
 * 
 * zww 
 */ 
public class CopyFileUtil { 
 
  private static String MESSAGE = ""; 
 
  /** 
   * 復(fù)制單個(gè)文件 
   * 
   * @param srcFileName 
   *      待復(fù)制的文件名 
   * @param descFileName 
   *      目標(biāo)文件名 
   * @param overlay 
   *      如果目標(biāo)文件存在,是否覆蓋 
   * @return 如果復(fù)制成功返回true,否則返回false 
   */ 
  public static boolean copyFile(String srcFileName, String destFileName, 
      boolean overlay) { 
    File srcFile = new File(srcFileName); 
 
    // 判斷源文件是否存在 
    if (!srcFile.exists()) { 
      MESSAGE = "源文件:" + srcFileName + "不存在!"; 
      JOptionPane.showMessageDialog(null, MESSAGE); 
      return false; 
    } else if (!srcFile.isFile()) { 
      MESSAGE = "復(fù)制文件失敗,源文件:" + srcFileName + "不是一個(gè)文件!"; 
      JOptionPane.showMessageDialog(null, MESSAGE); 
      return false; 
    } 
 
    // 判斷目標(biāo)文件是否存在 
    File destFile = new File(destFileName); 
    if (destFile.exists()) { 
      // 如果目標(biāo)文件存在并允許覆蓋 
      if (overlay) { 
        // 刪除已經(jīng)存在的目標(biāo)文件,無論目標(biāo)文件是目錄還是單個(gè)文件 
        new File(destFileName).delete(); 
      } 
    } else { 
      // 如果目標(biāo)文件所在目錄不存在,則創(chuàng)建目錄 
      if (!destFile.getParentFile().exists()) { 
        // 目標(biāo)文件所在目錄不存在 
        if (!destFile.getParentFile().mkdirs()) { 
          // 復(fù)制文件失?。簞?chuàng)建目標(biāo)文件所在目錄失敗 
          return false; 
        } 
      } 
    } 
 
    // 復(fù)制文件 
    int byteread = 0; // 讀取的字節(jié)數(shù) 
    InputStream in = null; 
    OutputStream out = null; 
 
    try { 
      in = new FileInputStream(srcFile); 
      out = new FileOutputStream(destFile); 
      byte[] buffer = new byte[1024]; 
 
      while ((byteread = in.read(buffer)) != -1) { 
        out.write(buffer, 0, byteread); 
      } 
      return true; 
    } catch (FileNotFoundException e) { 
      return false; 
    } catch (IOException e) { 
      return false; 
    } finally { 
      try { 
        if (out != null) 
          out.close(); 
        if (in != null) 
          in.close(); 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
 
  /** 
   * 復(fù)制整個(gè)目錄的內(nèi)容 
   * 
   * @param srcDirName 
   *      待復(fù)制目錄的目錄名 
   * @param destDirName 
   *      目標(biāo)目錄名 
   * @param overlay 
   *      如果目標(biāo)目錄存在,是否覆蓋 
   * @return 如果復(fù)制成功返回true,否則返回false 
   */ 
  public static boolean copyDirectory(String srcDirName, String destDirName, 
      boolean overlay) { 
    // 判斷源目錄是否存在 
    File srcDir = new File(srcDirName); 
    if (!srcDir.exists()) { 
      MESSAGE = "復(fù)制目錄失?。涸茨夸? + srcDirName + "不存在!"; 
      JOptionPane.showMessageDialog(null, MESSAGE); 
      return false; 
    } else if (!srcDir.isDirectory()) { 
      MESSAGE = "復(fù)制目錄失敗:" + srcDirName + "不是目錄!"; 
      JOptionPane.showMessageDialog(null, MESSAGE); 
      return false; 
    } 
 
    // 如果目標(biāo)目錄名不是以文件分隔符結(jié)尾,則加上文件分隔符 
    if (!destDirName.endsWith(File.separator)) { 
      destDirName = destDirName + File.separator; 
    } 
    File destDir = new File(destDirName); 
    // 如果目標(biāo)文件夾存在 
    if (destDir.exists()) { 
      // 如果允許覆蓋則刪除已存在的目標(biāo)目錄 
      if (overlay) { 
        new File(destDirName).delete(); 
      } else { 
        MESSAGE = "復(fù)制目錄失?。耗康哪夸? + destDirName + "已存在!"; 
        JOptionPane.showMessageDialog(null, MESSAGE); 
        return false; 
      } 
    } else { 
      // 創(chuàng)建目的目錄 
      System.out.println("目的目錄不存在,準(zhǔn)備創(chuàng)建。。。"); 
      if (!destDir.mkdirs()) { 
        System.out.println("復(fù)制目錄失?。簞?chuàng)建目的目錄失?。?); 
        return false; 
      } 
    } 
 
    boolean flag = true; 
    File[] files = srcDir.listFiles(); 
    for (int i = 0; i < files.length; i++) { 
      // 復(fù)制文件 
      if (files[i].isFile()) { 
        flag = CopyFileUtil.copyFile(files[i].getAbsolutePath(), 
            destDirName + files[i].getName(), overlay); 
        if (!flag) 
          break; 
      } else if (files[i].isDirectory()) { 
        flag = CopyFileUtil.copyDirectory(files[i].getAbsolutePath(), 
            destDirName + files[i].getName(), overlay); 
        if (!flag) 
          break; 
      } 
    } 
    if (!flag) { 
      MESSAGE = "復(fù)制目錄" + srcDirName + "至" + destDirName + "失??!"; 
      JOptionPane.showMessageDialog(null, MESSAGE); 
      return false; 
    } else { 
      return true; 
    } 
  } 
 
  public static void main(String[] args) { 
    String srcDirName = "C:/test/test0/test1"; 
    String destDirName = "c:/ttt"; 
    CopyFileUtil.copyDirectory(srcDirName, destDirName, true); 
  } 
} 

不考慮多線程優(yōu)化,單線程文件復(fù)制最快的方法是(文件越大該方法越有優(yōu)勢,一般比常用方法快30+%):

private static void nioTransferCopy(File source, File target) { 
  FileChannel in = null; 
  FileChannel out = null; 
  FileInputStream inStream = null; 
  FileOutputStream outStream = null; 
  try { 
    inStream = new FileInputStream(source); 
    outStream = new FileOutputStream(target); 
    in = inStream.getChannel(); 
    out = outStream.getChannel(); 
    in.transferTo(0, in.size(), out); 
  } catch (IOException e) { 
    e.printStackTrace(); 
  } finally { 
    close(inStream); 
    close(in); 
    close(outStream); 
    close(out); 
  } 
} 

如果需要監(jiān)測復(fù)制進(jìn)度,可以用第二快的方法(留意buffer的大小,對(duì)速度有很大影響):

private static void nioBufferCopy(File source, File target) { 
  FileChannel in = null; 
  FileChannel out = null; 
  FileInputStream inStream = null; 
  FileOutputStream outStream = null; 
  try { 
    inStream = new FileInputStream(source); 
    outStream = new FileOutputStream(target); 
    in = inStream.getChannel(); 
    out = outStream.getChannel(); 
    ByteBuffer buffer = ByteBuffer.allocate(4096); 
    while (in.read(buffer) != -1) { 
      buffer.flip(); 
      out.write(buffer); 
      buffer.clear(); 
    } 
  } catch (IOException e) { 
    e.printStackTrace(); 
  } finally { 
    close(inStream); 
    close(in); 
    close(outStream); 
    close(out); 
  } 
} 

常用的方法1是:

private static void customBufferBufferedStreamCopy(File source, File target) { 
  InputStream fis = null; 
  OutputStream fos = null; 
  try { 
    fis = new BufferedInputStream(new FileInputStream(source)); 
    fos = new BufferedOutputStream(new FileOutputStream(target)); 
    byte[] buf = new byte[4096]; 
    int i; 
    while ((i = fis.read(buf)) != -1) { 
      fos.write(buf, 0, i); 
    } 
  } 
  catch (Exception e) { 
    e.printStackTrace(); 
  } finally { 
    close(fis); 
    close(fos); 
  } 
} 

常用的方法2是:

private static void customBufferStreamCopy(File source, File target) { 
  InputStream fis = null; 
  OutputStream fos = null; 
  try { 
    fis = new FileInputStream(source); 
    fos = new FileOutputStream(target); 
    byte[] buf = new byte[4096]; 
    int i; 
    while ((i = fis.read(buf)) != -1) { 
      fos.write(buf, 0, i); 
    } 
  } 
  catch (Exception e) { 
    e.printStackTrace(); 
  } finally { 
    close(fis); 
    close(fos); 
  } 
}

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java多線程之線程通信生產(chǎn)者消費(fèi)者模式及等待喚醒機(jī)制代碼詳解

    Java多線程之線程通信生產(chǎn)者消費(fèi)者模式及等待喚醒機(jī)制代碼詳解

    這篇文章主要介紹了Java多線程之線程通信生產(chǎn)者消費(fèi)者模式及等待喚醒機(jī)制代碼詳解,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • 一文搞懂Java中的抽象類和接口到底是什么

    一文搞懂Java中的抽象類和接口到底是什么

    在類中沒有包含足夠的信息來描繪一個(gè)具體的對(duì)象,這樣的類稱為抽象類,接口是Java中最重要的概念之一,它可以被理解為一種特殊的類,不同的是接口的成員沒有執(zhí)行體,是由全局常量和公共的抽象方法所組成,本文給大家介紹Java抽象類和接口,感興趣的朋友一起看看吧
    2022-04-04
  • mybatis中的一級(jí)緩存深入剖析

    mybatis中的一級(jí)緩存深入剖析

    這篇文章主要介紹了mybatis中的一級(jí)緩存深入剖析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Spring?Boot?詳細(xì)分析Conditional自動(dòng)化配置注解

    Spring?Boot?詳細(xì)分析Conditional自動(dòng)化配置注解

    首先我們先了解一下@Conditional注解,@Conditional是Spring4新提供的注解,它的作用是按照一定的條件進(jìn)行判斷,需要注入的Bean滿足給定條件才可以注入到Spring?IOC容器中
    2022-07-07
  • Java基礎(chǔ)第三篇 構(gòu)造器與方法重載

    Java基礎(chǔ)第三篇 構(gòu)造器與方法重載

    顯式初始化要求我們在寫程序時(shí)就確定初始值,這有時(shí)很不方便。我們可以使用構(gòu)造器(constructor)來初始化對(duì)象。構(gòu)造器可以初始化數(shù)據(jù)成員,還可以規(guī)定特定的操作。這些操作會(huì)在創(chuàng)建對(duì)象時(shí)自動(dòng)執(zhí)行。下面文字將對(duì)該內(nèi)容做詳細(xì)介紹,需要的小伙伴請(qǐng)參考
    2021-09-09
  • 基于Java編寫一個(gè)粽子大作戰(zhàn)小游戲

    基于Java編寫一個(gè)粽子大作戰(zhàn)小游戲

    端午節(jié),又稱龍舟節(jié)、重午節(jié),是中國的傳統(tǒng)節(jié)日之一,每年農(nóng)歷五月初五慶祝,雖然端午假期已經(jīng)過去了,小編還是用Java編寫了一個(gè)粽子大作戰(zhàn)小游戲,感興趣的可以了解一下
    2023-06-06
  • Java常見問題之javac Hello.java找不到文件的解決方法

    Java常見問題之javac Hello.java找不到文件的解決方法

    剛開始編寫java代碼時(shí),肯定會(huì)遇到各種各樣的bug,當(dāng)然對(duì)于初學(xué)者這也是能理解的,下面這篇文章主要給大家介紹了關(guān)于Java常見問題之javac Hello.java找不到文件解決的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下。
    2018-01-01
  • SpringBoot定時(shí)任務(wù)動(dòng)態(tài)擴(kuò)展ScheduledTaskRegistrar詳解

    SpringBoot定時(shí)任務(wù)動(dòng)態(tài)擴(kuò)展ScheduledTaskRegistrar詳解

    這篇文章主要為大家介紹了SpringBoot定時(shí)任務(wù)動(dòng)態(tài)擴(kuò)展ScheduledTaskRegistrar類示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • java實(shí)現(xiàn)無符號(hào)數(shù)轉(zhuǎn)換、字符串補(bǔ)齊、md5、uuid、隨機(jī)數(shù)示例

    java實(shí)現(xiàn)無符號(hào)數(shù)轉(zhuǎn)換、字符串補(bǔ)齊、md5、uuid、隨機(jī)數(shù)示例

    這篇文章主要介紹了java實(shí)現(xiàn)無符號(hào)數(shù)轉(zhuǎn)換、字符串補(bǔ)齊、md5、uuid、隨機(jī)數(shù)示例,需要的朋友可以參考下
    2014-04-04
  • Java?shiro安全框架使用介紹

    Java?shiro安全框架使用介紹

    安全管理是軟件系統(tǒng)必不可少的的功能。根據(jù)經(jīng)典的“墨菲定律”——凡是可能,總會(huì)發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會(huì)出現(xiàn)問題,這篇文章主要介紹了SpringBoot安全管理Shiro框架的使用
    2022-08-08

最新評(píng)論