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構造方法
- 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
注意:
路徑可以是存在或者不存在,路徑可以以檔案或者資料夾結尾,路徑可以是絕對路徑,也可以是相對路徑
- File(String parent, String child)
一個父路徑,一個子路徑
好處:父路徑和子路徑可以靈活的變化,把路徑分為兩部分,
File file2=new File("C:\\","a.txt");
System.out.println(file2);//C:\a.txt
- 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判斷功能的成員方法
- 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
-
boolean isDirectory()
路徑結尾是否是資料夾。 -
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中刪除與建立檔案的方法
- 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
- boolean mkdir()
在構造方法所傳遞的目錄下建立一個資料夾 成功:true 失敗:false(已經建立了和構造方法中路徑不存在也返回false)
File f1=new File("C:\\測試資料夾\\test\\1");
boolean result1=f1.mkdir();
System.out.println(result1); //ture
- boolean mkdirs()
在構造方法所傳遞的目錄下建立多級資料夾或者一個資料夾 成功:true 失敗:false(已經建立了和構造方法中路徑不存在也返回false)
File f2=new File("C:\\測試資料夾\\test\\11\\22\\33");
boolean result2=f2.mkdirs();
System.out.println(result2); //建立多級資料夾
- 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);
}