Java文件操作类封装

jopen 10年前

java文件操作类,简单封装,封装了复制,剪切,删除目录,压缩解压zip,等常用功能。

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));          }      }        }