上課內容及作業。File類的常用方法的使用、遞歸遍歷目錄及其子目錄下的文件、使用delete()方法刪除目錄

案例一、FileReader讀取字符數據

1、如果想從文件中直接讀取字符可以使用字符輸入流FileReader,通過此流可以從關聯的文件中讀取一個或一組字符。爲了讓初學者掌握FileReader字符流的使用,在案例中將針對一次讀取一個字符的方式讀取文本文件來學習。
設計思路(實現原理)

  1. 在項目目錄下創建一個文本文件,在文件中輸入內容“中”。
  2. 在main()方法中,通過FileReader(String fileName)構造方法創建字符輸入流對象,並指定待讀取文件txt的路徑。
  3. 使用close()方法,關閉流資源。

2、案例實現

import java.io.*;
public class Exceptiondemo01 {
	public static void main(String []args) {
		Reader reader=null;
		try{
		reader=new FileReader("bry.txt");//導入文本路徑
		int len=reader.read();
		System.out.println(len);//此處如果不加char則爲Unicode編碼,輸出:20013。注意,中字是兩個字節的
		System.out.println((char)len);//如果加上char則直接可以輸出中字。
	}catch (IOException e) {
		// TODO: handle exception
	e.printStackTrace();
	}finally {
		if (reader!=null) {
			try {
			reader.close();
		}catch (IOException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
			}
		}
	}
}

3、總結:FileReader和FileInputStream有非常多相似之處,但是FileReader每次讀取的單位是一個字符,而FileInputStream每次讀取的單位是一個字節。

案例二、FileWriter寫入字符數據

1、我們學習過FileOutputStream寫入數據,但是如果想向文本文件中寫入字符數據,也可以使用FileWriter類。爲了讓初學者掌握FileWriter字符流的使用,案例中將通過FileWriter字符流向fw.txt文件中寫入一串文字來學習。
設計思路(實現原理)

  1. 在main方法中,通過FileWriter(String fileName)構造方法創建字符輸出流對象,並指定寫入的文件路徑。如果沒有文件,則會自動創建一個文件出來。
  2. 通過write()方法將一段字符串直接寫入到文件。
  3. 調用close()方法,關閉流資源。

2、案例實現

import java.io.*;

public class Exceptiondemo02 {
	public static void main(String[] args) {
		Writer w = null;
		try {
			w = new FileWriter("bry.txt");//如果沒有文件,則會自動創建一個文件出來。
			w.write("我是好人"); // 此處爲寫入內容
		} catch (IOException e) {
			// TODO: handle exception
			e.printStackTrace();
		} finally {
			if (w != null) {
				try {
					w.close();
				} catch (IOException e) {
					// TODO: handle exception
					e.printStackTrace();
				}
			}
		}
	}
}

3、總結:FileWriter和FileOutputStream有非常多相似之處,但是FileWriter每次寫入的單位是一個字符,而FileOutputStream每次寫入的單位是一個字節。

案例三、將字節流轉換爲字符流( 轉換流拷貝文件)

1、有時字節流和字符流之間也需要進行轉換,這時就需要用到轉換流。
在JDK中提供了兩個類可以將字節流轉換爲字符流,它們分別是InputStreamReader和OutputStreamWriter。
在這裏我們演示InputStreamReader的轉換方法
2、案例實現

import java.io.*;

public class Exceptiondemo03 {
	public static void main(String []args) {
		InputStream is=null;
		try{
		is=new FileInputStream("bry.txt");//必須是文本文件,不能是其他的,這裏爲字節流
		InputStreamReader i=new InputStreamReader(is);//在這裏進行轉換,這裏得到的是字符流
		System.out.println((char)i.read());//此處輸出的就是一個字符,而且還經過char強轉
	}catch (IOException e) {
		// TODO: handle exception
	e.printStackTrace();
	}finally {
		if (is!=null) {
			try {
			is.close();
		}catch (IOException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
			}
		}
	}
}
	

3、總結:在使用轉換流時,只能針對操作文本文件的字節流進行轉換,如果字節流操作的是一張圖片,此時轉換爲字符流就會造成數據丟失。


作業一、 File類的常用方法的使用

1、在開發過程中涉及到文件有關的內容時,我們經常會使用到File類,該類中擁有一系列的方法,對於初學者來說很難弄清它們之間的區別,爲了讓大家熟悉File類中的常用方法,本案例將演示File類中的方法對文件進行操作來學習方法的使用。
2、設計思路(實現原理:直接調用API進行顯示)

