文件File操作工具类

package com.csf.etlinger.common.utils;


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;


/**
 * 文件操作类
 * @author mafenglei  2016-04-06
 */
public class FileUtils {
    private static Logger logger = Logger.getLogger(FileUtils.class);
    
    private static final String pathError = "系统该路径不存在!";

    /**
     * 创建文件
     * @param fielPath
     * @return
     * @throws TblPccsException
     */
    public static File createFile(String filePath) throws Exception{
        File file = null;
        file = new File(filePath);
        return file;
    }
    
    /**
     * 单个文件复制
     * @param sourceFile 源文件夹路径
     * @param targetFile 目标文件夹路径
     * @throws TblPccsException
     */
    public static void moveFile(File sourceFile,File targetFile) throws Exception{
        FileInputStream fi = null;
        FileOutputStream fo = null;
        FileChannel in = null;
        FileChannel out = null;
        try{
            fi = new FileInputStream(sourceFile);
            fo = new FileOutputStream(targetFile);
            in = fi.getChannel();
            out = fo.getChannel();
            /**连接2个文件通道,从in通道读取,写入到out通道*/
            in.transferTo(0, in.size(), out);
        }catch (IOException e) {
            e.printStackTrace();
            logger.error(e.getMessage());
        }finally{
            try {
                fi.close();
                fo.close();
                in.close();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
                logger.error(e.getMessage());
            }
        }
    }
    
    /**
     * 把一个目录下的所有文件复制到另一个目录下
     * @param sourceFile
     * @param targetFile
     * @throws TblPccsException
     */
    public static void moveFolder(String  sourcePath,String targetPath) throws Exception{
        try{
            /**拷贝文件是否存在*/
            if(StringUtils.isBlank(sourcePath)){
                logger.info(sourcePath+pathError);
                return;
            }
            /**备份路径*/
            File targetFile = createFile(targetPath);
            if(!targetFile.exists()){
                targetFile.mkdirs();//创建文件夹
                logger.info("目录[" + targetPath + "]不存在,已创建");
            }
            /**拷贝文件*/
            File sourceFile = createFile(sourcePath);
            File[] fileList = sourceFile.listFiles();//目录下所有文件
            if(fileList !=null && fileList.length >0){
                for(File file : fileList){
                    if(!file.isFile()){
                        continue;
                    }
                    String name = file.getName();
                    if(name.endsWith("zip")){
                        continue;
                    }
                    String backFilePath = targetFile.getAbsolutePath()+File.separator+name;
                    File backFile = createFile(backFilePath);
                    moveFile(file,backFile);
                }
            }else{
                logger.info(sourcePath+"该路径下没有文件 备份终止");
                return;
            }
        }catch(Exception e){
            e.printStackTrace();
            logger.error(e.getMessage());
        }
    }
    
    /**
     * 把一个目录下的部分文件移动到另一目录下
     * @param original 源文件路径
     * @param copy     目标文件路径
     * @param number   复制的文件个数
     */
    public static void startMove(String original,String copy,int number){
        try{
            File targetFile = FileUtils.createFile(copy);
            if(!targetFile.exists()){
                targetFile.mkdirs();
                logger.info("目录[" + targetFile + "]不存在,已创建");
            }
            
            //待删除的文件
            List<String> prepDelFile = new ArrayList<>();
            File file = new File(original);
            int  count = 0;
            
            if(file.exists()){
                File [] files = file.listFiles();
                
                if(files.length > 0){
                    
                    for(int i=0 ; i < files.length ; i ++){
                        count ++;
                        String prefectFileName = original + File.separator + files[i].getName();
                        String copyPath = copy + File.separator + files[i].getName();
                        
                        /* 文件复制 **/
                        FileUtils.singleFileReplication(prefectFileName,copyPath);
                        
                        //放入待删除内存
                        prepDelFile.add(prefectFileName);
                        
                        //平分文件
                        if(count == number){
                            break;
                        }
                    }
                }else{
                    logger.info("目录 [" +original+ "] 下 没有文件");
                }
            }else{
                logger.info("源文件目录[" +original +"] 不存在!");
            }
            logger.info("目录 【" +original +"】下 "+number+"个文件已成功复制到 【" + copy  + " 】目录下" );
            
            /* 文件删除 **/
            for(int i=0 ; i < prepDelFile.size() ; i ++){
                FileUtils.deleteOneFile(prepDelFile.get(i));//文件删除
            }
            
            logger.info("【" +original+ "】目录下"+number+" 原文件  已成功删除!");
        
        }catch(Exception e){
            logger.error(e);
            e.printStackTrace();
        }
    }
    
