栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

使用jdk7的nio2操作文件拷贝和剪切示例

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用jdk7的nio2操作文件拷贝和剪切示例

复制代码 代码如下:
package com.xyq.io.simply.core;

import java.io.File;
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.util.ArrayList;
import java.util.List;

import com.xyq.io.enums.FileTypeMode;
import com.xyq.io.enums.OptionFile_TYPE;
import com.xyq.io.inf.NewNIoInf;
import com.xyq.io.util.FindFileUtil;
import com.xyq.io.util.MD5Util;

public class NewNIO implements NewNIoInf {

 
 @Override
 public boolean copeOrMoveFile(String src, String tar, OptionFile_TYPE type) {

  return realCopeOrMoveFile(Paths.get(src), tar, type);
 }

 private boolean realCopeOrMoveFile(Path srcPath, String tar,
   OptionFile_TYPE type) {

  Path tarPath = null;
  boolean copeSuccess = true;
  // 必须原始文件存在
  if (srcPath.toFile().exists()) {
   
   if (isDir(tar))
    tarPath = Paths.get(tar + File.separator
      + srcPath.toFile().getName());
   else
    tarPath = Paths.get(tar);
   
   for (int i = 0; i < 3; i++) {
    
    if (tarPath.toFile().exists()) {
     
     // 拷贝
     if (OptionFile_TYPE.COPE.equals(type)) {
      if (equalsFile(srcPath.toFile(), tarPath.toFile()))
       return true;
      else
       copeSuccess = copeFile(srcPath, tarPath, true);
     }
     
     else if (OptionFile_TYPE.MOVE.equals(type)) {
      if (equalsFile(srcPath.toFile(), tarPath.toFile())) {
       if (!srcPath.toFile().getAbsoluteFile()
         .equals(tarPath.toFile().getAbsoluteFile()))
        try {
         Files.delete(srcPath);
         
         if (!copeSuccess)
          copeSuccess = true;
        } catch (IOException e) {
         copeSuccess = false;
        }
       // 前面因为有异常的可能就不直接return,这里就可以了
       else
        return true;
      } else
       copeSuccess = moveFile(srcPath, tarPath);
     }
    }
    
    else {
     File par = tarPath.getParent().toFile();
     
     if (!par.exists() && !par.mkdirs())
      copeSuccess = false;
     else if (OptionFile_TYPE.COPE.equals(type))
      copeSuccess = copeFile(srcPath, tarPath, false);
     else if (OptionFile_TYPE.MOVE.equals(type))
      copeSuccess = moveFile(srcPath, tarPath);
    }
    // 如果操作成功,跳出循环
    if (copeSuccess)
     break;
   }
  } else
   copeSuccess = false;
  return copeSuccess;
 }

 

