亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

java使用nio2拷貝文件的示例

2019-11-26 15:31:04
字體:
來源:轉載
供稿:網友

這個程序只是為了更方便的進行拷貝文件(夾)而創造。
1.可以不用新建文件夾,就像windows的復制粘貼一樣簡單。
2.有簡單的出錯重連機制
3.不需要重復拷貝,差異化復制文件。
4.拷貝文件夾的時候可以不用復制全路徑,只關注需要拷貝的文件夾。
5.程序做了簡單的必要檢查,效率也不算低。
6.使用的是7的nio2的新API。

復制代碼 代碼如下:

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.FileTime;
import java.util.Stack;

import org.apache.log4j.Logger;

import com.xyq.myfile.cope.entity.PathType;
import com.xyq.util.MD5Util;

/***
 * 基于jdk7的拷貝算法
 *
 * @author xyq
 *
 */
public class MyFiles2 {

 private String src;
 private String tar;
 private Path srcPath;
 private Path tarPath;
 private int reCount = 3;
 private boolean isCover = false;
 private boolean useMd5 = false;
 private int subNameNum = 0;
 // log4j對象
 private Logger logger;
 // 在文件夾-->文件夾模式中,是否拷貝全路徑,默認不拷貝
 private boolean isCopeAllPath = false;

 public MyFiles2(String src, String tar) {

  this.src = src;
  this.tar = tar;
  this.srcPath = Paths.get(src);
  this.tarPath = Paths.get(tar);
 }

 public MyFiles2() {
 }

 public String getSrc() {
  return src;
 }

 public void setSrc(String src) {
  this.src = src;
  this.srcPath = Paths.get(src);
 }

 public String getTar() {
  return tar;
 }

 public void setTar(String tar) {
  this.tar = tar;
  this.tarPath = Paths.get(tar);
 }

 public int getReCount() {
  return reCount;
 }

 public void setReCount(int reCount) {
  this.reCount = reCount;
 }

 public boolean isCover() {
  return isCover;
 }

 public void setCover(boolean isCover) {
  this.isCover = isCover;
 }

 public Logger getLogger() {
  return logger;
 }

 public void setLogger(Logger logger) {
  this.logger = logger;
 }

 public boolean isUseMd5() {
  return useMd5;
 }

 public void setUseMd5(boolean useMd5) {
  this.useMd5 = useMd5;
 }

 public boolean isCopeAllPath() {
  return isCopeAllPath;
 }

 public void setCopeAllPath(boolean isCopeAllPath) {
  this.isCopeAllPath = isCopeAllPath;
 }

 public boolean copeFileCore(PathType... types) {

  if (initCheck() && initCheck2s(this.srcPath, false))
   return copeFileCore(this.srcPath, this.tarPath, reCount, isCover,
     types);
  return false;
 }

 private boolean initCheck() {

  if (this.srcPath == null) {
   logInfo("原始路徑未設置,程序無法啟動~~");
   return false;
  } else if (this.tarPath == null) {
   logInfo("目標路徑未設置,程序無法啟動~~");
   return false;
  } else if (!Files.exists(srcPath)) {
   logInfo("原始路徑不存在,程序無法啟動~~");
   return false;
  } else if (!Files.exists(tarPath.getRoot())) {
   logInfo("目標路徑的根盤符不存在,程序無法啟動~~");
   return false;
  }
  return true;
 }

 private boolean initCheck2s(Path path, boolean dOrF) {

  if (!Files.isDirectory(path)) {
   if (dOrF) {
    logInfo(path + "不是一個有效的文件夾");
    return false;
   }
  } else if (!dOrF) {
   logInfo(path + "不是一個有效的文件");
   return false;
  }
  return true;
 }

