首页 > 代码库 > FileUtil

FileUtil

  1 package com.gootrip.util;  2   3 import java.io.BufferedReader;  4 import java.io.File;  5 import java.io.FileInputStream;  6 import java.io.FileOutputStream;  7 import java.io.FileReader;  8 import java.io.FileWriter;  9 import java.io.FilenameFilter; 10 import java.io.IOException; 11 import java.net.MalformedURLException; 12 import java.net.URL; 13 import java.util.ArrayList; 14 import java.util.Enumeration; 15 import java.util.Hashtable; 16  17 import javax.swing.filechooser.FileFilter; 18  19 /** 20  * 此类中封装一些常用的文件操作。 21  * 所有方法都是静态方法,不需要生成此类的实例, 22  * 为避免生成此类的实例,构造方法被申明为private类型的。 23  * @since  1.0 24  */ 25  26 public class FileUtil { 27   /** 28    * 私有构造方法,防止类的实例化,因为工具类不需要实例化。 29    */ 30   private FileUtil() { 31  32   } 33  34   /** 35    * 修改文件的最后访问时间。 36    * 如果文件不存在则创建该文件。 37    * <b>目前这个方法的行为方式还不稳定,主要是方法有些信息输出,这些信息输出是否保留还在考虑中。</b> 38    * @param file 需要修改最后访问时间的文件。 39    * @since  1.0 40    */ 41   public static void touch(File file) { 42     long currentTime = System.currentTimeMillis(); 43     if (!file.exists()) { 44       System.err.println("file not found:" + file.getName()); 45       System.err.println("Create a new file:" + file.getName()); 46       try { 47         if (file.createNewFile()) { 48           System.out.println("Succeeded!"); 49         } 50         else { 51           System.err.println("Create file failed!"); 52         } 53       } 54       catch (IOException e) { 55         System.err.println("Create file failed!"); 56         e.printStackTrace(); 57       } 58     } 59     boolean result = file.setLastModified(currentTime); 60     if (!result) { 61       System.err.println("touch failed: " + file.getName()); 62     } 63   } 64  65   /** 66    * 修改文件的最后访问时间。 67    * 如果文件不存在则创建该文件。 68    * <b>目前这个方法的行为方式还不稳定,主要是方法有些信息输出,这些信息输出是否保留还在考虑中。</b> 69    * @param fileName 需要修改最后访问时间的文件的文件名。 70    * @since  1.0 71    */ 72   public static void touch(String fileName) { 73     File file = new File(fileName); 74     touch(file); 75   } 76  77   /** 78    * 修改文件的最后访问时间。 79    * 如果文件不存在则创建该文件。 80    * <b>目前这个方法的行为方式还不稳定,主要是方法有些信息输出,这些信息输出是否保留还在考虑中。</b> 81    * @param files 需要修改最后访问时间的文件数组。 82    * @since  1.0 83    */ 84   public static void touch(File[] files) { 85     for (int i = 0; i < files.length; i++) { 86       touch(files[i]); 87     } 88   } 89  90   /** 91    * 修改文件的最后访问时间。 92    * 如果文件不存在则创建该文件。 93    * <b>目前这个方法的行为方式还不稳定,主要是方法有些信息输出,这些信息输出是否保留还在考虑中。</b> 94    * @param fileNames 需要修改最后访问时间的文件名数组。 95    * @since  1.0 96    */ 97   public static void touch(String[] fileNames) { 98     File[] files = new File[fileNames.length]; 99     for (int i = 0; i < fileNames.length; i++) {100       files[i] = new File(fileNames[i]);101     }102     touch(files);103   }104 105   /**106    * 判断指定的文件是否存在。107    * @param fileName 要判断的文件的文件名108    * @return 存在时返回true,否则返回false。109    * @since  1.0110    */111   public static boolean isFileExist(String fileName) {112     return new File(fileName).isFile();113   }114 115   /**116    * 创建指定的目录。117    * 如果指定的目录的父目录不存在则创建其目录书上所有需要的父目录。118    * <b>注意:可能会在返回false的时候创建部分父目录。</b>119    * @param file 要创建的目录120    * @return 完全创建成功时返回true,否则返回false。121    * @since  1.0122    */123   public static boolean makeDirectory(File file) {124     File parent = file.getParentFile();125     if (parent != null) {126       return parent.mkdirs();127     }128     return false;129   }130 131   /**132    * 创建指定的目录。133    * 如果指定的目录的父目录不存在则创建其目录书上所有需要的父目录。134    * <b>注意:可能会在返回false的时候创建部分父目录。</b>135    * @param fileName 要创建的目录的目录名136    * @return 完全创建成功时返回true,否则返回false。137    * @since  1.0138    */139   public static boolean makeDirectory(String fileName) {140     File file = new File(fileName);141     return makeDirectory(file);142   }143 144   /**145    * 清空指定目录中的文件。146    * 这个方法将尽可能删除所有的文件,但是只要有一个文件没有被删除都会返回false。147    * 另外这个方法不会迭代删除,即不会删除子目录及其内容。148    * @param directory 要清空的目录149    * @return 目录下的所有文件都被成功删除时返回true,否则返回false.150    * @since  1.0151    */152   public static boolean emptyDirectory(File directory) {153     boolean result = true;154     File[] entries = directory.listFiles();155     for (int i = 0; i < entries.length; i++) {156       if (!entries[i].delete()) {157         result = false;158       }159     }160     return result;161   }162 163   /**164    * 清空指定目录中的文件。165    * 这个方法将尽可能删除所有的文件,但是只要有一个文件没有被删除都会返回false。166    * 另外这个方法不会迭代删除,即不会删除子目录及其内容。167    * @param directoryName 要清空的目录的目录名168    * @return 目录下的所有文件都被成功删除时返回true,否则返回false。169    * @since  1.0170    */171   public static boolean emptyDirectory(String directoryName) {172     File dir = new File(directoryName);173     return emptyDirectory(dir);174   }175 176   /**177    * 删除指定目录及其中的所有内容。178    * @param dirName 要删除的目录的目录名179    * @return 删除成功时返回true,否则返回false。180    * @since  1.0181    */182   public static boolean deleteDirectory(String dirName) {183     return deleteDirectory(new File(dirName));184   }185 186   /**187    * 删除指定目录及其中的所有内容。188    * @param dir 要删除的目录189    * @return 删除成功时返回true,否则返回false。190    * @since  1.0191    */192   public static boolean deleteDirectory(File dir) {193     if ( (dir == null) || !dir.isDirectory()) {194       throw new IllegalArgumentException("Argument " + dir +195                                          " is not a directory. ");196     }197 198     File[] entries = dir.listFiles();199     int sz = entries.length;200 201     for (int i = 0; i < sz; i++) {202       if (entries[i].isDirectory()) {203         if (!deleteDirectory(entries[i])) {204           return false;205         }206       }207       else {208         if (!entries[i].delete()) {209           return false;210         }211       }212     }213 214     if (!dir.delete()) {215       return false;216     }217     return true;218   }219 220   /**221    * 列出目录中的所有内容,包括其子目录中的内容。222    * @param fileName 要列出的目录的目录名223    * @return 目录内容的文件数组。224    * @since  1.0225    */226   /*public static File[] listAll(String fileName) {227     return listAll(new File(fileName));228   }*/229 230   /**231    * 列出目录中的所有内容,包括其子目录中的内容。232    * @param file 要列出的目录233    * @return 目录内容的文件数组。234    * @since  1.0235    */236   /*public static File[] listAll(File file) {237     ArrayList list = new ArrayList();238     File[] files;239     if (!file.exists() || file.isFile()) {240       return null;241     }242     list(list, file, new AllFileFilter());243     list.remove(file);244     files = new File[list.size()];245     list.toArray(files);246     return files;247   }*/248 249   /**250    * 列出目录中的所有内容,包括其子目录中的内容。251    * @param file 要列出的目录252    * @param filter 过滤器253    * @return 目录内容的文件数组。254    * @since  1.0255    */256   public static File[] listAll(File file,257                                javax.swing.filechooser.FileFilter filter) {258     ArrayList list = new ArrayList();259     File[] files;260     if (!file.exists() || file.isFile()) {261       return null;262     }263     list(list, file, filter);264     files = new File[list.size()];265     list.toArray(files);266     return files;267   }268 269   /**270    * 将目录中的内容添加到列表。271    * @param list 文件列表272    * @param filter 过滤器273    * @param file 目录274    */275   private static void list(ArrayList list, File file,276                            javax.swing.filechooser.FileFilter filter) {277     if (filter.accept(file)) {278       list.add(file);279       if (file.isFile()) {280         return;281       }282     }283     if (file.isDirectory()) {284       File files[] = file.listFiles();285       for (int i = 0; i < files.length; i++) {286         list(list, files[i], filter);287       }288     }289 290   }291 292   /**293    * 返回文件的URL地址。294    * @param file 文件295    * @return 文件对应的的URL地址296    * @throws MalformedURLException297    * @since  1.0298    * @deprecated 在实现的时候没有注意到File类本身带一个toURL方法将文件路径转换为URL。299    *             请使用File.toURL方法。300    */301   public static URL getURL(File file) throws MalformedURLException {302     String fileURL = "file:/" + file.getAbsolutePath();303     URL url = new URL(fileURL);304     return url;305   }306 307   /**308    * 从文件路径得到文件名。309    * @param filePath 文件的路径,可以是相对路径也可以是绝对路径310    * @return 对应的文件名311    * @since  1.0312    */313   public static String getFileName(String filePath) {314     File file = new File(filePath);315     return file.getName();316   }317 318   /**319    * 从文件名得到文件绝对路径。320    * @param fileName 文件名321    * @return 对应的文件路径322    * @since  1.0323    */324   public static String getFilePath(String fileName) {325     File file = new File(fileName);326     return file.getAbsolutePath();327   }328 329   /**330    * 将DOS/Windows格式的路径转换为UNIX/Linux格式的路径。331    * 其实就是将路径中的"\"全部换为"/",因为在某些情况下我们转换为这种方式比较方便,332    * 某中程度上说"/"比"\"更适合作为路径分隔符,而且DOS/Windows也将它当作路径分隔符。333    * @param filePath 转换前的路径334    * @return 转换后的路径335    * @since  1.0336    */337   public static String toUNIXpath(String filePath) {338     return filePath.replace(‘\\‘, ‘/‘);339   }340 341   /**342    * 从文件名得到UNIX风格的文件绝对路径。343    * @param fileName 文件名344    * @return 对应的UNIX风格的文件路径345    * @since  1.0346    * @see #toUNIXpath(String filePath) toUNIXpath347    */348   public static String getUNIXfilePath(String fileName) {349     File file = new File(fileName);350     return toUNIXpath(file.getAbsolutePath());351   }352 353   /**354    * 得到文件的类型。355    * 实际上就是得到文件名中最后一个“.”后面的部分。356    * @param fileName 文件名357    * @return 文件名中的类型部分358    * @since  1.0359    */360   public static String getTypePart(String fileName) {361     int point = fileName.lastIndexOf(‘.‘);362     int length = fileName.length();363     if (point == -1 || point == length - 1) {364       return "";365     }366     else {367       return fileName.substring(point + 1, length);368     }369   }370 371   /**372    * 得到文件的类型。373    * 实际上就是得到文件名中最后一个“.”后面的部分。374    * @param file 文件375    * @return 文件名中的类型部分376    * @since  1.0377    */378   public static String getFileType(File file) {379     return getTypePart(file.getName());380   }381 382   /**383    * 得到文件的名字部分。384    * 实际上就是路径中的最后一个路径分隔符后的部分。385    * @param fileName 文件名386    * @return 文件名中的名字部分387    * @since  1.0388    */389   public static String getNamePart(String fileName) {390     int point = getPathLsatIndex(fileName);391     int length = fileName.length();392     if (point == -1) {393       return fileName;394     }395     else if (point == length - 1) {396       int secondPoint = getPathLsatIndex(fileName, point - 1);397       if (secondPoint == -1) {398         if (length == 1) {399           return fileName;400         }401         else {402           return fileName.substring(0, point);403         }404       }405       else {406         return fileName.substring(secondPoint + 1, point);407       }408     }409     else {410       return fileName.substring(point + 1);411     }412   }413 414   /**415    * 得到文件名中的父路径部分。416    * 对两种路径分隔符都有效。417    * 不存在时返回""。418    * 如果文件名是以路径分隔符结尾的则不考虑该分隔符,例如"/path/"返回""。419    * @param fileName 文件名420    * @return 父路径,不存在或者已经是父目录时返回""421    * @since  1.0422    */423   public static String getPathPart(String fileName) {424     int point = getPathLsatIndex(fileName);425     int length = fileName.length();426     if (point == -1) {427       return "";428     }429     else if (point == length - 1) {430       int secondPoint = getPathLsatIndex(fileName, point - 1);431       if (secondPoint == -1) {432         return "";433       }434       else {435         return fileName.substring(0, secondPoint);436       }437     }438     else {439       return fileName.substring(0, point);440     }441   }442 443   /**444    * 得到路径分隔符在文件路径中首次出现的位置。445    * 对于DOS或者UNIX风格的分隔符都可以。446    * @param fileName 文件路径447    * @return 路径分隔符在路径中首次出现的位置,没有出现时返回-1。448    * @since  1.0449    */450   public static int getPathIndex(String fileName) {451     int point = fileName.indexOf(‘/‘);452     if (point == -1) {453       point = fileName.indexOf(‘\\‘);454     }455     return point;456   }457 458   /**459    * 得到路径分隔符在文件路径中指定位置后首次出现的位置。460    * 对于DOS或者UNIX风格的分隔符都可以。461    * @param fileName 文件路径462    * @param fromIndex 开始查找的位置463    * @return 路径分隔符在路径中指定位置后首次出现的位置,没有出现时返回-1。464    * @since  1.0465    */466   public static int getPathIndex(String fileName, int fromIndex) {467     int point = fileName.indexOf(‘/‘, fromIndex);468     if (point == -1) {469       point = fileName.indexOf(‘\\‘, fromIndex);470     }471     return point;472   }473 474   /**475    * 得到路径分隔符在文件路径中最后出现的位置。476    * 对于DOS或者UNIX风格的分隔符都可以。477    * @param fileName 文件路径478    * @return 路径分隔符在路径中最后出现的位置,没有出现时返回-1。479    * @since  1.0480    */481   public static int getPathLsatIndex(String fileName) {482     int point = fileName.lastIndexOf(‘/‘);483     if (point == -1) {484       point = fileName.lastIndexOf(‘\\‘);485     }486     return point;487   }488 489   /**490    * 得到路径分隔符在文件路径中指定位置前最后出现的位置。491    * 对于DOS或者UNIX风格的分隔符都可以。492    * @param fileName 文件路径493    * @param fromIndex 开始查找的位置494    * @return 路径分隔符在路径中指定位置前最后出现的位置,没有出现时返回-1。495    * @since  1.0496    */497   public static int getPathLsatIndex(String fileName, int fromIndex) {498     int point = fileName.lastIndexOf(‘/‘, fromIndex);499     if (point == -1) {500       point = fileName.lastIndexOf(‘\\‘, fromIndex);501     }502     return point;503   }504 505   /**506    * 将文件名中的类型部分去掉。507    * @param filename 文件名508    * @return 去掉类型部分的结果509    * @since  1.0510    */511   public static String trimType(String filename) {512     int index = filename.lastIndexOf(".");513     if (index != -1) {514       return filename.substring(0, index);515     }516     else {517       return filename;518     }519   }520   /**521    * 得到相对路径。522    * 文件名不是目录名的子节点时返回文件名。523    * @param pathName 目录名524    * @param fileName 文件名525    * @return 得到文件名相对于目录名的相对路径,目录下不存在该文件时返回文件名526    * @since  1.0527    */528   public static String getSubpath(String pathName,String fileName) {529     int index = fileName.indexOf(pathName);530     if (index != -1) {531       return fileName.substring(index + pathName.length() + 1);532     }533     else {534       return fileName;535     }536   }537 538   /**539    * 检查给定目录的存在性540    * 保证指定的路径可用,如果指定的路径不存在,那么建立该路径,可以为多级路径541    * @param path542    * @return 真假值543    * @since  1.0544    */545    public static final boolean pathValidate(String path)546    {547      //String path="d:/web/www/sub";548      //System.out.println(path);549      //path = getUNIXfilePath(path);550 551      //path = ereg_replace("^\\/+", "", path);552      //path = ereg_replace("\\/+$", "", path);553      String[] arraypath = path.split("/");554      String tmppath = "";555      for (int i = 0; i < arraypath.length; i++)556      {557        tmppath += "/" + arraypath[i];558        File d = new File(tmppath.substring(1));559        if (!d.exists()) { //检查Sub目录是否存在560            System.out.println(tmppath.substring(1));561          if (!d.mkdir())562          {563            return false;564          }565        }566      }567      return true;568    }569 570    /**571     * 读取文件的内容572     * 读取指定文件的内容573     * @param path 为要读取文件的绝对路径574     * @return 以行读取文件后的内容。575     * @since  1.0576     */577    public static final String getFileContent(String path) throws IOException578    {579      String filecontent = "";580      try {581        File f = new File(path);582        if (f.exists()) {583          FileReader fr = new FileReader(path);584          BufferedReader br = new BufferedReader(fr); //建立BufferedReader对象,并实例化为br585          String line = br.readLine(); //从文件读取一行字符串586          //判断读取到的字符串是否不为空587          while (line != null) {588            filecontent += line + "\n";589            line = br.readLine(); //从文件中继续读取一行数据590          }591          br.close(); //关闭BufferedReader对象592          fr.close(); //关闭文件593        }594 595      }596      catch (IOException e) {597        throw e;598      }599      return filecontent;600    }601 602    /**603     * 根据内容生成文件604     * @param path要生成文件的绝对路径,605     * @param 文件的内容。606     * @return 真假值607     * @since  1.0608     */609    public static final boolean genModuleTpl(String path, String modulecontent)  throws IOException610    {611 612      path = getUNIXfilePath(path);613      String[] patharray = path.split("\\/");614      String modulepath = "";615      for (int i = 0; i < patharray.length - 1; i++) {616        modulepath += "/" + patharray[i];617      }618      File d = new File(modulepath.substring(1));619      if (!d.exists()) {620        if (!pathValidate(modulepath.substring(1))) {621          return false;622        }623      }624      try {625        FileWriter fw = new FileWriter(path); //建立FileWriter对象,并实例化fw626        //将字符串写入文件627        fw.write(modulecontent);628        fw.close();629      }630      catch (IOException e) {631        throw e;632      }633      return true;634    }635 636    /**637     * 获取图片文件的扩展名(发布系统专用)638     * @param picname 为图片名称加上前面的路径不包括扩展名639     * @return 图片的扩展名640     * @since  1.0641     */642    public static final String getPicExtendName(String pic_path)643    {644      pic_path = getUNIXfilePath(pic_path);645      String pic_extend = "";646      if (isFileExist(pic_path + ".gif"))647      {648        pic_extend = ".gif";649      }650      if (isFileExist(pic_path + ".jpeg"))651      {652        pic_extend = ".jpeg";653      }654      if (isFileExist(pic_path + ".jpg"))655      {656        pic_extend = ".jpg";657      }658      if (isFileExist(pic_path + ".png"))659      {660        pic_extend = ".png";661      }662      return pic_extend; //返回图片扩展名663    }664    //拷贝文件665    public static final boolean CopyFile(File in, File out) throws Exception {666        try {667            FileInputStream fis = new FileInputStream(in);668            FileOutputStream fos = new FileOutputStream(out);669            byte[] buf = new byte[1024];670            int i = 0;671            while ((i = fis.read(buf)) != -1) {672                fos.write(buf, 0, i);673            }674            fis.close();675            fos.close();676            return true;677        } catch (IOException ie) {678            ie.printStackTrace();679            return false;680        }681    }682    //拷贝文件683    public static final boolean CopyFile(String infile, String outfile) throws Exception {684        try {685            File in = new File(infile);686            File out = new File(outfile);687            return CopyFile(in, out);688        } catch (IOException ie) {689            ie.printStackTrace();690            return false;691        }692 693    }694    /**695     * 计算图片数量696     * @param id697     * @param dtime698     * @return699     */700    public static final int countPics(String id,String dtime,String extensions){701        int counts = 0; 702        703        MyFileFilter mfilter = new MyFileFilter(extensions.split(","));704        PropsUtil pu = new PropsUtil();705        String PICROOT = pu.readSingleProps("DestinationsPICROOT").trim();706        String path = PICROOT + "/"+dtime.substring(0, 10) + "/";707        File lfile = new File(path);708        String filename;709        if(lfile.isDirectory()){710            File[] files = lfile.listFiles(mfilter);711            for(int i=0;i<files.length;i++){712                filename = files[i].getName();713                if((filename.indexOf(id + "_")==0)&&(filename.indexOf("_small")>-1))714                    counts ++;715            }716            files = null;717        }718        filename = null;719        lfile = null;720        pu = null;721        mfilter = null;722            723        return counts;724    }725 726 }

 

FileUtil