 private boolean copeFile(Path srcPath, Path tarPath, boolean isExist) {

  if (isExist)
   try {
    Files.copy(srcPath, tarPath,
      StandardCopyOption.REPLACE_EXISTING,
      StandardCopyOption.COPY_ATTRIBUTES);
   } catch (IOException e) {
    return false;
   }
  else
   try {
    Files.copy(srcPath, tarPath, StandardCopyOption.COPY_ATTRIBUTES);
   } catch (IOException e) {
    return false;
   }
  return true;
 }

 
 private boolean moveFile(Path srcPath, Path tarPath) {

  try {
   Files.move(srcPath, tarPath, StandardCopyOption.ATOMIC_MOVE);
  } catch (IOException e) {
   return false;
  }
  return true;
 }

 
 private boolean isDir(String path) {

  char lastC = path.charAt(path.length() - 1);
  if (lastC == '\' || lastC == '/')
   return true;
  return false;
 }

 

 public boolean equalsFile(File src, File tar) {

  // 如果两个文件的长度不一样,那么肯定两个文件是不一样的
  if (src.length() != tar.length())
   return false;
  if (!src.getName().equals(tar.getName())
    || src.lastModified() != tar.lastModified())
   return MD5Util.EncoderFileByMd5(src).equals(
     MD5Util.EncoderFileByMd5(tar));
  return true;
 }

 
 @Override
 public void copeOrMoveDirectory(String src, final String tar, int tierSize,
   final OptionFile_TYPE type) {

  if (!new File(src).exists())
   throw new RuntimeException("找不到原始文件夹" + src);
  final int rootPos = getRootPosition(new File(src), tierSize);
  if (rootPos != -1) {
   try {
    Files.walkFileTree(Paths.get(src), new FileVisitor() {

     String tarDirString = null;

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

      tarDirString = dir.toFile().getAbsolutePath();
      tarDirString = tar + tarDirString.substring(rootPos)
        + File.separator;
      return FileVisitResult.CONTINUE;
     }

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

      File f = file.toFile();
      if (f.exists() && f.canRead() && !f.isHidden())
       realCopeOrMoveFile(file, tarDirString, type);
      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 {
      return FileVisitResult.CONTINUE;
     }
    });
   } catch (Exception e) {
    e.printStackTrace();
   }
   // 如果是剪切操作,并且剪切成功,那么就要删除所有文件夹
   if (OptionFile_TYPE.MOVE.equals(type) && isBlockDir(src))
    delDir(src);
  } else
   throw new RuntimeException("指定父类文件夹层次错误~~~");
 }

 

 private int getRootPosition(File file, int tier) {

  if (file != null) {
   String path = file.getAbsolutePath();
   int cc = 0;
   for (int i = path.length() - 1; i >= 0; i--) {
    if (path.charAt(i) == '\') {
     cc++;
     if (cc == tier + 1) {
      cc = i;
      return cc;
     }
    }
   }
  }
  return -1;
 }

 
 private boolean isBlockDir(String dirPath) {

  File dir = new File(dirPath);
  File[] dirList = dir.listFiles();
  if (dirList == null || dirList.length == 0)
   return true;
  else {
   // 寻找文件
   for (File f : dirList)
    if (!f.isDirectory())
     return false;
  }
  return true;
 }

 
 private void delDir(String dirPath) {

  File dir = new File(dirPath);
  File[] dirList = dir.listFiles();
  if (dirList == null || dirList.length == 0)
   dir.delete();
  else {
   // 删除所有文件
   for (File f : dirList)
    if (f.isDirectory())
     delDir(f.getAbsolutePath());
    else
     f.delete();
   // 删除完当前文件夹下所有文件后删除文件夹
   dirList = dir.listFiles();
   if (dirList.length == 0)
    dir.delete();
  }
 }

 
 @Override
 public List findFilesByType(String dir, String[] keys,
   boolean isMatchCase) throws IOException {

  List list = new ArrayList();
  Files.walkFileTree(Paths.get(dir), new FindFileUtil(keys, isMatchCase,
    list, FileTypeMode.TYPES));
  return list;
 }

 
 @Override
 public List findFilesByName(String dir, String[] keys,
   boolean isMatchCase) throws IOException {

  List list = new ArrayList();
  Files.walkFileTree(Paths.get(dir), new FindFileUtil(keys, isMatchCase,
    list, FileTypeMode.NAMES));
  return list;
 }

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

  NewNIoInf inf = new NewNIO();
  inf.copeOrMoveFile("e:/cc/dd/11.txt", "e:/XX/xxx/zzz/",
    OptionFile_TYPE.COPE);
  inf.copeOrMoveDirectory("e:\BB\CC\DD", "e:\",1, OptionFile_TYPE.MOVE);
  System.out.println(inf.findFilesByName("D:\workspace", new String[] { "txt" },
    false).size());

 }

}
---------------------------
package com.xyq.io.enums;


public enum FileTypeMode {

 TYPES,NAMES
}

---------------------------------
package com.xyq.io.enums;


public enum OptionFile_TYPE {

 COPE,MOVE;
}
---------------------
package com.xyq.io.inf;

import java.io.IOException;
import java.util.List;

import com.xyq.io.enums.OptionFile_TYPE;