 /****
  * 拷貝文件算法
  *
  * @param path1
  *            原始路徑
  * @param path2
  *            目標路徑
  * @param reCount
  *            重復次數
  * @param isCover
  *            是否覆蓋拷貝
  * @param types
  *            你所寫的目標路徑是文件還是文件夾,可以不寫,默認是文件
  * @return
  */
 public boolean copeFileCore(Path path1, Path path2, int reCount,
   boolean isCover, PathType... types) {

  // 如果原始文件不存在,就直接異常
  if (!initCheck() || !initCheck2s(path1, false))
   return false;
  PathType type = PathType.FILES;
  if (types != null && types.length > 0) {
   type = types[0];
   // 如果目標是一個文件夾,并且指定是往一個文件夾拷貝的時候
   if (type.equals(PathType.DIRS)) {
    path2 = Paths.get(path2.toString(), path1.getFileName()
      .toString());
   }
  }
  // 如果目標文件已經存在,就判斷是否相同,相同就不用拷貝了
  if (Files.exists(path2)) {
   if (Files.isDirectory(path2) && PathType.FILES.equals(type)) {
    logInfo(path2 + "已經存在,它是一個文件夾而不是文件");
    return false;
   }
   if (isSameFile(path1, path2, useMd5))
    return true;
  }
  // 當目標文件不存在的時候
  else {
   Path parPath = path2.getParent();
   // 如果目標文件的父類文件夾不存在,就嘗試創建
   if (!Files.exists(parPath))
    for (int i = 1; i < reCount; i++) {
     try {
      Files.createDirectories(parPath);
      break;
     } catch (Exception e) {
      if (i == reCount) {
       logInfo(e);
       return false;
      }
     }
    }
  }

  for (int i = 1; i <= reCount; i++) {
   try {
    if (isCover)
     Files.copy(path1, path2,
       StandardCopyOption.REPLACE_EXISTING,
       StandardCopyOption.COPY_ATTRIBUTES);
    else
     Files.copy(path1, path2, StandardCopyOption.COPY_ATTRIBUTES);
    // 同步最后修改時間
    synLastFileTime(path1, path2);
    break;
   } catch (IOException e) {
    // 如果在指定時間內都無法完成拷貝,那么就果斷記錄到異常信息中
    if (i == reCount) {
     logInfo(e);
     return false;
    }
   }
  }
  return true;

 }

 public void copeDir() {

  if (!initCheck() || !initCheck2s(srcPath, true))
   return;
  copeDir(this.srcPath.toString(), this.tarPath.toString());
 }

 /***
  * 拷貝文件夾保護層
  *
  * @param path1
  * @param path2
  */
 public void copeDir(String path1, final String path2) {

  if (!initCheck() || !initCheck2s(srcPath, true))
   return;
  Path p1 = Paths.get(path1);
  final Path tarPath = Paths.get(path2);
  if (!isCopeAllPath)
   subNameNum = srcPath.getNameCount() - 1;
  try {
   Files.walkFileTree(p1, new FileVisitor<Path>() {

    Path p2 = null;
    Stack<Path> dirStack = new Stack<Path>();

    @Override
    public FileVisitResult preVisitDirectory(Path dir,
      BasicFileAttributes attrs) throws IOException {

     // 當使用不拷貝全路徑時,作為本文件夾的名字節點的記錄位置
     // if (!copeAllPath)
     /****
      * 如果是相同的文件夾,那么就跳過無需拷貝.
      */
     if (isSamePath(dir, tarPath)) {
      System.out.println("是相同的,跳過!!!!!!!!!!!!!!!!!");
      return FileVisitResult.SKIP_SUBTREE;
     }
     p2 = replacePath(dir, path2, subNameNum);
     if (dir.toFile().length() == 0 && !Files.exists(p2))
      Files.createDirectories(p2);
     dirStack.push(p2);
     return FileVisitResult.CONTINUE;

    }

    @Override
    public FileVisitResult visitFile(Path file,
      BasicFileAttributes attrs) throws IOException {

     Path toFilePath = Paths.get(dirStack.peek().toString(),
       file.getFileName().toString());
     copeFileCore(file, toFilePath, 3, true);
     return FileVisitResult.CONTINUE;

    }

    @Override
    public FileVisitResult visitFileFailed(Path file,
      IOException exc) throws IOException {

     return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult postVisitDirectory(Path dir,
      IOException exc) throws IOException {
     if (!dirStack.isEmpty())
      dirStack.pop();
     return FileVisitResult.CONTINUE;
    }

   });
  } catch (IOException e) {
   logInfo(e);
  }
 }

 /***
  * 替換Path
  *
  * @param path1
  * @param path2
  * @return
  */
 private Path replacePath(Path path1, String path2, int nameCountNum) {

  if (path1.getNameCount() == 0 && path1.equals(path1.getRoot()))
   return Paths.get(path2);
  return Paths.get(path2,
    path1.subpath(nameCountNum, path1.getNameCount()).toString());
 }

 /***
  * 要么是地址完全相同,要么就是原始文件的父類與目標相同,因為程序支持拷貝到父類
  *
  * @param path1
  * @param path2
  * @return
  */
 private boolean isSamePath(Path path1, Path path2) {

  if (path1.equals(path2))
   return true;
  return false;
 }

 /***
  * 同步文件的修改時間
  *
  * @param path1
  * @param path2
  * @return
  */
 public boolean synLastFileTime(Path path1, Path path2) {

  FileTime srcPathTime;
  try {
   srcPathTime = Files.getLastModifiedTime(path1);
   Files.setLastModifiedTime(path2, srcPathTime);
   return srcPathTime.equals(Files.getLastModifiedTime(path2));
  } catch (IOException e) {
   logInfo(e);
   return false;
  }
 }

 /***
  * 判斷兩個文件是否相同
  *
  * @param path1
  * @param path2
  * @return
  */
 public boolean isSameFile(Path path1, Path path2, boolean useMd5) {

  try {
   // 只要兩個文件長度不一致,就絕對不是一個文件
   if (Files.size(path1) != Files.size(path2))
    return false;
   // 如果是最后的修改時間不一樣,就直接使用MD5驗證
   else if (!Files.getLastModifiedTime(path1).equals(
     Files.getLastModifiedTime(path2))
     || useMd5)
    return MD5Util.getFileMD5String(path1.toFile()).equals(
      MD5Util.getFileMD5String(path2.toFile()));
   return true;
  } catch (Exception e) {
   logInfo(e);
   return false;
  }
 }

 /***
  * 針對異常處理的
  */
 private void logInfo(Exception e) {

  if (this.logger != null)
   logger.error(e.getMessage());
  else if (e != null)
   System.out.println("異常:" + e.getMessage());
 }

 private void logInfo(String errorMessage) {

  if (this.logger != null)
   logger.error(errorMessage);
  else
   System.out.println("異常:" + errorMessage);
 }

 public static void main(String[] args) {

  // new MyFiles2("e:/t/1.txt", "e:/3/33").copeFileCore();
  MyFiles2 my = new MyFiles2("e:/ttt/tt/t/1.txt", "e:/3/33.txt");
  my.copeFileCore(PathType.DIRS);
 }
}

復制代碼 代碼如下:

public enum PathType {

