震驚!男人看了會沉默, 女人看了會流淚! Java中的File類背後的祕密原來是這樣!

Lotus_dong發表於2020-11-28

IO流之File類

IO即InputStream和OutputStream。

Java語言中提供的眾多的對計算機硬碟上的檔案進行操作的類

概述

1、Java.io包中的類。

2、在程式中需要對硬碟中的檔案進行操作,需要在程式中表示一個檔案。

3、一個File類的物件可以表示計算機中的一個檔案或目錄(資料夾)。

4、File物件可以對檔案或目錄的屬性進行操作。

5、通過File類物件可以獲取其所表示的檔案的相關資訊。

6、File類物件不能對檔案中的內容進行讀寫操作。

File類的構造方法

1、File f = new File(“String s”);直接將檔案路徑以字串形式新增進去。

2、File f = new File(“String s1”,“String s2”);將檔案父級路徑以字串形式寫在s1,檔名放在以字串形式放在s2處。

3、File f = new File(parent,“String s”);將檔案父級路徑放在File物件當中,在parent處傳入物件,檔名以字串形式放在s處。

注意:File類的構造方法是在當前目錄下建立一個與指定檔名相關聯的檔案物件,指明詳細的路徑和檔名,一定要注意使用" \ \ “或” / ",因為在Java中 " \ "是有特殊含義的。所謂絕對路徑就是完整的寫明檔案路徑,相對路徑就是隻有檔名。

File類的常用方法

返回值方法名功能描述
booleancanRead()判斷檔案是否可以讀取
booleancanWrite()判斷檔案是否可以寫入
booleanequals()判斷檔案路徑是否一致
booleanexists()判斷檔案是否存在
booleanisAbsolute()判斷給定的檔名是否為絕對路徑
booleanisDirectory()判斷是否為資料夾
booleanisFile()判斷是否為檔案
booleandelete()刪除檔案或資料夾(必須為空資料夾),成功返回true,失敗返回false
booleancreateNewFile()建立一個新檔案,存在就不建立,需要處理異常IOException
booleanmkdir()只能建立單級檔案,存在就不建立,如G : \ \demo
booleanmkdirs()可以建立多級檔案。如G:\ \ demo\ \demo
StringgetAbsolutePath()獲取檔案的絕對路徑
StringgetName()獲取檔名
StringgetPath()獲取檔案路徑
StringgetParent()獲取檔案父級目錄
longlastModified()最後一次修改檔案的時間
longlength()獲取位元組數量
String[ ]list()返回所有指定資料夾下的檔案和資料夾名字作為字串陣列
File[ ]listFiles()返回所有指定資料夾下的檔案和資料夾名字作為File物件陣列
booleanrenameTo()為檔案重新命名

程式碼示例:

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

public class FilePractice1 {
    public static void main(String[] args) {
        //構造方法1
        File f = new File("G:\\test.txt");
        //構造方法2
        File f1 = new File("G:\\","test.txt");
        //構造方法3
        File f2 = new File("G:/");
        File f3 = new File(f2,"test.txt");

        //判斷檔案是否可以讀入
        System.out.println(f.canRead());
        //判斷檔案是否可以寫入
        System.out.println(f.canWrite());
        //判斷檔案路徑是否一致
        System.out.println(f.equals(f1));
        //判斷檔案是否存在
        System.out.println(new File("G:\\demo.txt"));
        //判斷給定檔名是否為絕對路徑
        System.out.println(f.isAbsolute());
        //判斷是否為資料夾
        System.out.println(f.isDirectory());
        //判斷是否為檔案
        System.out.println(f.isFile());
        //建立一個新檔案,存在就不建立,需要處理異常
        try {
            new File("G:\\t.md").createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("檔案路徑不正確!");
        }
        //建立單級檔案
        new File("G:\\num").mkdir();
        //建立多級檔案
        new File("G:\\num\\num").mkdirs();
        //獲取檔案絕對路徑
        System.out.println(f.getAbsolutePath());
        //獲取檔名
        System.out.println(f.getName());
        //獲取檔案路徑
        System.out.println(f.getPath());
        //獲取父級目錄
        System.out.println(new File("G:\\num").getParent());
        //最後一次修改時間---秒
        System.out.println(f.lastModified());
        //獲取位元組數量
        System.out.println(f.length());
        //返回指定資料夾下檔案和資料夾為字串陣列
        String [] str = f2.list();
        System.out.println(Arrays.toString(str));
        //返回指定資料夾下檔案和資料夾為File物件陣列
        File [] files = f2.listFiles();
        System.out.println(Arrays.toString(files));
        //為檔案重新命名
        System.out.println(f.renameTo(new File("hello.txt")));
    }
}

File類的使用

日期格式轉換

我們通過lastModified()獲得的檔案最後一次修改時間是一個long型的數字,跟我們所要看懂的時間完全不同,因此這裡我們需要通過日期的格式轉換將時間轉換為人們能懂的形式,詳細的日期轉換可以看一看這篇部落格link

程式碼示例

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

public class FilePractice2 {
    public static void main(String[] args) {
        File file = new File("G:\\text.txt");
        long l = file.lastModified();
        System.out.println(l);//1606495736813
        Date date = new Date(l);
        SimpleDateFormat sdf  =new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        String str = sdf.format(date);
        System.out.println(str);//2020年11月28日 00:48:56
    }
}
按需求獲取檔名

我們通過list()或者listFile()獲得的檔案目錄下的檔名是指定檔案目錄下的所有檔案,但是有時我們只是需要指定目錄下的一部分指定型別的檔案,比如我只需要txt檔案,這時File類提供的方法就不能夠滿足我們的需要了,因此我們需要自己設計按需返回。

介紹一個介面FilenameFilter , 這個介面的目的就是篩選檔案型別,其內部的方法就只有accept(File dir, String name),當返回為true時就滿足篩選條件,為false就不滿足, 這是list()用的.

程式碼示例—list()返回String[]

import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;

public class FilePractice3 {
    public static void main(String[] args) {
        File file = new File("G:\\Demo2");
        String[] str = file.list();
        System.out.println("G:\\Demo2下的所有檔案為"+Arrays.toString(str));
//  G:\Demo2下的所有檔案為
//  [Demo.md, Demo1, Demo3, test - 副本 (2).txt, test - 副本 (3).txt,
//  test - 副本 (4).txt, test - 副本.txt, test.txt]
        String[] str1 = file.list(new FilenameFilter() {//通過匿名內部類實現篩選txt
            @Override
            public boolean accept(File dir, String name) {
                return (name.substring(name.lastIndexOf(".")+1)).equals("txt");
            }
        });
        for (String s:str1) {
            System.out.print(s+"\t");
        }
// test - 副本 (2).txt	test - 副本 (3).txt	
// test - 副本 (4).txt	test - 副本.txt	test.txt
    }
}

再介紹一個介面FileFilter , 這個介面的目的也是篩選檔案型別,其內部的方法就只有accept(File pathname),當返回為true時就滿足篩選條件,為false就不滿足, 這是listFile()用的.

程式碼示例—listFile( )返回File[ ]

import java.io.File;
import java.io.FileFilter;

public class FilePractice4 {
    public static void main(String[] args) {
        File file = new File("G:\\Demo2");
        File[] files = file.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return (pathname.getName().substring(pathname.getName().lastIndexOf(".")+1)).equals("txt");
            }
        });
        for (File f:files) {
            System.out.println(f+"\t");
        }

    }

相關文章