public interface NewNIoInf {

 
 public boolean copeOrMoveFile(String src,String tar,OptionFile_TYPE type);

 
 public void copeOrMoveDirectory(String src,String tar,int tierSize,OptionFile_TYPE type);

 
 List findFilesByType(String dir, String[] keys, boolean isMatchCase)
   throws IOException;

 
 List findFilesByName(String dir, String[] keys, boolean isMatchCase)
   throws IOException;
}
--------------------
package com.xyq.io.util;

import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.List;

import com.xyq.io.enums.FileTypeMode;

public class FindFileUtil extends SimpleFileVisitor {

 
 private String[] keyArray = null;
 private boolean isMatchCase;
 private List resultList;
 private FileTypeMode mode;

 public FindFileUtil(String[] keyArray, boolean isMatchCase,
   List resultList, FileTypeMode mode) {

  this.keyArray = keyArray;
  this.isMatchCase = isMatchCase;
  this.resultList = resultList;
  this.mode = mode;
 }

 @SuppressWarnings("unused")
 private FindFileUtil() {
 }

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

  File f = file.toFile();
  if (f.exists() && f.canRead() && !f.isHidden())
  if (this.keyArray != null) {
   for (String key : this.keyArray) {
    if (!this.isMatchCase)
     key = key.toLowerCase();
    if (matchFile(file, this.mode, key, isMatchCase))
     resultList.add(file.toString());
   }
  }
  return FileVisitResult.CONTINUE;
 }

 
 private boolean matchFile(Path file, FileTypeMode mode, String key,
   boolean isMatchCase) {

  File f = file.toFile();
  if (f.exists() && f.canRead() && !f.isHidden()
    && !"System Volume Information".equals(f.getName())) {
   String fileName = null;
   if (FileTypeMode.TYPES.equals(mode)) {

    fileName = file.toString();
    return isMatchCase ? fileName.endsWith(key) : fileName
      .toLowerCase().endsWith(key);
   } else if (FileTypeMode.NAMES.equals(mode)) {
    fileName = file.toFile().getName();
    return isMatchCase ? (fileName.indexOf(key) == -1 ? false
      : true)
      : (fileName.toLowerCase().indexOf(key) == -1 ? false
        : true);
   }
  }
  return false;
 }

 @Override
 public FileVisitResult visitFileFailed(Path file, IOException exc)
   throws IOException {
  //如果错误信息中包含X:System Volume Information,这是表示系统的隐藏盘,是不能读的
  System.out.println(exc.getMessage());
  return FileVisitResult.CONTINUE;
 }
}
--------------------------
package com.xyq.io.util;

import java.io.Closeable;

public class CloseIoUtil {

 
 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;
    }
   }
  }
 }
}
-----------------------------
package com.xyq.io.util;

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

import sun.misc.base64Encoder;

public class MD5Util {
 
 public static String EncoderStringByMd5(String str)
   throws NoSuchAlgorithmException, UnsupportedEncodingException {

  // 确定计算方法
  MessageDigest md5 = MessageDigest.getInstance("MD5");
  base64Encoder base64en = new base64Encoder();

  // 加密后的字符串
  String newstr = base64en.encode(md5.digest(str.getBytes("utf-8")));
  return newstr;
 }

 
 public static String EncoderFileByMd5(File file) {

  String newstr = null;
  FileInputStream fis = null;
  BufferedInputStream bis = null;
  try {
   // 确定计算方法
   MessageDigest md5 = MessageDigest.getInstance("MD5");
   base64Encoder base64en = new base64Encoder();
   byte[] buffer = new byte[1024];
   fis = new FileInputStream(file);
   bis = new BufferedInputStream(fis);
   int length = -1;
   while ((length = bis.read(buffer)) != -1)
    md5.update(buffer, 0, length);
   // 加密后的字符串
   newstr = base64en.encode(md5.digest());
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   CloseIoUtil.closeAll(bis, fis);
  }
  return newstr;
 }
 public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException {

  
  System.out.println(EncoderStringByMd5("23"));
 }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/152568.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号