    /**
     * 单个文件复制
     * @param fatherPath 源文件路径
     * @param copyPath   复制文件路径
     * @throws IOException
     */
    public static void singleFileReplication(String fatherPath,String copyPath) {
        try{
            //
            FileInputStream fis = new FileInputStream(fatherPath);
            BufferedInputStream bufis = new BufferedInputStream(fis);
            
            //
            FileOutputStream fos = new FileOutputStream(copyPath);
            BufferedOutputStream bufos = new BufferedOutputStream(fos);
     
            int len = 0;
            while ((len = bufis.read()) != -1) {
                bufos.write(len);
            }
            bufis.close();
            bufos.close();
        }catch(Exception e){
            logger.error(e.getMessage());
            e.printStackTrace();
        }
    }
    
    /**
     * 文件夹下指定文件复制
     * @param sourcePath
     * @param targetPath
     * @param startStr 文件名以开头的字符串
     * @throws TblPccsException
     */
    public void moveAppointFile(String sourcePath,String targetPath,String startStr) throws Exception{
        try{
            /**拷贝文件是否存在*/
            if(StringUtils.isBlank(sourcePath)){
                logger.info(sourcePath+pathError);
                return;
            }
            /**备份文件夹*/
            File targetFile = createFile(targetPath);
            if(!targetFile.exists()){
                targetFile.mkdirs();
                logger.info("目录[" + targetPath + "]不存在,已创建");
            }
            /**拷贝文件*/
            File sourceFile = createFile(sourcePath);
            File[] fileList = sourceFile.listFiles();
            if(fileList!=null && fileList.length > 0){
                for(File file : fileList){
                    if(!file.isFile()){
                        continue;
                    }
                    /**指定文件*/
                    String fileName = file.getName();
                    if(fileName.startsWith(startStr)){
                        String backFilePath  = targetFile.getAbsolutePath()+File.separator+file.getName();
                        File backFile = createFile(backFilePath);
                        moveFile(file, backFile);
                    }
                }
            }else{
                logger.info(sourcePath+"该路径下没有文件");
                return;
            }
            
        }catch(Exception e){
            e.printStackTrace();
            logger.error(e.getMessage());
        }
    }
    
    
    /**
     * 删除指定一个文件
     * @param file
     * @throws TblPccsException
     */
    public static void delFile(File file) throws Exception{
        if(file.exists()){
            file.delete();
        }else{
            logger.info(file.getName()+"不存在!");
        }

    }
    
    /**
     * 删除动作
     * @param path
     */
    public static void deleteAll(String path){
        try{
            FileUtils.deleteFiles(path);//文件删除
            Thread.sleep(1000*2);
            FileUtils.delete(path); //文件夹删除
        }catch(Exception e){
            logger.error(e);
            e.printStackTrace();
        }
    }
    
    /**
     * 删除指定目录
     * @param path
     */
    public static void delete(String path){
        File file = new File(path);
        if(file.exists()){
            file.delete();
            logger.info("指定目录 " + path + "已成功删除");
        }
    }
    
    /**
     * 删除指定的一个文件
     * @param fileName
     */
    public static void deleteOneFile(String fileName){
        File file = new File(fileName);
        
        if(file.exists()){
            file.delete();
        }else{
            logger.info("指定文件 【" +file  +"】不存在,无法删除");
        }
        
    }
    
    /**
     * 删除指定目录下的所有文件
     * @param delPath
     */
    public static void deleteFiles(String delPath){
        File file = new File(delPath);
        if(file.exists()){
            File [] files = file.listFiles();
            if(files != null || files.length > 0){
                for(int i =0; i<files.length; i ++){
                    if(files[i].isDirectory()){
                        deleteFiles(delPath+File.separator+files[i].getName());
                    }
                    files[i].delete();
                    logger.info( delPath + File.separator + files[i] + "文件成功删除");
                    
                }
            }else{
                logger.info(delPath + "该目录下没有文件 ,终止删除操作");
            }
        }else{
            logger.info(delPath + "目录不存在, 终止删除操作");
        }
    }
    
//    @Test
    public static void main(String[] agrs){
//        deleteFiles("C:\\Users\\fenglei.ma\\Desktop\\数据读取\\test1");
        delete("C:\\Users\\fenglei.ma\\Desktop\\数据读取\\test1");
        
//        String sourcePath = "C:\\Users\\fenglei.ma\\Desktop\\数据读取\\test";
//        String targetPath = "C:\\Users\\fenglei.ma\\Desktop\\数据读取\\test1";
//        try {
//            moveFolder(sourcePath,targetPath);
//            System.out.println("运行结束");
//        } catch (Exception e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        }
    }

}

猜你喜欢

转载自www.cnblogs.com/xiaolei2017/p/8944718.html