筆者日常:這是筆者來深圳後的第一篇博客~記錄一下,2019-06-25。
commons-io簡單說明:
Common IO 是一個工具庫,用來幫助開發IO功能 它包括6個主要部分:
-
一些工具類:包括一些靜態方法來執行常用任務。
-
輸入:InputStream 和 Reader 實現。
-
輸出:OutputStream 和 Writer 實現。
-
過濾器:多種文件過濾器實現(定義了 IOFileFilter接口,同時繼承了 FileFilter 和 FilenameFilter 接口)。
-
比較器:用於文件比較的多種java.util.Comparatot實現。
-
文件監聽器:監聽文件系統事件的組件。
相對比較常用的有兩個工具類:FileUtils和IOUtils,本文主要學習這兩個工具類的部分常用方法。
使用測試:
軟硬件環境說明:Windows10、IntelliJ IDEA、SpringBoot 2.1.5.RELEASE
準備工作:在pom.xml中引入commons-io的依賴
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
FileUtils:
聲明一:下面示例的只是FileUtils一些相對常用的方法。
聲明二:移動和複製用法差不多,在下面的示例中,本人只示例了copy,要使用move的話,可類比這使用即可。
-
將指定大小的bytes, 轉換爲易讀的單位
/**
* 將指定大小的bytes, 轉換爲易讀的單位, 如: bytes、KB、MB、GB、TB……
*
* @date 2019/6/13 19:09
*/
@Test
public void testOne() {
String resultOne = FileUtils.byteCountToDisplaySize(25L);
Assert.assertEquals("25 bytes", resultOne);
String resultTwo = FileUtils.byteCountToDisplaySize(25 * 1024 *1024L);
Assert.assertEquals("25 MB", resultTwo);
String resultThree = FileUtils.byteCountToDisplaySize(25 * 1024 * 1024 *1024L);
Assert.assertEquals("25 GB", resultThree);
}
-
將泛型爲 File的集合 轉換爲數組
/**
* 將泛型爲 File的集合 轉換爲數組
*
* @date 2019/6/13 19:44
*/
@Test
public void testTwo() {
List<File> list = new ArrayList<>(8);
list.add(new File(BASE_DIR + File.separator + "a.txt"));
list.add(new File(BASE_DIR + File.separator + "a.txt"));
list.add( new File(BASE_DIR + File.separator + "c.txt"));
File[] fileArray = FileUtils.convertFileCollectionToFileArray(list);
for (int i = 0; i < fileArray.length; i++) {
Assert.assertEquals(list.get(i), fileArray[i]);
}
// System.out.println(Arrays.deepToString(fileArray));
}
-
查找指定目錄下的(所有)文件
/**
* 查找指定目錄下的(所有)文件
* 注:既能查找出有後綴名的文件,又能查找出無後綴名的文件
*
* public static Collection<File> listFiles(final File directory, final String[] extensions, final boolean recursive)
* 方法的三個參數分別是:
* File directory: 指定文件夾目錄
* String[] extensions:篩選出指定後綴名的文件,若爲null,表示不作篩選,直接返回查到的所有文件
* boolean recursive:是否遞歸
*
* @date 2019/6/13 19:44
*/
@Test
public void testThree() {
// 篩選出指定後綴名的文件
String[] extensions = new String[]{"java", "xml", "txt"};
// null表示不作篩選,FileUtils.listFiles會直接返回所有的文件
// String[] extensions = null;
// 遍歷查找指定目錄下的所有文件
Collection<File> filesList = FileUtils.listFiles(new File(BASE_DIR ), extensions, true);
for (File file: filesList) {
System.out.println(file.getAbsolutePath());
}
}
/**
* 查找指定目錄下的(所有)文件
* 注:既能查找出有後綴名的文件,又能查找出無後綴名的文件
* 注:此方法與testThree方法功能幾乎一致,不過 在public static Collection<File> listFiles(final File directory, final IOFileFilter fileFilter, final IOFileFilter dirFilter)
* 方法,比testThree中的FileUtils.listFiles方法更靈活。
*
* @date 2019/6/13 19:44
*/
@Test
public void testFour() {
// (遞歸)遍歷查找指定目錄下的所有文件
// Collection<File> filesList = FileUtils.listFiles(new File(BASE_DIR ), TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
/*
* (遞歸)遍歷查找指定目錄下的所有文件,返回以【m.xml】結尾的文件
* 如果篩選條件有多個的話,可以使用FileFilterUtils.and()、FileFilterUtils.or()來實現
*/
Collection<File> filesList = FileUtils.listFiles(new File(BASE_DIR ), FileFilterUtils.suffixFileFilter("m.xml"), TrueFileFilter.INSTANCE);
for (File file: filesList) {
System.out.println(file.getAbsolutePath());
}
}
-
比較兩個文件中的內容是否完全一致
/**
* 比較兩個文件中的內容是否完全一致
* 注:有一個空格都不算一致
* 注:若兩個文件都不存在,那麼也算一致
*
* @date 2019/6/13 19:44
*/
@Test
public void testSix() throws IOException {
boolean result = FileUtils.contentEquals(new File("C:\\Users\\JustryDeng\\Desktop\\a.txt"),
new File("C:\\Users\\JustryDeng\\Desktop\\b.txt"));
System.out.println(result);
}
-
將指定目錄下的所有內容(文件、文件夾),拷貝到一個新的目錄下
/**
* 將指定目錄下的所有內容(文件、文件夾),拷貝到一個新的目錄下
* 注:若這個新的目錄不存在,那麼會自動創建
* 注:若目的文件夾下存在相同名字的文件、文件夾,那麼會進行覆蓋
* 注:只拷貝源目錄下的內容,源目錄不會被拷貝
* 注:其有一個比較實用的重載方法copyDirectory(final File srcDir, final File destDir,final FileFilter filter),
* 該方法能對源文件、文件夾進行過濾,只有滿足FileFilter的文件/文件件,纔會被拷貝進 目的文件夾下, 可詳見源碼
*
* @date 2019/6/13 19:44
*/
@Test
public void testSeven() throws IOException {
FileUtils.copyDirectory(new File(BASE_DIR), new File("C:\\Users\\JustryDeng\\Desktop\\xyz\\jpg"));
}
-
將指定目錄以及該目錄下的的所有內容(文件、文件夾),拷貝到一個新的目錄下
/**
* 將指定目錄以及該目錄下的的所有內容(文件、文件夾),拷貝到一個新的目錄下
* 注:若這個新的目錄不存在,那麼會自動創建
* 注:若目的文件夾下存在相同名字的文件、文件夾,那麼會進行覆蓋
* 注:與testSeven不同的是,這裏直接連源目錄都一起進行拷貝了
* 注:其有一個比較實用的重載方法copyDirectory(final File srcDir, final File destDir,final FileFilter filter),
* 該方法能對源文件、文件夾進行過濾,只有滿足FileFilter的文件/文件件,纔會被拷貝進 目的文件夾下, 可詳見源碼
*
* @date 2019/6/13 19:44
*/
@Test
public void testEight() throws IOException {
FileUtils.copyDirectoryToDirectory(new File(BASE_DIR), new File("C:\\Users\\JustryDeng\\Desktop\\xyz\\jpg"));
}
-
拷貝一個文件,到一個新的文件
/**
* 拷貝一個文件,到一個新的文件
*
* 注:FileUtils.copyFile方法只能拷貝文件,不能拷貝文件夾
* 注:新文件的存放路徑如果不存在,會自動創建
*
* @date 2019/6/24 14:19
*/
@Test
public void testNine() throws IOException {
FileUtils.copyFile(new File("C:\\Users\\JustryDeng\\Desktop\\a.txt"), new File("C:\\Users\\JustryDeng\\Desktop\\lv\\re.txt"));
}
-
拷貝一個文件,到一個輸出流
/**
* 拷貝一個文件,到一個輸出流
*
* @date 2019/6/24 14:19
*/
@Test
public void testTen() throws IOException {
try (OutputStream os = System.out) {
FileUtils.copyFile(new File("C:\\Users\\JustryDeng\\Desktop\\a.txt"), os);
String str = os.toString();
System.out.println(str);
}
}
-
拷貝一個輸入流,到一個文件
/**
* 拷貝一個輸入流,到一個文件
* 注:會自動創建文件
* 注:如果路徑不存在的話,會自動創建相關文件夾
*
* @date 2019/6/24 14:19
*/
@Test
public void testEleven() throws IOException {
File tmpFile = new File("C:\\Users\\JustryDeng\\Desktop\\b.txt");
try (InputStream is = new FileInputStream(tmpFile)) {
// 等價於copyToFile(InputStream source, File destination)
FileUtils.copyInputStreamToFile(is, new File("C:\\Users\\JustryDeng\\Desktop\\mq\\tmp\\b2.txt"));
}
}
-
拷貝文件到指定目錄下
/**
* 拷貝文件到指定目錄下
* 注:如果目標目錄不存在,那麼會自動創建
*
* @date 2019/6/24 14:19
*/
@Test
public void testTwelve() throws IOException {
FileUtils.copyFileToDirectory(new File("C:\\Users\\JustryDeng\\Desktop\\a.txt"),
new File("C:\\Users\\JustryDeng\\Desktop\\mq\\tmp\\"));
}
-
拷貝【文件】或【文件夾】到指定目錄下
/**
* 拷貝【文件】或【文件夾】 到 指定目錄下
* 注:如果目標目錄不存在,那麼會自動創建
* 注:如果拷貝的是文件夾,那麼連該文件夾下的所有東西,都會一同進行拷貝
*
* @date 2019/6/24 14:19
*/
@Test
public void testThirteen() throws IOException {
FileUtils.copyToDirectory(new File("C:\\Users\\JustryDeng\\Desktop\\abc"),
new File("C:\\Users\\JustryDeng\\Desktop\\mq\\tmp\\"));
}
-
拷貝URL指向的文件到指定文件(即:下載URL指向的文件)
/**
* 拷貝URL指向的文件 到 指定文件(即:下載URL指向的文件)
* 注:如果文件的相關目錄不存在,那麼會自動創建相關文件夾
* 注:copyURLToFile還有一個重載方法copyURLToFile(URL source, File destination, int connectionTimeout, int readTimeout)
*
* @date 2019/6/24 14:19
*/
@Test
public void testFourteen() throws IOException {
URL url = new URL("https://avatar.csdn.net/D/8/D/3_justry_deng.jpg");
FileUtils.copyURLToFile(url, new File("C:\\Users\\JustryDeng\\Desktop\\mq\\tmp\\ds.jpg"));
}
-
清除目錄(而不刪除它)
/**
* 清除目錄(而不刪除它)
*
* @date 2019/6/13 19:44
*/
@Test
public void testFive() throws IOException {
FileUtils.cleanDirectory(new File("C:\\Users\\JustryDeng\\Desktop\\xyz"));
}
-
刪除文件夾(及裏面的內容)
/**
* 刪除文件夾(及裏面的內容)
*
* 注:如果刪除失敗的話,那麼會IOException拋出異常
*
* @date 2019/6/24 14:19
*/
@Test
public void testFiveteen() throws IOException {
FileUtils.deleteDirectory(new File("C:\\Users\\JustryDeng\\Desktop\\mq"));
}
-
刪除指定的文件或指定的文件夾(及裏面的內容)
/**
* 刪除指定的文件 或 指定的文件夾(及裏面的內容)
*
* 注:如果刪除失敗的話,那麼會IOException拋出異常
* 注:此方法不會拋出異常,只會返回 刪除成功與否(提示:若文件/文件夾不存在,則會被視爲刪除失敗,進而返回false)
*
* @date 2019/6/24 14:19
*/
@Test
public void testSixteen() {
boolean result = FileUtils.deleteQuietly(new File("C:\\Users\\JustryDeng\\Desktop\\mq"));
System.out.println(result);
}
-
判斷指定目錄下,是否存在指定的文件、文件夾
/**
* 判斷指定目錄下,是否存在 指定的文件、文件夾
* 注:不僅能看子級的,還能看子孫級別的
*
* @date 2019/6/24 14:19
*/
@Test
public void testSeventeen() throws IOException {
boolean result = FileUtils.directoryContains(new File(BASE_DIR),
new File(BASE_DIR + "\\z\\tmp\\l.txt"));
System.out.println(result);
}
-
根據給定的文件,創建其所在的目錄
/**
* 根據給定的文件,創建其所在的目錄
*
* 注:若父目錄也不存在,那麼會自動創建
* 注:還有一個相似的方法:創建給定的文件夾目錄FileUtils.forceMkdir
*
* @date 2019/6/24 14:19
*/
@Test
public void testEighteen() throws IOException {
FileUtils.forceMkdirParent(new File("C:\\Users\\JustryDeng\\Desktop\\ppt\\tmp\\mq.pdf"));
}
-
通過工具類獲取File
-
查看文件、文件夾的大小
/**
* 演示一: 通過工具類獲取File
* 演示二: 查看文件、文件夾的大小
*
* 注:若父目錄也不存在,那麼會自動創建
* 注:還有一個相似的方法:創建給定的文件夾目錄FileUtils.forceMkdir
*
* @date 2019/6/24 14:19
*/
@Test
public void testNineteen() {
// 通過工具類獲取File
File file = FileUtils.getFile(new File("C:\\Users\\JustryDeng\\Desktop\\阿里巴巴Java開發手冊1.4.0.pdf"));
// 查看文件、文件夾的大小
System.out.println(FileUtils.sizeOf(file) + "bytes");
System.out.println(FileUtils.sizeOf(file) * 1.0 / 1024 / 1024 + "MB");
}
-
根據文件,獲得輸入流
-
根據文件,獲得輸出流
-
將文件的內容讀入字節數組
-
將文件的內容讀入字符串
/**
* 演示一: 根據文件,獲得輸入流
* 演示二: 根據文件,獲得輸出流
* 演示三: 將文件的內容讀入字節數組
* 演示四: 將文件的內容讀入字符串
*
* 注:若父目錄也不存在,那麼會自動創建
* 注:還有一個相似的方法:創建給定的文件夾目錄FileUtils.forceMkdir
*
* TODO 本人這裏主要是介紹這些個功能,所以本人這裏就沒有管是否釋放資源; 在實際使用時記得要釋放資源
*
* @date 2019/6/24 14:19
*/
@Test
@SuppressWarnings("unused")
public void testTwenty() throws IOException {
// 根據文件,獲得輸入流
InputStream is = FileUtils.openInputStream(new File("C:\\Users\\JustryDeng\\Desktop\\阿里巴巴Java開發手冊1.4.0.pdf"));
/*
* 根據文件,獲得輸出流(若指定位置下有源文件,那麼會覆蓋源文件);
* 注:此方法還有一個重載方法FileUtils.openOutputStream(final File file, final boolean append)
* 次二哥參數,控制 是覆蓋源文件,還是在源文件後面追加(默認爲覆蓋)。
*/
OutputStream os = FileUtils.openOutputStream(new File("C:\\Users\\JustryDeng\\Desktop\\m\\d\\阿里巴巴Java開發手冊1.4.0.pdf"));
// 將文件的內容讀入字節數組
byte[] contentBytes = FileUtils.readFileToByteArray(new File("C:\\Users\\JustryDeng\\Desktop\\a.txt"));
// 將文件的內容讀入字符串
String contentString = FileUtils.readFileToString(new File("C:\\Users\\JustryDeng\\Desktop\\a.txt"), StandardCharsets.UTF_8);
}
-
將文件的內容按照行爲劃分,讀取出來
/**
* 將文件的內容按照行爲劃分,讀取出來
*
* @date 2019/6/24 14:19
*/
@Test
public void testTwentyOne() throws IOException {
List<String> lineStrList = FileUtils.readLines(new File("C:\\Users\\JustryDeng\\Desktop\\a.txt"), StandardCharsets.UTF_8);
for (String lineStr : lineStrList) {
System.out.println(lineStr);
}
}
-
向指定文件中寫入內容
/**
* 向指定文件中寫入內容
* 注:若文件不存在(或相關文件夾不存在),那麼會自動創建
*
* @date 2019/6/24 14:19
*/
@Test
public void testTwentyTwo() throws IOException {
File targetFile = new File("C:\\Users\\JustryDeng\\Desktop\\asd\\sdf\\f\\c.txt");
// 通過最後一個參數控制,是覆蓋 還是追加
// 注意:追加數據時,是直接追加,不會另起一行追加;如果需要換行的話,那麼可以使用IOUtils.LINE_SEPARATOR
FileUtils.writeStringToFile(targetFile, IOUtils.LINE_SEPARATOR + "i am data 咿呀咔咔!", Charset.forName("GBK"), true);
}
IOUtils:
聲明:下面示例的只是IOUtils一些相對常用的方法。
-
通過InputStream,獲取BufferedInputStream
-
通過OutputStream,獲取BufferedOutputStream
-
通過Reader,獲取BufferedReader
-
通過Writer,獲取BufferedWriter
/**
* 通過InputStream,獲取BufferedInputStream
* 通過OutputStream,獲取BufferedOutputStream
* 通過Reader,獲取BufferedReader
* 通過Writer,獲取BufferedWriter
*
* 注:方法使用方式一樣,本人這裏只演示 過InputStream,獲取BufferedInputStream
*
*
* BufferedInputStream buffer(InputStream inputStream)
* BufferedInputStream buffer(InputStream inputStream, int size)
*
* BufferedOutputStream buffer(OutputStream outputStream)
* BufferedOutputStream buffer(OutputStream outputStream, int size)
*
* BufferedReader buffer(Reader reader)
* BufferedReader buffer(Reader reader, int size)
*
* BufferedWriter buffer(Writer writer)
* BufferedWriter buffer(Writer writer, int size)
*
* @date 2019/6/25 10:14
*/
@Test
public void testOne() throws IOException {
InputStream io = FileUtils.openInputStream(new File("C:\\Users\\JustryDeng\\Desktop\\a.txt"));
// 通過InputStream獲取BufferedInputStream,如果InputStream本人就是BufferedInputStream的話,
// 那麼直接返回;否者創建BufferedInputStream
// 如果BufferedInputStream是新建的的話,那麼其默認buffer尺寸爲8192
BufferedInputStream bufferedInputStreamOne = IOUtils.buffer(io);
// 通過InputStream獲取BufferedInputStream,如果BufferedInputStream是新建的的話,那麼設置此buffer的尺寸
BufferedInputStream bufferedInputStreamTwo = IOUtils.buffer(io, 1024);
}
-
通過CharSequence、String,獲取InputStream
-
通過byte[],獲取String
-
通過InputStream、Reader、URL,獲取String
-
通過InputStream、Reader,獲取BufferedInputStream、BufferedReader
-
通過InputStream、Reader、String、URI、URL、URLConnection,獲取byte[]
-
通過InputStream、Reader,獲取char[]
/**
* 演示一:通過CharSequence、String,獲取InputStream
* 演示二:通過byte[],獲取String
* 演示三:通過InputStream、Reader、URL,獲取String
* 演示四:通過InputStream、Reader,獲取BufferedInputStream、BufferedReader
* 演示五:通過InputStream、Reader、String、URI、URL、URLConnection,獲取byte[]
* 演示六:通過InputStream、Reader,獲取char[]
*
* static InputStream toInputStream(CharSequence input)
* static InputStream toInputStream(CharSequence, Charset)
* static InputStream toInputStream(CharSequence input, Charset encoding)
* static InputStream toInputStream(CharSequence input, String encoding)
* static InputStream toInputStream(String input)
* static InputStream toInputStream(String, Charset)
* static InputStream toInputStream(String input, Charset encoding)
* static InputStream toInputStream(String input, String encoding)
*
* static String toString(byte[] input)
* static String toString(byte[] input, String encoding)
* static String toString(InputStream input)
* static String toString(InputStream, Charset)
* static String toString(InputStream input, Charset encoding)
* static String toString(InputStream input, String encoding)
* static String toString(Reader input)
* static String toString(URI uri)
* static String toString(URI, Charset)
* static String toString(URI uri, Charset encoding)
* static String toString(URI uri, String encoding)
* static String toString(URL url)
* static String toString(URL, Charset)
* static String toString(URL url, Charset encoding)
* static String toString(URL url, String encoding)
*
* static InputStream toBufferedInputStream(InputStream input)
* static InputStream toBufferedInputStream(InputStream input, int size)
* static BufferedReader toBufferedReader(Reader reader)
* static BufferedReader toBufferedReader(Reader reader, int size)
*
* static byte[] toByteArray(InputStream input)
* static byte[] toByteArray(InputStream input, int size)
* static byte[] toByteArray(InputStream input, long size)
* static byte[] toByteArray(Reader input)
* static byte[] toByteArray(Reader, Charset)
* static byte[] toByteArray(Reader input, Charset encoding)
* static byte[] toByteArray(Reader input, String encoding)
* static byte[] toByteArray(String input)
* static byte[] String.getBytes()
* static byte[] toByteArray(URI uri)
* static byte[] toByteArray(URL url)
* static byte[] toByteArray(URLConnection urlConn)
*
* static char[] toCharArray(InputStream is)
* static char[] toCharArray(InputStream, Charset)
* static char[] toCharArray(InputStream is, Charset encoding)
* static char[] toCharArray(InputStream is, String encoding)
* static char[] toCharArray(Reader input)
*
* @date 2019/6/25 10:14
*/
@Test
public void testTwo() throws IOException {
// 演示一:通過CharSequence、String,獲取InputStream
InputStream io = IOUtils.toInputStream("我是一隻小小小小鳥~嗷!嗷!", Charset.forName("GBK"));
// 演示二:通過byte[],獲取String
byte[] bytesTmp = new byte[]{97, 98, 99, 100};
String strOne = IOUtils.toString(bytesTmp, "UTF-8");
System.out.println(strOne);
// 演示三:通過InputStream、Reader、URL,獲取String
String strTwo = IOUtils.toString(io, Charset.forName("GBK"));
System.out.println(strTwo);
// 演示四:通過InputStream、Reader,獲取BufferedInputStream、BufferedReader
InputStream isTwo = FileUtils.openInputStream(FileUtils.getFile("C:\\Users\\JustryDeng\\Desktop\\a.txt"));
InputStream isTmp = IOUtils.toBufferedInputStream(isTwo);
System.out.println(isTmp);
Reader readerOne = new FileReader(("C:\\Users\\JustryDeng\\Desktop\\a.txt"));
BufferedReader brTmp = IOUtils.toBufferedReader(readerOne);
System.out.println(brTmp);
// 演示五:通過InputStream、Reader、String、URI、URL、URLConnection,獲取byte[]
FileInputStream fis = new FileInputStream("C:\\Users\\JustryDeng\\Desktop\\a.txt");
InputStreamReader isr = new InputStreamReader(fis, "GBK");
byte[] byteData = IOUtils.toByteArray(isr, Charset.forName("GBK"));
System.out.println(new String(byteData, Charset.forName("GBK")));
// 演示六:通過InputStream、Reader,char[]
InputStream ioTwo = IOUtils.toInputStream("我是一隻小小小小鳥~嗷!嗷!", Charset.forName("GBK"));
char[] charData = IOUtils.toCharArray(ioTwo, Charset.forName("GBK"));
for (char c : charData) {
System.out.println(c);
}
}
-
比較兩個流的數據是否相等
/**
* 比較兩個流的數據是否相等
*
* 相似的方法還有:
* boolean contentEquals(InputStream input1, InputStream input2)
* boolean contentEquals(Reader input1, Reader input2)
* boolean contentEqualsIgnoreEOL(Reader input1, Reader input2)
* @date 2019/6/25 10:14
*/
@Test
public void testThree() throws IOException {
InputStream isOne = IOUtils.toInputStream("我是一隻小小小小鳥~嗷!嗷!", Charset.forName("GBK"));
InputStream isTwo = IOUtils.toInputStream("我是一隻小小小小鳥~嗷!嗷!", Charset.forName("GBK"));
boolean result = IOUtils.contentEquals(isOne, isTwo);
System.out.println(result);
}
-
將輸入流的數據,拷貝至輸出流
/**
* 將輸入流的數據,拷貝至輸出流
*
* 相似的方法還有:
* copy(InputStream input, OutputStream output)
* copy(InputStream input, OutputStream output, int bufferSize)
* copy(InputStream, Writer, Charset) instead
* copy(InputStream input, Writer output, Charset inputEncoding)
* copy(InputStream input, Writer output, String inputEncoding)
* copy(Reader, OutputStream, Charset) instead
* copy(Reader input, OutputStream output, Charset outputEncoding)
* copy(Reader input, OutputStream output, String outputEncoding)
* copy(Reader input, Writer output)
*
* copyLarge(InputStream input, OutputStream output)
* copyLarge(InputStream input, OutputStream output, byte[] buffer)
* copyLarge(InputStream input, OutputStream output, long inputOffset, long length)
* copyLarge(InputStream input, OutputStream output, long inputOffset, long length, byte[] buffer)
* copyLarge(Reader input, Writer output)
* copyLarge(Reader input, Writer output, char[] buffer)
* copyLarge(Reader input, Writer output, long inputOffset, long length)
* copyLarge(Reader input, Writer output, long inputOffset, long length, char[] buffer)
* @date 2019/6/25 10:14
*/
@Test
public void testFour() throws IOException {
InputStream is = IOUtils.toInputStream("我是一隻小小小小鳥~嗷!嗷!", Charset.forName("GBK"));
OutputStream os = FileUtils.openOutputStream(new File("C:\\Users\\JustryDeng\\Desktop\\c.txt"));
// 複製
long bytesCount = IOUtils.copy(is, os, 10240);
// 複製(這個方法其實是對copy(InputStream input, OutputStream output, int bufferSize)的封
// 裝,只是buffer尺寸設置得較大,所以這個方法適合拷貝較大的數據流,比如2G以上)
// long bytesCount = IOUtils.copyLarge(is, os);
System.out.println("複製了的字節數:" + bytesCount);
}
-
以行爲單元,從輸入流中讀取數據
/**
* 以行爲單元,從輸入流中讀取數據
*
* 相似的方法還有:
* lineIterator(InputStream input, Charset encoding)
* lineIterator(InputStream input, String encoding)
* lineIterator(Reader reader)
*
* readLines(InputStream input)
* readLines(InputStream, Charset) instead
* readLines(InputStream input, Charset encoding)
* readLines(InputStream input, String encoding)
* readLines(Reader input)
*
* @date 2019/6/25 11:32
*/
@Test
public void testFive() throws IOException {
// 示例lineIterator
InputStream isOne = IOUtils.toInputStream("我是\n一隻\n小小小小\n鳥~\n嗷!嗷!", Charset.forName("UTF-8"));
LineIterator iterator= IOUtils.lineIterator(isOne, Charset.forName("UTF-8"));
while (iterator.hasNext()) {
System.out.println(iterator.nextLine());
}
// 示例readLines
InputStream isTwo = IOUtils.toInputStream("這裏的\n山路\n十八彎!", Charset.forName("GBK"));
List<String> list= IOUtils.readLines(isTwo, Charset.forName("GBK"));
System.out.println(list);
}
-
從流中讀取數據至byte[]
/**
* 從流中讀取數據至byte[]
*
* 相似的方法還有:
* read(InputStream input, byte[] buffer)
* read(InputStream input, byte[] buffer, int offset, int length)
* read(ReadableByteChannel input, ByteBuffer buffer)
* read(Reader input, char[] buffer)
* read(Reader input, char[] buffer, int offset, int length)
*
* readFully(InputStream input, byte[] buffer)
* readFully(InputStream input, byte[] buffer, int offset, int length)
* static byte[] readFully(InputStream input, int length)
* readFully(ReadableByteChannel input, ByteBuffer buffer)
* readFully(Reader input, char[] buffer)
* readFully(Reader input, char[] buffer, int offset, int length)
* @date 2019/6/25 11:41
*/
@Test
public void testSix() throws IOException {
// 示例read
InputStream isOne = IOUtils.toInputStream("我是\n一隻\n小小小小\n鳥~\n嗷!嗷!", Charset.forName("UTF-8"));
byte[] buffer = new byte[50];
IOUtils.read(isOne, buffer);
System.out.println(new String(buffer));
// 示例readFully
// 注意:與read不同的是,如果輸入流中的字節長度不足的話,readFully會拋出異常!(而read不會)
InputStream isTwo = IOUtils.toInputStream("我是\n一隻\n小小小小\n鳥~\n嗷!嗷!", Charset.forName("UTF-8"));
byte[] data = IOUtils.readFully(isTwo,40);
System.out.println(new String(data));
}
-
將數據寫入到輸出流
/**
* 將數據寫入到輸出流
*
* 類似的還有:
* static void writeLines(Collection<?> lines, String lineEnding, OutputStream output)
* static void writeLines(Collection, String, OutputStream, Charset)
* static void writeLines(Collection<?> lines, String lineEnding, OutputStream output, Charset encoding)
* static void writeLines(Collection<?> lines, String lineEnding, OutputStream output, String encoding)
* static void writeLines(Collection<?> lines, String lineEnding, Writer writer)
*
* static void write(byte[] data, OutputStream output)
* static void write(byte[] data, Writer output)
* static void write(byte[], Writer, Charset)
* static void write(byte[] data, Writer output, Charset encoding)
* static void write(byte[] data, Writer output, String encoding)
* static void write(char[] data, OutputStream output)
* static void write(char[], OutputStream, Charset)
* static void write(char[] data, OutputStream output, Charset encoding)
* static void write(char[] data, OutputStream output, String encoding)
* static void write(char[] data, Writer output)
* static void write(CharSequence data, OutputStream output)
* static void write(CharSequence, OutputStream, Charset)
* static void write(CharSequence data, OutputStream output, Charset encoding)
* static void write(CharSequence data, OutputStream output, String encoding)
* static void write(CharSequence data, Writer output)
* static void write(StringBuffer data, OutputStream output)
* static void write(CharSequence, OutputStream)
* static void write(StringBuffer data, OutputStream output, String encoding)
* static void write(CharSequence, OutputStream, String)
* static void write(StringBuffer data, Writer output)
* static void write(CharSequence, Writer)
* static void write(String data, OutputStream output)
* static void write(String, OutputStream, Charset)
* static void write(String data, OutputStream output, Charset encoding)
* static void write(String data, OutputStream output, String encoding)
* static void write(String data, Writer output)
*
* static void writeChunked(byte[] data, OutputStream output)
* static void writeChunked(char[] data, Writer output)
*
* @date 2019/6/25 11:57
*/
@Test
public void testSeven() throws IOException {
// 示例writeLines
OutputStream osOne = FileUtils.openOutputStream(new File("C:\\Users\\JustryDeng\\Desktop\\c.txt"), true);
List<String> linesData = new ArrayList<>(8);
linesData.add(IOUtils.LINE_SEPARATOR);
linesData.add("鄧沙利文");
linesData.add("亨得帥");
linesData.add("鄧二洋");
IOUtils.writeLines(linesData, IOUtils.LINE_SEPARATOR, osOne, "GBK");
// 示例write
OutputStream osTwo = FileUtils.openOutputStream(new File("C:\\Users\\JustryDeng\\Desktop\\c.txt"), true);
char[] charData = new char[]{'s', 'w', 'a', 'g', 'g', 'e', 'r', '挺', '好', '的', '!'};
IOUtils.write(charData, osTwo, "GBK");
byte[] byteData = (IOUtils.LINE_SEPARATOR + "我是一隻小小小小鳥~").getBytes("GBK");
IOUtils.write(byteData, osTwo);
}
筆者建議:更多細節與用法可自行查閱commons-io官方文檔,鏈接見文末。