 FILES,DIRS;
}

復制代碼 代碼如下:

import java.io.Closeable;

public class CloseIoUtil {

 /***
  * 關閉IO流
  *
  * @param cls
  */
 public static void closeAll(Closeable... cls) {

  if (cls != null) {
   for (Closeable cl : cls) {
    try {
     if (cl != null)
      cl.close();
    } catch (Exception e) {

    } finally {
     cl = null;
    }
   }
  }
 }
}

復制代碼 代碼如下:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Util {

 protected static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6',
   '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
 protected static MessageDigest messagedigest = null;
 static {
  try {
   messagedigest = MessageDigest.getInstance("MD5");
  } catch (NoSuchAlgorithmException e) {
   e.printStackTrace();
  }
 }

 public static String getFileMD5String(File file) throws IOException {

  /***
   * MappedByteBuffer是NIO的API,使用這個API會有一個bug,
   * 當使用 FileChannel.map 方法時,MappedByteBuffer 已經在系統內占用了一個句柄,
   * 而使用 FileChannel.close 方法是無法釋放這個句柄的,、
   * 且FileChannel有沒有提供類似 unmap 的方法,因此會出現無法刪除文件的情況。
   */
  // FileInputStream in = new FileInputStream(file);
  // FileChannel ch = in.getChannel();
  // MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY,
  // 0,
  // file.length());

  InputStream fis = null;
  BufferedInputStream bis = null;
        fis = new FileInputStream(file); 
        bis = new BufferedInputStream(fis);
        byte[] buffer = new byte[2048]; 
        int numRead = 0; 
        while ((numRead = bis.read(buffer)) > 0) { 
            messagedigest.update(buffer, 0, numRead); 
        } 
        CloseIoUtil.closeAll(bis,fis);
        return bufferToHex(messagedigest.digest()); 
 }

 public static String getMD5String(String s) {
  return getMD5String(s.getBytes());
 }

 public static String getMD5String(byte[] bytes) {
  messagedigest.update(bytes);
  return bufferToHex(messagedigest.digest());
 }

 private static String bufferToHex(byte bytes[]) {
  return bufferToHex(bytes, 0, bytes.length);
 }

 private static String bufferToHex(byte bytes[], int m, int n) {
  StringBuffer stringbuffer = new StringBuffer(2 * n);
  int k = m + n;
  for (int l = m; l < k; l++) {
   appendHexPair(bytes[l], stringbuffer);
  }
  return stringbuffer.toString();
 }

 private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
  char c0 = hexDigits[(bt & 0xf0) >> 4];
  char c1 = hexDigits[bt & 0xf];
  stringbuffer.append(c0);
  stringbuffer.append(c1);
 }

