Java基礎知識14--commons-io第3方開源庫的具體使用(IOUtils類、FileUtils類、FilenameUtils類)


1.commons-io概述

Apache Commons IO是由Apache Foundation創建和維護的Java庫。 它提供了許多類,使開發人員可以輕松地完成常見任務並且減少樣板代碼。

commons-io是一款處理io流的工具庫,封裝了很多處理io流和文件的方法,可以大大簡化我們處理io流和操作文件的代碼.

 Apache Commons IO庫提供以下類別的類:

  • Utility classes - org.apache.commons.io包下的這些類提供文件和字符串比較。 以下是一些例子。

    • IOUtils - 提供用於讀取,寫入和復制文件的實用程序方法。 這些方法適用於InputStream,OutputStream,Reader和Writer。

    • FilenameUtils - 提供在不使用文件對象的情況下處理文件名的方法。 它以類似的方式在不同的操作系統上運行。

    • FileUtils - 提供操作文件的方法,如移動,打開,檢查存在,讀取文件等。這些方法使用文件對象。

    • IOCase - 提供字符串操作和比較的方法。

    • FileSystemUtils - 提供獲取磁盤驅動器上的可用空間的方法。

    • LineIterator - 提供使用基於行的文件的靈活方式。

  • Filter classes - org.apache.commons.io.filefilter包下的過濾器類提供了基於邏輯標准而不是基於字符串的繁瑣比較來過濾文件的方法。 以下是一些例子。

    • NameFileFilter - 過濾名稱的文件名。

    • WildcardFileFilter - 使用提供的通配符過濾文件。

    • SuffixFileFilter - 根據后綴過濾文件。 這用於檢索特定類型的所有文件。

    • PrefixFileFilter - 根據前綴過濾文件。

  • File Monitor classes - org.apache.commons.io.monitor包下的文件監視器類提供控制以跟蹤特定文件或文件夾中的更改,並允許相應地對更改執行操作。 以下是一些例子。

    • FileEntry - 提供文件或目錄的狀態,某個時間點的文件屬性。

    • FileAlterationObserver - 表示根目錄下的文件狀態,檢查文件系統並通知偵聽器創建,更改或刪除事件。

    • FileAlterationMonitor - 表示生成監視線程的線程,該線程以指定的時間間隔觸發任何已注冊的FileAlterationObserver。

  • Comparator classes - org.apache.commons.io.comparator包下的文件監視器類允許輕松地比較和排序文件和目錄。

    • NameFileComparator - 比較兩個文件的名稱。

    • SizeFileComparator - 比較兩個文件的大小。

    • LastModifiedFileComparator - 比較兩個文件的最后修改日期。

  • Stream classes - 在org.apache.commons.io.input包下有多個InputStream實現,在org.apache.commons.io.input包下有OutputStream,可以在流上執行有用的任務。 以下是一些例子。

    • TeeOutputStream - 將輸出發送到兩個流。

    • ByteArrayOutputStream - 更快的JDK類版本。

    • CountingOutputStream - 計算通過流傳遞的字節數。

    • CountingOutputStream - 計算通過流傳遞的字節數。

maven依賴:

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

2.IOUtils

提供用於讀取,寫入和復制文件(拷貝流)的實用方法。 這些方法適用於InputStream,OutputStream,Reader和Writer。

public class IOUtils extends Object

常用方法總結如下:

2.1 toInputStream

public static InputStream toInputStream(String input,String charsetName)

將指定的字符串轉換為輸入流,使用指定的字符編碼將其編碼為字節。

使用案例:

InputStream is = IOUtils.toInputStream("This is a String", "utf-8");

2.2 copy方法

這個方法可以拷貝流,算是這個工具類中使用最多的方法了。支持多種數據間的拷貝:

copy(inputstream,outputstream)
copy(inputstream,writer)
copy(inputstream,writer,encoding)
copy(reader,outputstream)
copy(reader,writer)
copy(reader,writer,encoding)

使用案例:將內容按字節從一個InputStream對象復制到一個OutputStream對象,並返回復制的字節數。

public static void copyFileTest(){
        InputStream is =null;
        OutputStream os=null;
        try {
            is = IOUtils.toInputStream("This is a String", "utf-8");
            os = new FileOutputStream("D:\\data\\3.txt");
            //將字節從 InputStream 復制到 OutputStream。實現文件的拷貝
            int bytes = IOUtils.copy(is, os);
            System.out.println("File Written with " + bytes + " bytes");
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            IOUtils.closeQuietly(is);
            IOUtils.closeQuietly(os);
        }
    }

2.3 readLines方法

readLines方法可以從流中讀取內容,並轉換為String的list

readLines(inputstream)
readLines(inputstream,charset)
readLines(inputstream,encoding)
readLines(reader)

