1.FileUtils介紹
文件IO是我們日常項目中經常使用到的基礎API,常見的IO讀寫操作基礎類字節流InputStream與OutputStream、字符流Reader與Writer已經涵蓋了我們日常項目開發中的常見API功能。具體的基礎回顧可以參見一篇cdsn博文:字符流與字節流的區別
今天要說的,是我們基於上述API由Apache開源項目封裝的一個更好用的文件操作工具類FileUtils,涵蓋了讀取文件、拷貝文件、拷貝目錄及文件、刪除目錄及文件、清除目錄等比較常用的靜態類封裝。
FileUtils的使用需要引入apache的commons-io包下的FileUtils,導入:import org.apache.commons.io.FileUtils;
官方API文檔:http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/FileUtils.html
maven項目使用需要導入依賴:
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency>
下面簡單介紹一下它常見的API方法的使用。
1.1.讀取文件
官方API中我覺得能使用到的就是下面的方法,都是靜態方法,如readFileToString、readLines(按行讀取)等,對應的靜態方法也都提供了支持編碼"utf-8"格式讀取。
1.2.拷貝文件
比較常用的API方法如下,如copyFile、copyInputStreamToFile、copyFileToDirectory。
①拷貝文件到文件 :copyFile(File srcFile, File destFile)
:
File file = new File("E:\\java\\file01\\abc雪.jpg"); String destFilePath = "E:\\java\\file02"; String destFileName = "abc雪02.jpg"; try { FileUtils fileUtils = new FileUtils(); //文件拷貝到新的位置並保存文件的日期。 fileUtils.copyFile(file, new File(destFilePath,destFileName)); System.out.println("文件拷貝成功"); } catch (IOException e) { e.printStackTrace(); System.out.println(e.getMessage()); }
②拷貝文件到字節輸出流:copyFile(File input, OutputStream output)
String destFileName = "abc雪03.jpg"; //從文件copy to an字節輸出流。 FileUtils.copyFile(file, new FileOutputStream(new File(destFilePath,destFileName)));
③拷貝文件到文件的目錄保存文件的日期:copyFileToDirectory(File srcFile, File destDir)
拷貝的文件名無法自定義,和原文件名一樣
//拷貝文件到文件的目錄保持文件的日期。 FileUtils.copyFileToDirectory(file, new File(destFilePath));
1.3.拷貝目錄及文件
主要的API如下,包含拷貝目錄及目錄下的子目錄及文件的拷貝方法:
①將整個目錄拷貝到新位置,並保持原文件日期:copyDirectory(File srcDir, File destDir)
其包含文件及子目錄文件並保持原文件日期
File file = new File("E:\\java\\file01"); String destFilePath = "E:\\java\\file03"; try { //將整個目錄複製新位置,並保持原文件日期。 FileUtils.copyDirectory(file, new File(destFilePath)); System.out.println("文件目錄拷貝成功"); } catch (IOException e) { e.printStackTrace(); System.out.println(e.getMessage()); }
②將已篩選的目錄拷貝到新位置:
copyDirectory(File srcDir, File destDir, FileFilter filter)
文件過濾器篩選其包含文件及子目錄文件拷貝,並保持原文件日期。
String destFilePath = "E:\\java\\file04"; //將已篩選的目錄複製,並保持原文件日期的新位置。 FileUtils.copyDirectory(file, new File(destFilePath), new FileFilter() { @Override public boolean accept(File pathname) { if(pathname.isDirectory()) return true; else { boolean b1 = pathname.getName().endsWith(".txt"); boolean b2 = pathname.getName().endsWith(".jpg"); return b1 || b2; } } });
1.4.刪除目錄及文件
主要的刪除API方法如下,常用的有deleteDirectory、deleteQuietly及forceDelete等,主要用於級聯刪除及強制刪除,且不會引起異常。非常強力。
①刪除指定文件,從不引發異常:deleteQuietly(File file)
File file = new File("E:\\java\\file04\\abc雪.jpg"); //刪除指定文件,從不引發異常。 FileUtils.deleteQuietly(file);
②刪除指定文件,文件不存在拋出異常:forceDelete(File file)
File file = new File("E:\\java\\file04\\abc雪.jpg"); try { FileUtils.forceDelete(file); System.out.println("操作成功"); } catch (IOException e) { e.printStackTrace(); System.out.println(e.getMessage()); }
③遞歸刪除目錄:deleteDirectory(File directory)
刪除
其包含文件及子目錄文件
File file = new File("E:\\java\\file04\\abc雪.jpg"); //遞歸刪除目錄。 try { FileUtils.deleteDirectory(new File(destFilePath)); System.out.println("操作成功"); } catch (IOException e) { e.printStackTrace(); System.out.println(e.getMessage()); }
1.5.清除目錄
主要的API如下,主要用於清除當前目錄下(不會刪除到當前目錄級別)的文件夾及其包含的文件。
清除該目錄下的文件及子目錄文件而不刪除該目錄文件夾。該目錄不存在會報錯:
String destFilePath = "E:\\java\\file04"; try { FileUtils.cleanDirectory(new File(destFilePath)); System.out.println("操作成功"); } catch (IOException e) { e.printStackTrace(); System.out.println(e.getMessage()); }
1.6.文件大小計數常量
①EMPTY_FILE_ARRAY,空文件數組:
/** * An empty array of type {@code File}. */ public static final File[] EMPTY_FILE_ARRAY = {};
②1GB大小,分別對應long類型及BigInteger包裝類型:
/** * The number of bytes in a gigabyte. */ public static final long ONE_GB = ONE_KB * ONE_MB; /** * The number of bytes in a gigabyte. * * @since 2.4 */ public static final BigInteger ONE_GB_BI = ONE_KB_BI.multiply(ONE_MB_BI);
③同理KB與MB的顯示類型:
/** * The number of bytes in a kilobyte. */ public static final long ONE_KB = 1024; /** * The number of bytes in a kilobyte. * * @since 2.4 */ public static final BigInteger ONE_KB_BI = BigInteger.valueOf(ONE_KB); /** * The number of bytes in a megabyte. */ public static final long ONE_MB = ONE_KB * ONE_KB;
博文轉載至CSDN博客:
基於博主博文我自己做了一小部分的知識補充,也非常感謝博主提供博文分享學習知識的平臺。
站在巨人的肩膀上,我們才能學到更多的知識~