Java文件操作类封装

package com.wiker;
 
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.security.MessageDigest;
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
 
 
/**
  * @author Wiker Yong Email:<a href="mailto:wikeryong@gmail.com">wikeryong@gmail.com</a>
  * @date 2013-11-8 下午6:21:45
  * @version 1.0-SNAPSHOT
  */
@SuppressWarnings ( "resource" )
public class FileUtils {
     
     /**
      * 获取文件MD5值
      *
      * @param file
      * @return
      */
     public static String getMd5ByFile(File file) {
         String value = null ;
         FileInputStream in = null ;
         try {
             in = new FileInputStream(file);
             MappedByteBuffer byteBuffer = in.getChannel().map(FileChannel.MapMode.READ_ONLY, 0 ,
                     file.length());
             MessageDigest md5 = MessageDigest.getInstance( "MD5" );
             md5.update(byteBuffer);
             BigInteger bi = new BigInteger( 1 , md5.digest());
             value = bi.toString( 16 );
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             if ( null != in) {
                 try {
                     in.close();
                 } catch (IOException e) {
                     e.printStackTrace();
                 }
             }
         }
         return value;
     }
     
     /**
      * 获取文件大小
      *
      * @param file
      * @return
      */
     public static long getFileLength(File file)
             throws IOException {
         FileInputStream fis = null ;
         fis = new FileInputStream(file);
         return fis.available();
     }
     
     /**
      * 读取文件到二进制
      *
      * @author WikerYong Email:<a href="#">yw_312@foxmail.com</a>
      * @version 2012-3-23 上午11:47:06
      * @param file
      * @return
      * @throws IOException
      */
     public static byte [] getBytesFromFile(File file)
             throws IOException {
         InputStream is = new FileInputStream(file);
         
         long length = file.length();
         
         if (length > Integer.MAX_VALUE) {
             // File is too large
         }
         
         byte [] bytes = new byte [( int ) length];
         
         // Read in the bytes
         int offset = 0 ;
         int numRead = 0 ;
         while (offset < bytes.length
                 && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0 ) {
             offset += numRead;
         }
         
         // Ensure all the bytes have been read in
         if (offset < bytes.length) {
             throw new IOException( "不能读取文件: " + file.getName());
         }
         
         is.close();
         return bytes;
     }
     
     /**
      * 获取标准文件大小,如30KB,15.5MB
      *
      * @param file
      * @return
      * @throws IOException
      */
     public static String getFileSize(File file)
             throws IOException {
         long size = getFileLength(file);
         DecimalFormat df = new DecimalFormat( "###.##" );
         float f;
         if (size < 1024 * 1024 ) {
             f = ( float ) (( float ) size / ( float ) 1024 );
             return (df.format( new Float(f).doubleValue()) + " KB" );
         } else {
             f = ( float ) (( float ) size / ( float ) ( 1024 * 1024 ));
             return (df.format( new Float(f).doubleValue()) + " MB" );
         }
         
     }
     
     /**
      * 复制文件
      *
      * @param f1
      *            源文件
      * @param f2
      *            目标文件
      * @throws Exception
      */
     public static void copyFile(File f1, File f2)
             throws Exception {
         int length = 2097152 ;
         FileInputStream in = new FileInputStream(f1);
         FileOutputStream out = new FileOutputStream(f2);
         FileChannel inC = in.getChannel();
         FileChannel outC = out.getChannel();
         ByteBuffer b = null ;
         while ( true ) {
             if (inC.position() == inC.size()) {
                 inC.close();
                 outC.close();
             }
             if ((inC.size() - inC.position()) < length) {
                 length = ( int ) (inC.size() - inC.position());
             } else
                 length = 2097152 ;
             b = ByteBuffer.allocateDirect(length);
             inC.read(b);
             b.flip();
             outC.write(b);
             outC.force( false );
         }
     }
     
     /**
      * 检查文件是否存在
      *
      * @param fileName
      * @return
      * @throws IOException
      */
     public static boolean existFile(String fileName)
             throws IOException {
         File file = new File(fileName);
         if (!file.exists()) {
             throw new IOException( "文件未找到:" + fileName);
         }
         return file.exists();
     }
     
     /**
      * 删除文件
      *
      * @param fileName
      */
     public static void deleteFile(String fileName)
             throws IOException {
         File file = new File(fileName);
         if (!file.exists()) {
             throw new IOException( "文件未找到:" + fileName);
         }
         file.delete();
     }
     
     /**
      * 读取文件到字符串
      *
      * @param fileName
      * @return
      * @throws IOException
      */
     public static String readFile(String fileName)
             throws IOException {
         File file = new File(fileName);
         if (!file.exists()) {
             throw new IOException( "文件未找到:" + fileName);
         }
         
         BufferedReader in = new BufferedReader( new FileReader(file));
         StringBuffer sb = new StringBuffer();
         String str = "" ;
         while ((str = in.readLine()) != null ) {
             sb.append(str);
         }
         in.close();
         return sb.toString();
     }
     
     /**
      * 获取目录所有所有文件和文件夹
      *
      * @param fileName
      * @return
      * @throws IOException
      */
     public static List<File> listFiles(String fileName)
             throws IOException {
         File file = new File(fileName);
         if (!file.exists()) {
             throw new IOException( "文件未找到:" + fileName);
         }
         return Arrays.asList(file.listFiles());
     }
     
     /**
      * 创建目录
      *
      * @param dir
      */
     public static void mkdir(String dir) {
         String dirTemp = dir;
         File dirPath = new File(dirTemp);
         if (!dirPath.exists()) {
             dirPath.mkdir();
         }
     }
     
     /**
      * 新建文件
      *
      * @param fileName
      *            String 包含路径的文件名 如:E:\phsftp\src\123.txt
      * @param content
      *            String 文件内容
      */
     public static void createNewFile(String fileName, String content)
             throws IOException {
         String fileNameTemp = fileName;
         File filePath = new File(fileNameTemp);
         if (!filePath.exists()) {
             filePath.createNewFile();
         }
         FileWriter fw = new FileWriter(filePath);
         PrintWriter pw = new PrintWriter(fw);
         String strContent = content;
         pw.println(strContent);
         pw.flush();
         pw.close();
         fw.close();
         
     }
     
     /**
      * 删除文件夹
      *
      * @param folderPath
      *            文件夹路径
      */
     public static void delFolder(String folderPath) {
         // 删除文件夹里面所有内容
         delAllFile(folderPath);
         String filePath = folderPath;
         java.io.File myFilePath = new java.io.File(filePath);
         // 删除空文件夹
         myFilePath.delete();
     }
     
     /**
      * 删除文件夹里面的所有文件
      *
      * @param path
      *            文件夹路径
      */
     public static void delAllFile(String path) {
         File file = new File(path);
         if (!file.exists()) {
             return ;
         }
         if (!file.isDirectory()) {
             return ;
         }
         String[] childFiles = file.list();
         File temp = null ;
         for ( int i = 0 ; i < childFiles.length; i++) {
             // File.separator与系统有关的默认名称分隔符
             // 在UNIX系统上,此字段的值为'/';在Microsoft Windows系统上,它为 '\'。
             if (path.endsWith(File.separator)) {
                 temp = new File(path + childFiles[i]);
             } else {
                 temp = new File(path + File.separator + childFiles[i]);
             }
             if (temp.isFile()) {
                 temp.delete();
             }
             if (temp.isDirectory()) {
                 delAllFile(path + File.separatorChar + childFiles[i]); // 先删除文件夹里面的文件
                 delFolder(path + File.separatorChar + childFiles[i]); // 再删除空文件夹
             }
         }
     }
     
     /**
      * 复制单个文件,传统方式
      *
      * @param srcFile
      *            包含路径的源文件 如:E:/phsftp/src/abc.txt
      * @param dirDest
      *            目标文件目录;若文件目录不存在则自动创建 如:E:/phsftp/dest
      * @throws IOException
      */
     public static void copyFile(String srcFile, String dirDest)
             throws IOException {
         FileInputStream in = new FileInputStream(srcFile);
         mkdir(dirDest);
         FileOutputStream out = new FileOutputStream(dirDest + "/" + new File(srcFile).getName());
         int len;
         byte buffer[] = new byte [ 1024 ];
         while ((len = in.read(buffer)) != - 1 ) {
             out.write(buffer, 0 , len);
         }
         out.flush();
         out.close();
         in.close();
     }
     