使用案例:

    public static void readLinesTest(){
        try{
            InputStream is = new FileInputStream("D:\\data\\3.txt");
            List<String> lines = IOUtils.readLines(is);
            for(String line : lines){
                System.out.println(line);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

效果圖:

 

 2.4 writeLines方法

writeLines這個方法可以把string的List寫入到輸出流中

writeLines(Collection<?> lines, String lineEnding, OutputStream output)
writeLines(Collection<?> lines, String lineEnding, OutputStream output, Charset encoding)
writeLines(Collection<?> lines, String lineEnding, OutputStream output, String encoding)
writeLines(Collection<?> lines, String lineEnding, Writer writer)

使用案例:

    public static void writeLinesTest()  {
        try {
            List<String> lines = new ArrayList();
            lines.add("hello");
            lines.add("list");
            lines.add("to");
            lines.add("file");
            OutputStream os = new FileOutputStream("D:\\data\\3.txt");
            IOUtils.writeLines(lines,IOUtils.LINE_SEPARATOR,os);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

效果圖:

 2.5 skip方法

skip這個方法用於跳f過指定長度的流。

skip(inputstream,skip_length)
skip(ReadableByteChannel,skip_length)
skip(reader,skip_length)

使用案例:

    public static void skipTest(){
        InputStream is = IOUtils.toInputStream("hello world");
        try {
            IOUtils.skip(is,4);
            System.out.println(IOUtils.toString(is,"utf-8"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

效果圖:

 3.FileUtils類

FileUtils提供操作文件的方法,如移動,打開,檢查存在,讀取文件等。這些方法使用文件對象。

public class FileUtils extends Object

3.1 特點 

  • 寫入文件的方法。
  • 從文件中讀取的方法。
  • 制作包含父目錄的目錄的方法。
  • 復制文件和目錄的方法。
  • 刪除文件和目錄的方法。
  • 轉換為URL的方法和從URL轉換的方法。
  • 通過過濾器和擴展名列出文件和目錄的方法。
  • 比較文件內容的方法。
  • 提交上次更改日期的方法。
  • 計算校驗和的方法。

3.2 常用方法匯總

(1)getFile方法

獲取文件對象

public static File getFile(String... names)

(2)getTempDirectory方法

獲取臨時目錄

public static File getTempDirectory()

(3)getTempDirectoryPath方法

獲取臨時目錄路徑

public static String getTempDirectoryPath()

(4)getUserDirectory 方法

返回用戶主目錄

public static File getUserDirectory()

(5) getUserDirectoryPath方法 

返回用戶主目錄路徑

public static String getUserDirectoryPath()

(6) copyFileToDirectory方法 

將指定源文件的內容復制到指定目標目錄中的同名文件中。

public static void copyFileToDirectory(File srcFile,File destDir) throws IOException

(7)readFileToString 方法

將文件的內容讀入字符串。 該文件始終處於關閉狀態。

public static String readFileToString(File file,Charset charsetName) throws IOException

使用案例:

/**
 * @Author lucky
 * @Date 2021/12/13 17:48
 */
public class FileUtilsTest {
    public static void main(String[] args) {
        try {
            //Using FileUtils
            usingFileUtils();
        } catch(IOException e) {
            System.out.println(e.getMessage());
        }
    }
    public static void usingFileUtils() throws IOException {
        //01 獲取文件對象
        File file = FileUtils.getFile("D:\\data\\1.txt");
        //02 獲取臨時目錄
        File tmpDir = FileUtils.getTempDirectory();
        System.out.println(tmpDir.getName());
        String tempDirectoryPath = FileUtils.getTempDirectoryPath();
        System.out.println(tempDirectoryPath);
        //03 將指定源文件的內容復制到指定目標目錄中的同名文件中。
        FileUtils.copyFileToDirectory(file, tmpDir);
        //04 獲取文件對象
        File newTempFile = FileUtils.getFile(tmpDir, file.getName());
        //05 獲取文件內容
        String data = FileUtils.readFileToString(newTempFile, String.valueOf(Charset.defaultCharset()));
        //06 打印內容
        System.out.println(data);
    }
}

控制台輸出:

4.FilenameUtils類

提供在不使用文件對象的情況下處理文件名的方法。 它以類似的方式在不同的操作系統上運行。 這個類解決了從基於Windows的開發機器轉移到基於Unix的生產機器時的問題。

public class FilenameUtils extends Object

該類定義文件名中的六個組件。 將示例位置視為C:\dev\project\file.txt 。 然后組件是 -

  • 前綴 - C:\
  • 相對路徑 - 開發項目\
  • 絕對路徑 - C:\dev\project\
  • 名稱 - file.txt
  • 基本名稱 - 文件
  • 擴展 - txt

要標識目錄,請在文件名中添加分隔符。

使用案例:

    public static void usingFilenameUtils() throws IOException{
        String path = "C:\\dev\\project\\file.txt";
        System.out.println("全路徑: " +FilenameUtils.getFullPath(path));
        System.out.println("相對路徑: " +FilenameUtils.getPath(path));
        System.out.println("Prefix: " +FilenameUtils.getPrefix(path));
        System.out.println("文件后綴: " + FilenameUtils.getExtension(path));
        System.out.println("文件名稱,不包含后綴: " + FilenameUtils.getBaseName(path));
        System.out.println("文件名稱,包含后綴: " + FilenameUtils.getName(path));
        String filename = "C:/commons/io/lang/project.xml";
        System.out.println("獲取當前系統格式化路徑: " + FilenameUtils.normalize(filename));
        System.out.println("移除文件的擴展名:"+FilenameUtils.removeExtension(path));
        System.out.println("轉換分隔符為當前系統分隔符:"+FilenameUtils.separatorsToSystem(path));
        System.out.println("轉換分隔符為linux系統分隔符:"+FilenameUtils.separatorsToUnix(path));
        System.out.println("轉換分隔符為windows系統分隔符:"+FilenameUtils.separatorsToWindows(path));

    }

控制台輸出:

參考文獻:https://iowiki.com/commons_io/commons_io_ioutils.html ---推薦

http://commons.apache.org/proper/commons-io/apidocs/index.html-----API文檔

https://blog.csdn.net/l2580258/article/details/89227761

https://www.cnblogs.com/xing901022/p/5978989.html

https://blog.csdn.net/qq_19167629/article/details/79501022


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM