java基礎20

1:遞歸(理解)
(1)方法定義中調用方法本身的現象。
(2)遞歸注意事項:
A:要有出口,否則就是死遞歸。
B:次數不能太多,否則內存溢出。

特殊事項:構造方法不能遞歸定義。
(3)案例:(面試可能見到)
A:遞歸求階乘
		public static int fn(int n){
			if(n=1){
				return 1;
			}else{
				return n*fn(n-1);
			}
		}
		B:遞歸求兔子問題
		public static int fn(int n){
			if(n=1||n=2){
				return 1;
			}else{
				return fn(n-1)+fn(n-2);
			}
		}
		C:遞歸遍歷目錄(帶內容的目錄)
		public static void getAllFile(File srcFile,String str){
			File[] arrayFile=srcFile.listFile();
			for(File file:arrayFile){
				if(file.isDirectory()){
					getAllFile(File srcFile,String str)
				}else{
					if(file.getName().endsWith(str)){
						System.out.println(file.getAbsolutePath());
					}
				}
			}
		}
		D:遞歸刪除目錄(帶內容的目錄)
		public static void deleteAllFile(File srcFile){
			File[] arrayFile=srcFile.listFile();
			for(File file:arrayFile){
				if(file.isDirectory()){
					getAllFile(file);
				}else{
					file.delete();
				}
			}
			arrayFile.delete();
		}


2:IO(掌握)
(1)IO就是在不同設備間傳遞數據。
(2)IO流分類:
A:流向
輸入流 讀取數據
輸出流 寫出數據
B:數據類型
字節流
字節輸入流 InputStream
字節輸出流 OutputStream
字符流
字符輸入流 Reader
字符輸出流 Writer


注意:
A:四個頂層類都是抽象類。
B:一般每個體系的流都是以基類作爲後綴名。
什麼時候使用誰?
如果文件能夠通過記事本打開並讀懂,就用字符流。
其他的全部使用字節流。
(3)FileWriter寫入數據
操作步驟:
A:創建字符輸出流對象
B:調用對象的write()方法
C:釋放資源


代碼體現:
FileWriter fw = new FileWriter("fw.txt");


fw.write("hello,IO");
fw.flush();


fw.close();


幾個小問題?
A:創建字符輸出流對象做了那幾件事情?
第一次時或通過系統管理創建文件,從第二次時就會根據構造方法的參數true還是false,對內容追加還是重寫
創建了流對象
把流對象指向文件
B:爲什麼要flush()?
因爲字符是兩個字節,它寫入都是緩衝在流對象裏,flush()是刷新流對象
C:爲什麼要close()?
告訴程序,該流對象已成垃圾
釋放程序資源
D:flush()和close()的區別?
flush()是刷新流對象,刷新之後該流對象還可以繼續使用
close()是先刷新該流對象,然後關閉流對象,關閉之後,不可以在繼續使用。
E:怎麼實現換行?
Windows系統中的換行符是:\r\n 
F:怎麼實現追加寫入?
在構造方法中,boolean值,true代表追加,false代表重寫內容
G:文件不存在,會創建一個。文件如果存在,到底是重新創建,還是把內容給清空?
(4)FileReader讀取數據
操作步驟:
A:創建字符輸入流對象
B:調用對象的read()方法
C:釋放資源


代碼體現:
FileReader fr = new FileReader("fw.txt");


//方式1
//一次讀取一個字符
int ch = 0;
while((ch=fr.read())!=-1) {
System.out.print((char)ch);
}




//方式2
//一次讀取一個字符數組
char[] chs = new char[1024];
int len = 0;
while((len=fr.read(chs))!=-1) {
System.out.print(String.valueOf(chs,0,len));
}


fr.close();
(5)複製文本文件
數據源:
看用那種類型的流,讀取數據。
目的地:
看用那種類型的流,寫出數據。


