common-io的使用(十二)

勿以惡小而爲之,勿以善小而不爲--------------------------劉備

勸諸君,多行善事積福報,莫作惡

上一章簡單介紹了 壓縮和解壓縮文件(十一),如果沒有看過,請觀看上一章

一. 爲什麼出現 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);
    }

運行程序,查看文件系統

有圖片

謝謝您的觀看,如果喜歡,請關注我,再次感謝 !!!

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