 public static boolean checkPassword(String password, String md5PwdStr) {
  String s = getMD5String(password);
  return s.equals(md5PwdStr);
 }

 public static void main(String[] args) throws IOException {

  File big = new File("e:/sss.txt");
  String md5 = getFileMD5String(big);
  //
  // long end = System.currentTimeMillis();
  // System.out.println("md5:" + md5);
  // System.out.println("time:" + ((end - begin) / 1000) + "s");

  System.out.println(md5);

 }

}

復制代碼 代碼如下:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Util {

 protected static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6',
   '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
 protected static MessageDigest messagedigest = null;
 static {
  try {
   messagedigest = MessageDigest.getInstance("MD5");
  } catch (NoSuchAlgorithmException e) {
   e.printStackTrace();
  }
 }

 public static String getFileMD5String(File file) throws IOException {

  /***
   * MappedByteBuffer是NIO的API,使用這個API會有一個bug,
   * 當使用 FileChannel.map 方法時,MappedByteBuffer 已經在系統內占用了一個句柄,
   * 而使用 FileChannel.close 方法是無法釋放這個句柄的,、
   * 且FileChannel有沒有提供類似 unmap 的方法,因此會出現無法刪除文件的情況。
   */
  // FileInputStream in = new FileInputStream(file);
  // FileChannel ch = in.getChannel();
  // MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY,
  // 0,
  // file.length());

  InputStream fis = null;
  BufferedInputStream bis = null;
        fis = new FileInputStream(file); 
        bis = new BufferedInputStream(fis);
        byte[] buffer = new byte[2048]; 
        int numRead = 0; 
        while ((numRead = bis.read(buffer)) > 0) { 
            messagedigest.update(buffer, 0, numRead); 
        } 
        CloseIoUtil.closeAll(bis,fis);
        return bufferToHex(messagedigest.digest()); 
 }

 public static String getMD5String(String s) {
  return getMD5String(s.getBytes());
 }

 public static String getMD5String(byte[] bytes) {
  messagedigest.update(bytes);
  return bufferToHex(messagedigest.digest());
 }

 private static String bufferToHex(byte bytes[]) {
  return bufferToHex(bytes, 0, bytes.length);
 }

 private static String bufferToHex(byte bytes[], int m, int n) {
  StringBuffer stringbuffer = new StringBuffer(2 * n);
  int k = m + n;
  for (int l = m; l < k; l++) {
   appendHexPair(bytes[l], stringbuffer);
  }
  return stringbuffer.toString();
 }

 private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
  char c0 = hexDigits[(bt & 0xf0) >> 4];
  char c1 = hexDigits[bt & 0xf];
  stringbuffer.append(c0);
  stringbuffer.append(c1);
 }

 public static boolean checkPassword(String password, String md5PwdStr) {
  String s = getMD5String(password);
  return s.equals(md5PwdStr);
 }

 public static void main(String[] args) throws IOException {

  File big = new File("e:/sss.txt");
  String md5 = getFileMD5String(big);
  //
  // long end = System.currentTimeMillis();
  // System.out.println("md5:" + md5);
  // System.out.println("time:" + ((end - begin) / 1000) + "s");

  System.out.println(md5);

 }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97精品国产aⅴ7777| 2019最新中文字幕| 亚洲free性xxxx护士hd| 精品国产电影一区| 亚洲第一精品夜夜躁人人躁| 精品中文字幕在线观看| 成人精品视频99在线观看免费| 91高清视频免费| 福利视频一区二区| 在线精品91av| 欧美成人激情视频免费观看| 少妇久久久久久| 国产精品久久久久久久久粉嫩av| 亚洲最大福利网| 欧美激情图片区| 亚洲日本中文字幕免费在线不卡| 国产成人a亚洲精品| 日韩免费电影在线观看| 国产精品私拍pans大尺度在线| 国产亚洲精品久久久| 中文字幕亚洲字幕| 亚洲字幕一区二区| 国产精品白嫩初高中害羞小美女| 成人黄色av免费在线观看| 97av在线视频免费播放| 国产精品91在线| 色综合色综合久久综合频道88| 成人欧美一区二区三区在线| 亚洲综合成人婷婷小说| 国产91精品久久久| 亚洲国产精品系列| 国产成人精品在线播放| 亚洲电影免费观看高清| 成人国产精品久久久久久亚洲| 精品美女永久免费视频| 国产精品入口免费视频一| 黑人与娇小精品av专区| 欧美日韩国产色| 亲子乱一区二区三区电影| 九九热精品视频| 久久精品久久久久| 久久影院模特热| 蜜月aⅴ免费一区二区三区| 久久全国免费视频| 91高清在线免费观看| 久热精品在线视频| 欧美特级www| 97成人在线视频| 91美女高潮出水| 日韩成人在线免费观看| 欧美老女人www| 夜夜嗨av一区二区三区四区| 亚洲欧美国产一区二区三区| 国内精品免费午夜毛片| 91av在线免费观看视频| 久久影视电视剧凤归四时歌| 国产精品爱啪在线线免费观看| 午夜精品在线观看| 亚洲成人精品久久| 久久久精品国产| 精品国产一区久久久| 亚洲肉体裸体xxxx137| 欧美午夜视频在线观看| 亚洲夜晚福利在线观看| 国产亚洲精品久久| 在线性视频日韩欧美| 亚洲美女福利视频网站| 国产亚洲欧洲高清一区| 欧美国产极速在线| 91精品久久久久久久久| 欧美日韩免费网站| 国产精品2018| 欧美精品www在线观看| 日韩av电影在线播放| 亚洲偷熟乱区亚洲香蕉av| 久久久久久这里只有精品| 国产精品成人一区二区| 日本伊人精品一区二区三区介绍| 日韩在线观看网站| 亚洲第一免费播放区| 国产精品久久久久免费a∨大胸| 俺也去精品视频在线观看| 日韩视频免费在线| 欧美在线性爱视频| 色偷偷9999www| 在线播放日韩av| 日韩激情视频在线播放| 热99久久精品| 最近2019中文字幕在线高清| 国产精品丝袜视频| 欧美风情在线观看| 亚洲精品xxxx| 91免费看片在线| 欧美电影免费观看电视剧大全| 欧美电影在线观看完整版| 91经典在线视频| 在线观看国产精品淫| 成人精品网站在线观看| 精品久久久久久久大神国产| 国产视频精品一区二区三区| 国产精品露脸自拍| 亚洲第一区中文99精品| 亚洲欧美国产精品| 性欧美在线看片a免费观看| 国产精品日韩在线| 中文字幕av一区| 国产精品丝袜高跟| 国产性色av一区二区| 91理论片午午论夜理片久久| 亚洲中国色老太| 亚洲夜晚福利在线观看| 日韩在线观看免费av| 欧美高清激情视频| 成人欧美一区二区三区在线| 欧美日韩国产一区在线| xvideos亚洲人网站| 精品美女永久免费视频| 国产又爽又黄的激情精品视频| 亚洲午夜激情免费视频| 亚洲韩国日本中文字幕| 国产精品高潮粉嫩av| 国产在线观看不卡| 国产精品中文字幕在线观看| 日产日韩在线亚洲欧美| 久久精品久久久久久| 亚洲国产精品yw在线观看| 国产精品av免费在线观看| 91网站在线看| 菠萝蜜影院一区二区免费| 国产成人激情小视频| 国产欧美日韩专区发布| 91美女片黄在线观看游戏| 国产精品美乳一区二区免费| 日韩美女视频在线观看| 国产精品夜间视频香蕉| 国产精品视频色| 成人福利网站在线观看11| 国产精品久久在线观看| 日韩午夜在线视频| 日韩精品视频免费专区在线播放| 欧美激情亚洲国产| 国产91免费看片| 亚洲аv电影天堂网| 国产精品av在线播放| 国产精品大片wwwwww| 九九热在线精品视频| 欧美日韩中文字幕在线| 亚洲石原莉奈一区二区在线观看| 亚洲福利在线视频| 久久久久久12| 亚洲第一中文字幕| 久久黄色av网站| 欧美一级淫片aaaaaaa视频| 国产精品日韩在线| 成人在线一区二区| 日韩欧美在线国产| 国产日韩专区在线| 日韩免费在线电影| 热re99久久精品国产66热| 亚洲欧洲一区二区三区久久| 2019国产精品自在线拍国产不卡| 亚洲精品之草原avav久久| 日韩欧美精品在线观看| 91久久精品美女|