勿以惡小而爲之,勿以善小而不爲--------------------------劉備
勸諸君,多行善事積福報,莫作惡
上一章簡單介紹了 壓縮和解壓縮文件(十一),如果沒有看過,請觀看上一章
一. 爲什麼出現 common-io?
我們可以通過 字節操作流 InputStream,OutputStream 或者 字符操作流 Reader,Writer 來讀取和寫入文件內容,進行復制文件,複製文件夾等操作, 但這些操作流程固定,寫起來複雜,並且效率較低,能不能有一個工具jar包,來幫我們實現簡單的功能呢?
Apache 提供了對 IO流的操作的jar包, common-io.
下載使用版本 2.4
添加 common-io.jar包的依賴,我們主要使用的是 org.apache.commons.io.FileUtils 工具類。
下面,老蝴蝶介紹幾個常用的功能。
二. 統計文件和目錄的大小,比較文件的內容是否一致
二.一 方法
方法 | 作用 |
---|---|
static long sizeOf(File file) | 統計文件的大小 |
static long sizeOfDirectory(File directory) | 統計文件夾的大小 |
static boolean contentEquals(File file1, File file2) | 比較兩個文件的內容是否相同 |
二.二 演示
源代碼:
二.二.一 統計文件和文件夾的大小
@Test
public void sizeTest() throws Exception{
String filepath="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"Hello3.txt";
String dirpath="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"a";
File file=new File(filepath);
File dirFile=new File(dirpath);
//文件的大小
System.out.println("Hello3文件大小:"+FileUtils.sizeOf(file));
//文件夾的大小
System.out.println("a文件夾的大小:"+FileUtils.sizeOfDirectory(dirFile));
}
運行程序,控制檯打印輸出:
查看源代碼和運行結果,會發現 sizeOfDirectory() 會遞歸查詢該文件夾下的所有文件的大小。
二.二.二 比較文件內容是否相同 contentEquals()
修改 data.txt, data2.txt, data3.txt 文件的內容
data.txt 設置內容爲:
你好啊,我是兩個蝴蝶飛
data2.txt 設置內容爲:
你好啊,我是嶽澤霖
data3.txt 設置內容爲:
你好啊,我是兩個蝴蝶飛
data.txt 與 data3.txt 的文件內容相同。
@Test
public void contentEqualsTest() throws Exception{
File file1=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"data.txt");
File file2=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"data2.txt");
File file3=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"data3.txt");
//文件的大小
System.out.println("文件1與文件2內容是否相同:"+FileUtils.contentEquals(file1,file2)); //false
System.out.println("文件3與文件2內容是否相同:"+FileUtils.contentEquals(file3,file2)); //false
System.out.println("文件1與文件3內容是否相同:"+FileUtils.contentEquals(file1,file3));//true
}
運行程序,控制檯打印輸出:
三. 讀取文件內容
可以直接讀取成字符串,也可以讀取成字節數組, 可以按行。
三.一 方法
方法 | 作用 |
---|---|
static String readFileToString(File file) | 讀取文件內容,轉換成字符串 |
static byte[] readFileToByteArray(File file) | 讀取文件內容,轉換成字節數組 |
static List readLines(File file) | 按行讀取文件 |
三.二 演示 讀取文件內容
@Test
public void readTest() throws Exception{
String filepath="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"Hello3.txt";
File file=new File(filepath);
//讀出內容字符串
String content=FileUtils.readFileToString(file,"UTF-8");
System.out.println("內容:"+content);
//讀出字節
byte[] bytes=FileUtils.readFileToByteArray(file);
System.out.println("輸出字節內容:"+new String(bytes));
System.out.println("------------讀取行信息---------");
//按行讀取,對每一行進行相應的處理
List<String> lines=FileUtils.readLines(file,"UTF-8");
for(String str:lines){
System.out.println(str);
}
}
運行程序,控制檯打印輸出:
四. 寫入文件內容
可以寫入字符串,可以寫入字節數組, 也可以按行寫入集合。
四.一 方法
方法 | 作用 |
---|---|
static void write(File file, CharSequence data, String encoding) | 往文件裏面寫字符串內容 |
static void writeByteArrayToFile(File file, byte[] data) | 往文件裏面寫字節 |
static void writeLines(File file, String encoding, Collection<?> lines) | 往文件裏面寫多個行 |
static void writeStringToFile(File file, String data, String encoding) | 往文件裏面寫字符串 |
寫入方法可以重載, 後面都可以有一個 boolean append, 是追加還是重寫。
四.二 演示 寫入文件內容
@Test
public void writeTest() throws Exception{
String filepath="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"Hello3.txt";
File file=new File(filepath);
System.out.println("**************************");
//寫入字符串,追加
FileUtils.writeStringToFile(file,"新數據","UTF-8",true);
//寫入字節,追加
FileUtils.writeByteArrayToFile(file,"我去,新數據".getBytes("UTF-8"),true);
//按行寫入,會換行的。
List<String> lineList=new ArrayList<String>();
lineList.add("A");
lineList.add("B");
lineList.add("C");
//按行寫入,追加
FileUtils.writeLines(file,"UTF-8",lineList,true);
//重新讀取
System.out.println("再讀:"+FileUtils.readFileToString(file,"UTF-8"));
}
運行程序,控制檯打印輸出:
五. 創建文件
可以創建不存在的文件,也可以創建遞歸的文件。 如果文件已經存在,就不創建,並且不報錯。
五.一 方法
方法 | 作用 |
---|---|
static void touch(File file) | 創建文件 |
五.二 演示 touch() 方法
@Test
public void touchTest() throws Exception{
File file1=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"A.txt");
//新建單個文件
FileUtils.touch(file1);
File file2=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"新建"+File.separator+"B"+File.separator+"C"+File.separator+"d.txt");
//新建遞歸文件夾
FileUtils.touch(file2);
}
運行程序,查看文件系統
六. 展示文件夾中的文件
與以前的listFiles() 方法差不多,提供了多種過濾器的支持。
過濾器位於 org.apache.commons.io.filefilter 包下。
六.一 方法
方法 | 作用 |
---|---|
static Collection listFiles(File directory, IOFileFilter fileFilter, IOFileFilter dirFilter) | 傳入目錄,文件過濾器,目錄過濾器,返回值是集合 |
static Iterator iterateFiles(File directory, IOFileFilter fileFilter, IOFileFilter dirFilter) | 傳入目錄,文件過濾器,目錄過濾器,返回值是迭代器 |
六.二 演示
可以進行 前綴,後綴,遞歸,不爲空 等多種形式的過濾, 支持組合 and,or 。
@Test
public void listFileTest(){
String dirpath="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc";
File dirFile=new File(dirpath);
System.out.println("***********第一種形式***********");
//不爲空文件,即文件的大小不能爲 0
Collection<File> cFiles=FileUtils.listFiles(dirFile, EmptyFileFilter.NOT_EMPTY,null);
for(File f:cFiles){
System.out.println("輸出路徑:"+f.getAbsolutePath());
}
System.out.println("***********第二種形式*******");
//加上 AndDirs 表示 遞歸展示。
Iterable<File > cFileIts= FileUtils.listFilesAndDirs(dirFile,EmptyFileFilter.NOT_EMPTY, DirectoryFileFilter.INSTANCE);
for(File f:cFileIts){
System.out.println("輸出路徑:"+f.getAbsolutePath());
}
System.out.println("**********第三 種形式********");
//後綴形式
cFiles=FileUtils.listFiles(dirFile, new SuffixFileFilter(".txt"),DirectoryFileFilter.INSTANCE);
for(File f:cFiles){
System.out.println("輸出路徑:"+f.getAbsolutePath());
}
System.out.println("***********第四種形式*******");
//或者 or 的形式, 開頭是 data 或者 結尾是 CHM
cFiles=FileUtils.listFiles(dirFile,
FileFilterUtils.or(new PrefixFileFilter("data"),new SuffixFileFilter(".CHM"))
,DirectoryFileFilter.INSTANCE);
for(File f:cFiles){
System.out.println("輸出路徑:"+f.getAbsolutePath());
}
System.out.println("***********第五種形式*******");
// and 和的形式
cFiles=FileUtils.listFiles(dirFile,
FileFilterUtils.and(new PrefixFileFilter("data"),new SuffixFileFilter(".txt"))
,DirectoryFileFilter.INSTANCE);
for(File f:cFiles){
System.out.println("輸出路徑:"+f.getAbsolutePath());
}
}
運行程序,查看控制檯內容:
七. 複製,移動文件和文件夾
七.一 方法
方法 | 作用 |
---|---|
static void copyDirectory(File srcDir, File destDir) | 複製目錄 |
static void copyDirectory(File srcDir, File destDir, FileFilter filter) | 只複製符合條件的目錄 |
static void copyDirectoryToDirectory(File srcDir, File destDir) | 複製目錄到另外一個目錄 |
static void copyFile(File srcFile, File destFile) | 複製文件 |
static void copyFileToDirectory(File srcFile, File destDir) | 複製文件到目錄 |
static void copyInputStreamToFile(InputStream source, File destination) | 複製輸入流到文件 |
static void copyURLToFile(URL source, File destination) | 複製url到文件 |
static void deleteDirectory(File directory) | 刪除目錄 |
static void forceDelete(File file) | 遞歸刪除文件 |
static void forceMkdir(File directory) | 遞歸創建目錄 |
static void moveDirectory(File srcDir, File destDir) | 移動目錄 |
static void moveFile(File srcFile, File destFile) | 移動文件 |
static void moveFileToDirectory(File srcFile, File destDir, boolean createDestDir) | 移動文件到目錄 |
static void moveToDirectory(File src, File destDir, boolean createDestDir) | 移動到目錄 |
static void moveDirectoryToDirectory(File src, File destDir, boolean createDestDir) | 移動目錄到目錄 |
七.二 演示 複製,移動
@Test
public void fileOperTest() throws Exception{
String filepath="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"data.txt";
String filepathCopy="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"datacopy.txt";
String dirpath="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"a";
String dirpathCopy="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"acopy";
File file=new File(filepath);
File dirFile=new File(dirpath);
//複製文件
FileUtils.copyFile(file,new File(filepathCopy));
//複製目錄
FileUtils.copyDirectory(dirFile,new File(dirpathCopy));
//複製文件到目錄
//FileUtils.copyFileToDirectory(new File(filepathCopy),new File(dirpathCopy));
//複製目錄到目錄
FileUtils.copyDirectoryToDirectory(dirFile,new File(dirpathCopy));
//移動
// FileUtils.moveFile(new File(filepathCopy),new File(file));
//移動文件到目錄
FileUtils.moveFileToDirectory(new File(filepathCopy),new File(dirpathCopy),true);
//FileUtils.moveDirectory();
// FileUtils.moveDirectoryToDirectory();
//刪除文件
FileUtils.deleteDirectory(dirFile);
}
運行程序,查看文件系統
謝謝您的觀看,如果喜歡,請關注我,再次感謝 !!!