  1. 在main()方法中使用File(String parent, String child)構造方法創建File文件對象
  2. 使用File類的方法對該文件進行各種操作,包括判斷文件是否存在,判斷是否是文件,獲取文件名稱,獲取文件大小,獲取最後修改時間等等。

二、案例實現

import java.io.*;
import java.sql.Date;
import java.text.DateFormat;

public class Exceptiondemo04 {
	public static void main(String[] args) throws IOException {
		File file = new File("w.txt");// 創建File文件對象,表示一個文件
		System.out.println("文件是否存在:" + (file.exists() ? "存在" : "不存在"));// 判斷文件是否存在
		if (!file.exists()) {// 如果文件不存在便創建該文件
//File類中的createNewFile()方法,當文件存在時不會創建,該方法返回值爲false,文件不存在時才創建,如果創建成功,該方法返回值爲true。
			boolean f = file.createNewFile();//
			System.out.println("文件是否創建成功:" + f);
		}
		//以上都不要也可以,換成下面的,就可直接查看現有的文件,而不必重新創建
	//public static void main(String []args){
		//File file=new File("C:\\Users\\Desktop\\A");//括號裏輸入文件的詳細路徑
		System.out.println("文件名稱:" + file.getName());// 獲取文件名
		System.out.println("文件的相對路徑:" + file.getPath());// 獲取文件的相對路徑
		System.out.println("文件的絕對路徑:" + file.getAbsolutePath());// 獲取文件的絕對路徑
		System.out.println("文件的父路徑:" + file.getParent());// 獲取文件的父路徑
		System.out.println(file.isDirectory() ? "是一個目錄" : "不是一個目錄");// 判斷是否是一個目錄
		System.out.println(file.isAbsolute() ? "是絕對路徑" : "不是絕對路徑");// 判斷是否是一個絕對路徑
		System.out.println(file.isHidden() ? "是隱藏文件" : "不是隱藏文件");// 判斷是否是一個隱藏文件
		System.out.println(file.isFile() ? "是一個文件" : "不是一個文件");// 判斷是否是一個文件
		System.out.println(file.canRead() ? "文件可讀" : "文件不可讀");// 判斷文件是否可讀
		System.out.println(file.canWrite() ? "文件可寫" : "文件不可寫");// 判斷文件是否可寫
		long time = file.lastModified();// 得到文件最後修改時間,並將毫秒數轉成日期
		Date d = new Date(time);//在這裏還使用了DateFormat類,將File類中的lastModified()方法返回的毫秒值轉換成了日期,顯示更直觀
		String date = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG).format(d);
		System.out.println("最後修改時間爲:" + date);//查看最後修改的時間
		System.out.println("文件大小爲:" + file.length() + " bytes");// 獲取文件的字節大小
	}
}

3、總結:
File類有三個常用構造方法,如下表所示:

方法聲明 功能描述
File(String pathname) 通過指定的一個字符串類型的文件路徑來創建一個新的File對象
File(String parent,String child) 根據指定的一個字符串類型的父路徑和一個字符串類型的子路徑(包括文件名稱)創建一個File對象
File(File parent,String child) 根據指定的File類的父路徑和字符串類型的子路徑(包括文件名稱)創建一個File對象

這三種常用構造方法創建File對象可以都使用,示例代碼如下:

    // 方式1: File(String pathname) 
	File file = new File("c:\\a.txt");
    // 方式2: File(String parent,String child)
    File file = new File("c:", "a.txt");
    // 方式3: File(File parent,String child) 
    File parentfile = new File("c:");
	File file = new File(parentfile, "a.txt");

作業二、 遞歸遍歷目錄及其子目錄下的文件

1、在一個目錄下,除了文件,常常還會有子目錄,如果想得到所有子目錄下的File類型對象,就需要遍歷整個目錄及其子目錄,在File類中提供了listFiles(),該方法返回一個File對象數組,由於元素中可能還有子目錄需要遍歷,因此需要使用遞歸。

2、設計思路(實現原理)