     /**
      * 复制文件夹
      *
      * @param oldPath
      *            String 源文件夹路径 如:E:/phsftp/src
      * @param newPath
      *            String 目标文件夹路径 如:E:/phsftp/dest
      * @return boolean
      */
     public static void copyFolder(String oldPath, String newPath)
             throws IOException {
         // 如果文件夹不存在 则新建文件夹
         mkdir(newPath);
         File file = new File(oldPath);
         String[] files = file.list();
         File temp = null ;
         for ( int i = 0 ; i < files.length; i++) {
             if (oldPath.endsWith(File.separator)) {
                 temp = new File(oldPath + files[i]);
             } else {
                 temp = new File(oldPath + File.separator + files[i]);
             }
             
             if (temp.isFile()) {
                 FileInputStream input = new FileInputStream(temp);
                 FileOutputStream output = new FileOutputStream(newPath + "/"
                         + (temp.getName()).toString());
                 byte [] buffer = new byte [ 1024 * 2 ];
                 int len;
                 while ((len = input.read(buffer)) != - 1 ) {
                     output.write(buffer, 0 , len);
                 }
                 output.flush();
                 output.close();
                 input.close();
             }
             if (temp.isDirectory()) { // 如果是子文件夹
                 copyFolder(oldPath + "/" + files[i], newPath + "/" + files[i]);
             }
         }
     }
     
     /**
      * 移动文件到指定目录
      *
      * @param oldPath
      *            包含路径的文件名 如:E:/phsftp/src/ljq.txt
      * @param newPath
      *            目标文件目录 如:E:/phsftp/dest
      */
     public static void moveFile(String oldPath, String newPath)
             throws IOException {
         copyFile(oldPath, newPath);
         deleteFile(oldPath);
     }
     
     /**
      * 移动文件到指定目录,不会删除文件夹
      *
      * @param oldPath
      *            源文件目录 如:E:/phsftp/src
      * @param newPath
      *            目标文件目录 如:E:/phsftp/dest
      */
     public static void moveFiles(String oldPath, String newPath)
             throws IOException {
         copyFolder(oldPath, newPath);
         delAllFile(oldPath);
     }
     
     /**
      * 移动文件到指定目录,会删除文件夹
      *
      * @param oldPath
      *            源文件目录 如:E:/phsftp/src
      * @param newPath
      *            目标文件目录 如:E:/phsftp/dest
      */
     public static void moveFolder(String oldPath, String newPath)
             throws IOException {
         copyFolder(oldPath, newPath);
         delFolder(oldPath);
     }
     
     /**
      * 解压zip文件
      * 说明:本程序通过ZipOutputStream和ZipInputStream实现了zip压缩和解压功能.
      * 问题:由于java.util.zip包并不支持汉字,当zip文件中有名字为中文的文件时,
      * 就会出现异常:"Exception  in thread "main " java.lang.IllegalArgumentException 
      * at java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:285)
      * @param srcDir
      *            解压前存放的目录
      * @param destDir
      *            解压后存放的目录
      * @throws Exception
      */
     public static void unZip(String srcDir, String destDir)
             throws IOException {
         int leng = 0 ;
         byte [] b = new byte [ 1024 * 2 ];
         /** 获取zip格式的文件 **/
         File[] zipFiles = new ExtensionFileFilter( "zip" ).getFiles(srcDir);
         if (zipFiles != null && ! "" .equals(zipFiles)) {
             for ( int i = 0 ; i < zipFiles.length; i++) {
                 File file = zipFiles[i];
                 /** 解压的输入流 * */
                 ZipInputStream zis = new ZipInputStream( new FileInputStream(file));
                 ZipEntry entry = null ;
                 while ((entry = zis.getNextEntry()) != null ) {
                     File destFile = null ;
                     if (destDir.endsWith(File.separator)) {
                         destFile = new File(destDir + entry.getName());
                     } else {
                         destFile = new File(destDir + File.separator + entry.getName());
                     }
                     /** 把解压包中的文件拷贝到目标目录 * */
                     FileOutputStream fos = new FileOutputStream(destFile);
                     while ((leng = zis.read(b)) != - 1 ) {
                         fos.write(b, 0 , leng);
                     }
                     fos.close();
                 }
                 zis.close();
             }
         }
     }
     
