package cn.xingoo.learn.commons;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.FileFileFilter;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.junit.Test;
import java.io.*;
import java.net.URL;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.zip.CRC32;
/**
* FileUtils支持很多文件操作,如
*
* 文件寫入
* 讀取文件
* 創建目錄
* 拷貝文件和目錄
* 刪除文件和目錄
* 從URL轉換
* 基於統配和過濾查看文件和目錄
* 比較文件內容
* 文件的更新時間
* 檢查校驗碼
*
* Created by xxh on 2016/11/24.
*/
public class FileUtilsTest {
private static File parent = new File("D://test");
@Test
public void getDirTest(){
//獲得基本的信息
System.out.println(FileUtils.getTempDirectory());//獲取臨時目錄 java.io.tmpdir,getUserDirectoryPath返回路徑字符串
System.out.println(FileUtils.getUserDirectory());//獲取用戶主目錄 user.home,getUserDirectoryPath返回路徑字符串
//以可讀的方式,返回文件的大小EB, PB, TB, GB, MB, KB or bytes
System.out.println(FileUtils.byteCountToDisplaySize(10000000));
System.out.println(FileUtils.byteCountToDisplaySize(1));
}
@Test
public void openStream() throws IOException {
//獲取文件輸入和輸出的文件流
//文件是目錄或者不存在,都會跑出異常
InputStream in = FileUtils.openInputStream(new File("D://test/test1"));
OutputStream out = FileUtils.openOutputStream(new File("D://test/test2"));
out = FileUtils.openOutputStream(new File("D://test/test3"),true);//是否追加的形式添加內容
}
@Test
public void FileOperation() throws IOException {
//創建文件,如果文件存在則更新時間;如果不存在,創建一個空文件
//創建空文件的方式為:
// final OutputStream out = openOutputStream(file);
// IOUtils.closeQuietly(out);
FileUtils.touch(new File("D://test/test4"));
//文件內容的對比
FileUtils.contentEquals(new File("D://test/test1"),new File("D://test/test2"));
FileUtils.contentEqualsIgnoreEOL(new File("D://test/test1"),new File("D://test/test2"),null);//忽略換行符,第三個參數是字符集
//根據URL獲取文件
FileUtils.toFile(new URL("file://D://test/test1"));
FileUtils.toFiles(null);
FileUtils.toURLs(new File[]{new File("D://test/test1")});
//文件拷貝
FileUtils.copyFileToDirectory(new File("/test1"),new File("/dir"),true);//第三個參數是否更新時間
FileUtils.copyFile(new File("/source"),new File("/target"),true);//TODO 閱讀doCopy源碼
//目錄拷貝
File srcDir = new File("/source");
File destDir = new File("/target");
FileUtils.copyDirectoryToDirectory(new File("/source"),new File("/target"));
FileUtils.copyDirectory(new File("/source"),new File("/target"));
FileUtils.copyDirectory(srcDir, destDir, DirectoryFileFilter.DIRECTORY);//僅僅拷貝目錄
IOFileFilter txtSuffixFilter = FileFilterUtils.suffixFileFilter(".txt");// 創建.txt過濾器
IOFileFilter txtFiles = FileFilterUtils.andFileFilter(FileFileFilter.FILE, txtSuffixFilter);
// 創建包含目錄或者txt文件的過濾器
FileFilter filter = FileFilterUtils.orFileFilter(DirectoryFileFilter.DIRECTORY, txtFiles);
// Copy using the filter
FileUtils.copyDirectory(srcDir, destDir, filter);//TODO 閱讀doCopyDirectory源碼
//文件拷貝
FileUtils.copyInputStreamToFile(new FileInputStream("/test"),new File("/test"));
FileUtils.copyURLToFile(new URL("file:/test"),new File("/test"));
//刪除文件
FileUtils.deleteDirectory(new File("/test"));//刪除目錄下所有的內容
FileUtils.deleteQuietly(new File("/test"));//如果是目錄,會級聯刪除;不會拋出異常
//判斷文件是否存在
FileUtils.directoryContains(new File("/dir"),new File("/file"));
//清除目錄中的內容,不會刪除該目錄;
//先verifiedListFiles檢查目錄,檢查目錄是否為目錄、是否存在,然后調用listFiles,如果返回null,則拋出異常
//遍歷目錄中的文件,如果是目錄則遞歸刪除;如果是文件則強制刪除,刪除失敗(文件不存在或無法刪除)都會拋出異常
FileUtils.cleanDirectory(new File("/dir"));//TODO verifiedListFiles <------2016/11/24
//等待一個文件xx秒,知道文件創建后才返回。每max(100,remainning)循環檢查一次
while(FileUtils.waitFor(new File("/dir"),60)){}
//讀取目標文件,內部調用IOUtils.toString(inputstream,"utf-8")
String str = FileUtils.readFileToString(new File("/dir"),"utf-8");
//內部調用IOUtils.toByteArray(in)
byte[] bytes = FileUtils.readFileToByteArray(new File("/dir"));
//內部調用IOUtils.readLines(in, Charsets.toCharset(encoding));
List<String> strs = FileUtils.readLines(new File("/dir"),"utf-8");
//內部調用IOUtils.lineIterator(in, encoding)
FileUtils.lineIterator(new File("/dir"),"utf-8");
//四個參數分別為:目標文件,寫入的字符串,字符集,是否追加
FileUtils.writeStringToFile(new File("/target"),"string","utf-8",true);
//write可以接受charsequence類型的數據,string,stringbuilder和stringbuffer都是實現了charsequence接口
FileUtils.write(new File("/target"),"target char sequence","utf-8",true);
FileUtils.writeByteArrayToFile(new File("/target"),"bytes".getBytes());//(file,字符數組)
FileUtils.writeByteArrayToFile(new File("/target"),"bytes".getBytes(),true);//(file,字符數組,是否追加)
FileUtils.writeByteArrayToFile(new File("/target"),"bytes".getBytes(),0,10);//(file,字符數組,起始位置,結束位置)
FileUtils.writeByteArrayToFile(new File("/target"),"bytes".getBytes(),0,10,true);//(file,字符數組,起始位置,結束位置,是否追加)
//writeLines多了一個lineEnding參數
FileUtils.writeLines(new File("/target"),"utf-8", FileUtils.readLines(new File("/target"),"utf-8"));
//強制刪除
FileUtils.forceDelete(new File("/target"));
//在JVM
FileUtils.forceDeleteOnExit(new File("/target"));
//強制創建文件目錄,如果文件存在,會拋出異常
FileUtils.forceMkdir(new File("/target"));
//強制創建父級目錄
FileUtils.forceMkdirParent(new File("/xxxx/target"));
//如果是文件,直接讀取文件大小;如果是目錄,級聯計算文件下的所有文件大小
FileUtils.sizeOf(new File("/target"));//返回Long
FileUtils.sizeOfAsBigInteger(new File("/target"));//返回BigInteger
FileUtils.sizeOfDirectory(new File("/target"));
FileUtils.sizeOfDirectoryAsBigInteger(new File("/target"));
//對比文件新舊
FileUtils.isFileNewer(new File("/target"),new File("/file"));
FileUtils.isFileOlder(new File("/target"), new Date());
FileUtils.checksum(new File("/target"),new CRC32());
FileUtils.checksumCRC32(new File("/target"));
FileUtils.moveDirectory(new File("/target"),new File("/file"));
FileUtils.moveDirectoryToDirectory(new File("/target"),new File("/file"),true);
FileUtils.moveFile(new File("/target"),new File("/file"));
FileUtils.moveFileToDirectory(new File("/target"),new File("/dir"),true);
FileUtils.moveToDirectory(new File("/target"),new File("/dir"),true);
FileUtils.isSymlink(new File("/target"));
}
@Test
public void findFiles(){
//返回文件的列表
List<File> files = (List<File>) FileUtils.listFiles(parent,new String[]{"test1","test2"},true);//TODO 重點看一下源碼
//返回文件迭代器
Iterator<File> files_iter = FileUtils.iterateFiles(parent,new String[]{"test1","test3"},true);
//把collection<File>轉換成File[]
FileUtils.convertFileCollectionToFileArray(files);
}
}