commons-io之FileUtils、IOUtils

筆者日常:這是筆者來深圳後的第一篇博客~記錄一下,2019-06-25


commons-io簡單說明

Common IO 是一個工具庫,用來幫助開發IO功能 它包括6個主要部分:

  1. 一些工具類:包括一些靜態方法來執行常用任務。

  2. 輸入:InputStream 和 Reader 實現。

  3. 輸出:OutputStream 和 Writer 實現。

  4. 過濾器:多種文件過濾器實現(定義了 IOFileFilter接口,同時繼承了 FileFilter 和 FilenameFilter 接口)。

  5. 比較器:用於文件比較的多種java.util.Comparatot實現。

  6. 文件監聽器:監聽文件系統事件的組件。


相對比較常用的有兩個工具類:FileUtilsIOUtils,本文主要學習這兩個工具類的部分常用方法。


使用測試

軟硬件環境說明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官方文檔,鏈接見文末。

 

^_^ 如有不當之處,歡迎指正

^_^ 參考鏈接
              
http://commons.apache.o...elease/index.html

^_^ 測試代碼託管鏈接
              
https://github.com/JustryDeng/CommonRepository

^_^ 本文已經被收錄進《程序員成長筆記(五)》,筆者JustryDeng

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章