     /**
      * 压缩文件
      * 说明:本程序通过ZipOutputStream和ZipInputStream实现了zip压缩和解压功能.
      * 问题:由于java.util.zip包并不支持汉字,当zip文件中有名字为中文的文件时,
      * 就会出现异常:"Exception  in thread "main " java.lang.IllegalArgumentException 
      * at java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:285)
      * @param srcDir
      *            压缩前存放的目录
      * @param destDir
      *            压缩后存放的目录
      * @throws Exception
      */
     public static void zip(String srcDir, String destDir)
             throws IOException {
         String tempFileName = null ;
         byte [] buf = new byte [ 1024 * 2 ];
         int len;
         // 获取要压缩的文件
         File[] files = new File(srcDir).listFiles();
         if (files != null ) {
             for (File file : files) {
                 if (file.isFile()) {
                     FileInputStream fis = new FileInputStream(file);
                     BufferedInputStream bis = new BufferedInputStream(fis);
                     if (destDir.endsWith(File.separator)) {
                         tempFileName = destDir + file.getName() + ".zip" ;
                     } else {
                         tempFileName = destDir + File.separator + file.getName() + ".zip" ;
                     }
                     FileOutputStream fos = new FileOutputStream(tempFileName);
                     BufferedOutputStream bos = new BufferedOutputStream(fos);
                     ZipOutputStream zos = new ZipOutputStream(bos); // 压缩包
                     
                     ZipEntry ze = new ZipEntry(file.getName()); // 压缩包文件名
                     zos.putNextEntry(ze); // 写入新的ZIP文件条目并将流定位到条目数据的开始处
                     
                     while ((len = bis.read(buf)) != - 1 ) {
                         zos.write(buf, 0 , len);
                         zos.flush();
                     }
                     bis.close();
                     zos.close();
                     
                 }
             }
         }
     }
     
     /**
      * 读取数据
      *
      * @param inSream
      * @param charsetName
      * @return
      * @throws Exception
      */
     public static String readData(InputStream inSream, String charsetName)
             throws IOException {
         ByteArrayOutputStream outStream = new ByteArrayOutputStream();
         byte [] buffer = new byte [ 1024 ];
         int len = - 1 ;
         while ((len = inSream.read(buffer)) != - 1 ) {
             outStream.write(buffer, 0 , len);
         }
         byte [] data = outStream.toByteArray();
         outStream.close();
         inSream.close();
         return new String(data, charsetName);
     }
     
     /**
      * 一行一行读取文件,适合字符读取,若读取中文字符时会出现乱码
      *
      * @param path
      * @return
      * @throws Exception
      */
     public static Set<String> readFileLine(String path)
             throws IOException {
         Set<String> datas = new HashSet<String>();
         FileReader fr = new FileReader(path);
         BufferedReader br = new BufferedReader(fr);
         String line = null ;
         while ((line = br.readLine()) != null ) {
             datas.add(line);
         }
         br.close();
         fr.close();
         return datas;
     }
     
     public static void main(String[] args) {
         try {
             unZip( "c:/test" , "c:/test" );
         } catch (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
     }
     
}
 
 
class ExtensionFileFilter
         implements FileFilter {
     
     private String extension;
     
     public ExtensionFileFilter(String extension) {
         this .extension = extension;
     }
     
     public File[] getFiles(String srcDir) throws IOException {
         return (File[]) FileUtils.listFiles(srcDir).toArray();
     }
     
     public boolean accept(File file) {
         if (file.isDirectory()) {
             return false ;
         }
         
         String name = file.getName();
         // find the last
         int idx = name.lastIndexOf( "." );
         if (idx == - 1 ) {
             return false ;
         } else if (idx == name.length() - 1 ) {
             return false ;
         } else {
             return this .extension.equals(name.substring(idx + 1 ));
         }
     }
     
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值