  1. 在main()方法中使用File(String pathname)構造方法創建File文件對象,給定待遍歷的目錄的路徑
  2. 編寫fileDir()方法,並在該方法中使用File類的listFiles()方法獲得目錄下所有文件的數組,遍歷數組,判斷如果是目錄,使用遞歸方式繼續遍歷,如果是文件則打印輸出該文件的絕對路徑
  3. 在main()方法中調用fileDir()方法,並傳入待遍歷的File對象

二、案例實現

1、獲取當前路徑下的文件及目錄,即只能查看一級目錄,而無法查看更深層的目錄

import java.io.File;
public class Exceptiondemo07 {
//	public static void main(String[] args) {
//		File file = new File("C:\\Users\\PW\\Desktop\\A");// 這樣只能刪除一個空目錄,如果文件夾裏面有內容則無法刪除
//		file.delete();
//	}
	public static void main(String[] args) {
		File file = new File("C:\\Users\\PW\\Desktop\\A");
		deleteFile(file);//調用deleteDir刪除方法進行刪除
	}
	public static void deleteFile(File dir) {
		File[]files=dir.listFiles();//得到File數組
		for(File f:files) {//遍歷所有的子目錄和文件
			if(f.isDirectory()){
				deleteFile(f); // 如果是目錄,遞歸調用deleteDir()
			}else {
				f.delete();//如果是文件,直接刪除
			}
		}
		dir.delete();// 刪除完一個目錄裏的所有文件後,就刪除這個目錄
	}
}

2、遍歷目錄及其子目錄下的文件

import java.io.*;

public class Exceptiondemo06 {
	public static void main(String[] args) {
		File dir = new File("C:\\Users\\HX\\Desktop\\A");// 注意,這裏必須要存在這個文件夾,否則會報錯。
		listFile(dir);
	}

	public static void listFile(File dir) {

		File[] files = dir.listFiles();// 得到一個文件數組,將一級目錄的所有文件進行展示。
		for (File f : files) {// 對文件進行遍歷
			if (f.isDirectory()) {// 這裏提供了一個方法,判斷是否爲一個目錄
				listFile(f);// 繼續調用方法,對文件夾裏的內容輸出。方法裏面調用本身,遞歸
			} else {// 如果不是目錄,則輸出文件的絕對路徑
				System.out.println(f.getAbsolutePath());
			}
			System.out.println(f.getAbsolutePath());
		}

	}
}

作業三、使用delete()方法刪除目錄

一、案例描述
1、在操作文件時,經常需要刪除一個目錄下的某個文件或者刪除整個目錄,這時可以使用File類提供的delete()方法進行刪除。
2、設計思路(實現原理)

  1. 在main()方法中使用File(String pathname)構造方法創建File文件對象,指定刪除的目錄的文件夾
  2. 使用File類的exists()方法判斷該文件是否存在,如果存在就使用delete()方法對其進行刪除操作

二、案例實現

import java.io.File;
public class Exceptiondemo07 {
//	public static void main(String[] args) {
//		File file = new File("C:\\Users\\PW\\Desktop\\A");// 這樣只能刪除一個空目錄,如果文件夾裏面有內容則無法刪除
//		file.delete();
//	}
	
	public static void main(String[] args) {
		File file = new File("C:\\Users\\PW\\Desktop\\A");
		deleteFile(file);//調用deleteDir刪除方法進行刪除
	}
	public static void deleteFile(File dir) {
		File[]files=dir.listFiles();//得到File數組
		for(File f:files) {//遍歷所有的子目錄和文件
			if(f.isDirectory()){
				deleteFile(f); // 如果是目錄,遞歸調用deleteDir()
			}else {
				f.delete();//如果是文件,直接刪除
			}
		}
		dir.delete();// 刪除完一個目錄裏的所有文件後,就刪除這個目錄
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章