1. 程式人生 > 其它 >IO流(一)

IO流(一)

技術標籤:java高階

1.絕對路徑和相對路徑介紹

絕對路徑:完整的路徑
相對路徑:一個簡化的路徑

在這裡插入圖片描述

2.File類介紹

注意:以下的檔案路徑名每一個間隔都要用 \,File類的相對路徑是指在當前project的路徑下

2.1靜態方法
static String pathSeparator 與系統有關的路徑分隔符,為了方便,它被表示為一個字串。 windows ; Linux :
static String separator 與系統有關的預設名稱分隔符,為了方便,它被表示為一個字串。 win \ Linux /

public class File1 {
   
    //.在WIN和linux中可以調用出檔案分割符的方法
/*file 檔案 directory 資料夾/目錄 path 路徑 */ public static void main(String[] args) { //static String pathSeparator String s= File.pathSeparator; System.out.println(s); // windows ; Linux : //static String separator String s1= File.separator;
System.out.println(s1); //檔名稱分隔符 win \ Linu / } }

2.2構造方法

  1. File(String pathname),將File的一個物件和引數檔案路徑對應 用的最多的
 File file1=new File("F:\\PS\\Ps 2020-win10系統\\products\\COCM");
 
        System.out.println(file1);//F:\PS\Ps 2020-win10系統\products\COCM

注意:
路徑可以是存在或者不存在,路徑可以以檔案或者資料夾結尾,路徑可以是絕對路徑,也可以是相對路徑

  1. File(String parent, String child)
    一個父路徑,一個子路徑
    好處:父路徑和子路徑可以靈活的變化,把路徑分為兩部分,
 File file2=new File("C:\\","a.txt");
        System.out.println(file2);//C:\a.txt
  1. File(File parent, String child)
    parent 從String變成了File類,這個可以讓父路徑先建立物件呼叫一些方法,再來建立路徑物件

        //1.建立父路徑
        File parent=new File("C:\\");
        //2.父路徑可以呼叫File類一些方法
        parent.canExecute();

        //3.再來建立路徑物件
        File file3=new File(parent,"a.txt");
        System.out.println(file3);    //C:\a.txt

好處:父路徑和子路徑可以靈活的變化,把路徑分為兩部分.
並且父路徑還是File型別,它可以呼叫File類的一些方法.

2.3獲取功能的成員方法

String getAbsolutePath()
返回絕對路徑名字串。

   File file1=new File("\"F:\\PS\\Ps 2020-win10系統\\products\\COCM");
        String s=file1.getAbsolutePath();
        System.out.println(s);   //E:\Internet\"F:\PS\Ps 2020-win10系統\products\COCM

注意:無論傳遞的是絕對路徑還是相對路徑,返回的都是絕對路徑

String getPath()
將此抽象路徑名轉換為一個路徑名字串。

  File file2=new File("\"F:\\PS\\Ps 2020-win10系統\\products\\COCM");
        System.out.println(file2.getPath()); //"F:\PS\Ps 2020-win10系統\products\COCM

String getName()
返回最後一個檔案/資料夾名

 File file3=new File("\"F:\\PS\\Ps 2020-win10系統\\products\\COCM");
        System.out.println(file3.getName());  //COCM

long length()
返回由此抽象路徑名錶示的檔案的長度。

    File file4=new File("E:\\Iotest\\1.jpg");
          long length=file4.length();
        System.out.println(length); //97290

注意: 獲取檔案的長度,這裡獲取的是檔案的大小,以位元組為單位(資料夾沒有大小,獲取為0),如果檔案中給出的路徑不存在,則返回0

2.4判斷功能的成員方法

  1. boolean exists()
    用於判斷構造方法的的目錄是否存在,以及路徑中的檔案是否存在
   File file=new File("E:\\Iotest");
        System.out.println(file.exists()); //true

 File  file1=new File("1.jpg");
        System.out.println(file.exists()); //true
  1. boolean isDirectory()
    路徑結尾是否是資料夾。

  2. boolean isFile()
    路徑結尾是否是檔案

注意:用之前,要先判斷檔案路徑存不存在,如果不存在兩種方法都是false沒意義

  File file2=new File("E:\\Iotest");
        //注意:用之前,要先判斷檔案路徑存不存在,如果不存在兩種方法都是false沒意義
        if (file2.exists())
        {
            System.out.println(file2.isDirectory());
            System.out.println(file2.isFile());
        }


2.5File中刪除與建立檔案的方法

  1. boolean createNewFile()
    在構造方法所傳遞的目錄下 建立一個檔案 成功:true 失敗:false(已經建立了和構造方法中路徑不存在也返回false)
    注意:檔案建立的路徑必須存在,要丟擲IO異常/try catch
  File f=new File("C:\\測試資料夾\\test\\1.txt");
        boolean  result=  f.createNewFile();
        System.out.println(result);  //true
  1. boolean mkdir()
    在構造方法所傳遞的目錄下建立一個資料夾 成功:true 失敗:false(已經建立了和構造方法中路徑不存在也返回false)
  File f1=new File("C:\\測試資料夾\\test\\1");
        boolean result1=f1.mkdir();
        System.out.println(result1); //ture
  1. boolean mkdirs()
    在構造方法所傳遞的目錄下建立多級資料夾或者一個資料夾 成功:true 失敗:false(已經建立了和構造方法中路徑不存在也返回false)
  File f2=new File("C:\\測試資料夾\\test\\11\\22\\33");
        boolean result2=f2.mkdirs();
        System.out.println(result2); //建立多級資料夾
  1. boolean delete()
    在構造方法所傳遞的目錄下 刪除檔案或者目錄 成功:true 失敗:false(構造方法中路徑不存在返回false)
boolean delete()
        File f3=new File("C:\\測試資料夾\\test\\11\\22\\33");
        boolean result3=f3.delete();
        System.out.println(result3);//true  33已經沒了

       

注意:刪除不進回收站,直接從硬碟中刪除

2.6遍歷目錄中的檔案和資料夾

String[ ] list() 打印出目錄下的每一個檔案
返回一個字串陣列,這些字串指定此抽象路徑名錶示的目錄中的檔案和目錄。

 //String[] list() 打印出目錄下的每一個檔案
        File f=new File("C:\\測試資料夾\\test");
         String array[]=f.list();
        for (String i:array)
        {
            System.out.println(i);
        }

File[ ] listFiles() 儲存目錄下的每一個檔案以及對應目錄
返回一個抽象路徑名陣列,這些路徑名錶示此抽象路徑名錶示的目錄中的檔案。

// File[] listFiles() 儲存目錄下的每一個檔案以及對應目錄
        File f1=new File("C:\\測試資料夾\\test");
        File [] array1=f1.listFiles();
        for (File i:array1) {
            System.out.println(i);
        }

注意:
1.List方法和ListFiles方法遍歷的是構造方法中給出的目錄
2.如果構造方法中給出的目錄的路徑不正確或不存在,會丟擲NullPointException
3.隱藏的檔案也可以獲取

3.遞迴

在這裡插入圖片描述
a方法一直呼叫自己:
在這裡插入圖片描述

注意:構造方法禁止遞迴:構造方法是建立物件的,一直遞迴就有無數個物件,編譯就報錯。

遞迴1-n

//遞迴1-n
 public  static  int mehtod(int num)
    {
  if(num==1)
  {
      return 1;
  }
        return num+mehtod(num-1);
    }

遞迴階層

  //遞迴階層
    public  static  int mehtod1(int n)
    {
         if (n==1)
         {
             return 1;
         }
        return n*mehtod1(n-1);
    }

3.1檔案遞迴搜尋,要求.txt結尾的檔案

public class test {
    public static void main(String[] args) {
        //1.建立File物件,定位目標路徑
        File file=new File("C:\\測試資料夾");
            mehthod(file);
    }
    public static void  mehthod(File file)
    {
        //2.建立File型別陣列,收集物件
        File array[]=file.listFiles();
        //3.遍歷檔案
        for (File i:array) {
            //4.是多個檔案巢狀的,遞迴,再呼叫自己,直到不是資料夾為止
            if (i.isDirectory())
            {
                mehthod(i);
            }
            else //5.是一個檔案 列印
            {
                //6.如果是.java的檔案字尾就要先把File物件通過toString方法轉換為字串然後呼叫endswith檢視檔案字尾

                //轉換為字串
                String s=i.toString();
                //看檔案字尾是否為.txt 用endswith
                if(s.endsWith(".txt"))
                {
                    System.out.println(i);
                }
            }
        }
    }
}


3.2檔案過濾器

過濾器 1
在File類中有兩個ListFiles的過載方法
File[] listFiles(FileFilter filter)

FileFilter是一個介面,是用於過濾File物件的

抽象方法:過濾檔案的方法 boolean accept(File pathname)

**File pathname:**使用ListFiles方法遍歷目錄,得到的每一個檔案的物件是pathname

過濾器 2
File[ ] listFiles(FilenameFilter filter)

FilenameFilter介面,用於過濾檔名稱

抽象方法: boolean accept(File dir, String name)
測試指定檔案是否應該包含在某一檔案列表中。

**File dir:**構造方法總傳遞的被遍歷的目錄
**String name:**使用ListFile方法遍歷目錄,獲取的每一個檔案/資料夾的名稱

注意:這兩個過濾器介面沒有實現類,我們自定義實現類,重寫方法accept,在方法中自定義規則

在accept方法中,判斷物件是否以.txt結尾
true,就會把傳遞過去的File物件儲存在File陣列中,false就不會儲存在陣列中

//自定義一個實現類
public class test2  implements FileFilter {
    
    @Override
    public boolean accept(File pathname) {
       //定義規則:在accept方法中,判斷物件是否以.txt結尾
        //是就true存到陣列中,不是就false跳過
      
            //判斷是否為.txt結尾
       boolean result= pathname.toString().endsWith(".txt"); //物件通過tostring方法變成字串,然後呼叫endsWith方法篩選
        return result;
    }
}
  public static  void getfile(File dir)
    {
        //不用普通的ListFiles方法,用它的過載方法傳給File陣列
        File file[]=dir.listFiles(new test2());//傳遞過濾器的匿名物件
        
        //遍歷
        for(File f:file)
        {
            //如果是巢狀資料夾就再遍歷自己,直到不是檔案為止
            if(f.isDirectory())
            {
                getfile(f);
            }
            else
            {
                System.out.println(f);
            }
        }
    }

 public static void main(String[] args) {
        //建立File物件,並選擇要遍歷的地址
        File file=new File("C:\\測試資料夾\\test");
        //呼叫遍歷方法
        getfile(file);
    }