案例:
	把當前項目路徑下的Demo.txt複製到d盤目錄下的Copy.txt中。
		代碼體現:
			方式1:
				FileReader fr = new FileReader("Demo.txt");
				FileWriter fw = new FileWriter("d:\\Copy.txt");
				int ch = 0;
				while((ch=fr.read())!=-1) {
					fw.write(ch);
				}
				fw.close();
				fr.close();
			方式2:
				FileReader fr = new FileReader("Demo.txt");
				FileWriter fw = new FileWriter("d:\\Copy.txt");
				char[] chs = new char[1024];
				int len = 0;
				while((len=fr.read(chs))!=-1) {
					fw.write(chs,0,len);
				}
				fw.close();
				fr.close();

案例:

package cn.itcast.test;

import java.io.File;

/*
 * 需求:把指定目錄下所有文件的名稱按照某種規則改名。
 * 
 * 分析:
 * 		A:封裝目錄
 * 		B:獲取指定目錄下所有File數組。
 * 		C:遍歷File數組。獲取到每一個File對象。
 * 		D:對每一個File對象改名。
 * 			舊名稱:d:\\笑傲江湖\\[helloworld-java-android]笑傲江湖吐槽1.f4v
 * 			新名稱:d:\\笑傲江湖\\笑傲江湖吐槽1.f4v
 */
public class ChangeName {
	public static void main(String[] args) {
		// A:封裝目錄
		File srcFile = new File("d:\\笑傲江湖");

		// 獲取指定目錄下所有File數組。
		File[] fileArray = srcFile.listFiles();

		// 遍歷File數組。獲取到每一個File對象。
		for (File file : fileArray) {
			// 對每一個File對象改名。
			String oldName = file.getName();
			int index = oldName.indexOf(']');
			String newName = oldName.substring(index + 1);
			File newFile = new File(srcFile, newName);
			file.renameTo(newFile);
		}
	}
}

package cn.itcast_01;

import java.io.File;
import java.io.FilenameFilter;

/*
 * public File[] listFiles(FilenameFilter filter):根據過濾器獲取指定目錄下所有File數組。
 * public String[] list(FilenameFilter filter):根據過濾器獲取指定目錄下所有名稱數組。
 */
public class JavaFileDemo2 {
	public static void main(String[] args) {
		// 封裝目錄
		File srcFile = new File("d:\\");

		// File[] fileArray = srcFile.listFiles(new MyFilenameFilter());
		// for (File file : fileArray) {
		// System.out.println(file.getName());
		// }

		String[] strArray = srcFile.list(new FilenameFilter() {
			@Override
			public boolean accept(File dir, String name) {
				return new File(dir, name).isFile() && name.endsWith(".java");
			}
		});
		for (String str : strArray) {
			System.out.println(str);
		}
	}
}

package cn.itcast_03;

import java.io.File;

/*
 * 需求:刪除d盤跟目錄下的day02文件夾。
 * 
 * 分析:
 * 		A:封裝目錄
 * 		B:獲取指定目錄下所有File數組
 * 		C:遍歷File數組,獲取到每一個File
 * 		D:判斷該File是否是文件夾:
 * 			是:就遞歸。返回B。
 * 			否:就刪除。
 */
public class DeleteFileDemo {
	public static void main(String[] args) {
		// A:封裝目錄
		// File srcFile = new File("d:\\day02");
		File srcFile = new File("d:\\test");

		// 定義刪除功能
		deleteFile(srcFile);
	}

	public static void deleteFile(File srcFile) {
		// 獲取指定目錄下所有File數組
		File[] fileArray = srcFile.listFiles();

		// 爲了確保除非是系統自帶的一些文件,其他的文件都可以刪除。
		if (fileArray != null) {
			// 遍歷File數組,獲取到每一個File
			for (File file : fileArray) {
				if (file.isDirectory()) {
					deleteFile(file);
				} else {
					System.out.println(file.getName() + "---" + file.delete());
				}
			}

			// for循環刪除的是文件
			System.out.println(srcFile.getName() + "---" + srcFile.delete());
		}
	}
}


發佈了42 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章