(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());
}
}
}