今日內容介紹 1、File 2、遞歸 xmind:下載地址: 鏈接: "https://pan.baidu.com/s/1Eaj9yP5i0x4PiJsZA4StQg" 密碼:845a 01IO技術概述 A:IO技術概述 a: Output 把記憶體中的數據存儲到持久化設備上這個動作稱為輸出(寫)Ou ...
今日內容介紹
1、File
2、遞歸
xmind:下載地址:
鏈接:https://pan.baidu.com/s/1Eaj9yP5i0x4PiJsZA4StQg 密碼:845a
01IO技術概述
* A:IO技術概述
* a: Output
* 把記憶體中的數據存儲到持久化設備上這個動作稱為輸出(寫)Output操作
* b: Input
* 把持久設備上的數據讀取到記憶體中的這個動作稱為輸入(讀)Input操作
* c: IO操作
* 把上面的這種輸入和輸出動作稱為IO操作
02File類的概述和作用
* A:File類的概述和作用
* a: File的概念
* File類是文件和目錄路徑名的抽象表示形式
* Java中把文件或者目錄(文件夾)都封裝成File對象
* 我們要去操作硬碟上的文件,或者文件夾只要找到File這個類即可
03File類靜態的成員變數
* A:File類靜態的成員變數
* a: pathSeparator
* 與系統有關的路徑分隔符,為了方便,它被表示為一個字元串
* b: separator
* 與系統有關的預設名稱分隔符,為了方便,它被表示為一個字元串
* c: 案例代碼
/*
* java.io.File
* 將操作系統中的,文件,目錄(文件夾),路徑,封裝成File對象
* 提供方法,操作系統中的內容
* File與系統無關的類
* 文件 file
* 目錄 directory
* 路徑 path
*/
public class FileDemo {
public static void main(String[] args) {
//File類靜態成員變數
//與系統有關的路徑分隔符
String separator = File.pathSeparator;
System.out.println(separator);// 是一個分號,目錄的分割
(window中環境變數配置各個路徑用分號分割,表示一個完整的路徑結束) Linux中是冒號 :
//與系統有關的預設名稱分隔符
separator = File.separator;
System.out.println(separator);// 向右 \ 目錄名稱分割 Linux /
}
}
04File類構造方法_1
* A: File類構造方法_1
* a: File(String pathname)
* 通過將給定路徑名字元串轉換為一個File對象,之後可以使用File中的方法
* windows中的路徑或文件名不區分大小寫
* d: 案例代碼
public class FileDemo1 {
public static void main(String[] args) {
function();
}
/*
* File(String pathname)
* 傳遞路徑名: 可以寫到文件夾,可以寫到一個文件
* c:\\abc c:\\abc\\Demo.java
* 將路徑封裝File類型對象
*/
public static void function(){
File file = new File("d:\\eclipse");
System.out.println(file);
}
}
05相對路徑和絕對路徑
* A: 相對路徑和絕對路徑
* a: 絕對路徑
* 絕對路徑是一個固定的路徑,從盤符開始
* b: 相對路徑
* 相對路徑相對於某個位置,在eclipse下是指當前項目下
* c: 路徑
絕對路徑
在系統中具有唯一性
c:\\windows\\system32
相對路徑
表示路徑之間的關係
D:\\develop\\Java\\jdk1.7.0_72\\bin
D:\\develop\\Java\\jre7
路徑之間關係
Java 父目錄是D:\\develop
Java 子目錄是:jdk1.7.0_72
父路徑是 唯一性
子目錄是可以多個
06File類的構造方法_2
* A: File類的構造方法_2
* a:File(String parent, String child)
* 根據 parent 路徑名字元串和 child 路徑名字元串創建一個新 File 對象
* b: File(File parent, String child)
* c: 案例代碼
public class FileDemo1 {
public static void main(String[] args) {
function_2();
}
/*
* File(File parent,String child)
* 傳遞路徑,傳遞File類型父路徑,字元串子路徑
* 好處: 父路徑是File類型,父路徑可以直接調用File類方法
*/
public static void function_2(){
File parent = new File("d:");
File file = new File(parent,"eclipse");
System.out.println(file);
}
/*
* File(String parent,String child)
* 傳遞路徑,傳遞字元串父路徑,字元串子路徑
* 好處: 單獨操作父路徑和子路徑
*/
public static void function_1(){
File file = new File("d:","eclipse");
System.out.println(file);
}
}
07File類創建文件功能
* A: File類創建文件功能
* a: public boolean createNewFile()
* 創建文件 如果存在這樣的文件,就不創建了
* b: 案例代碼
public class FileDemo2 {
public static void main(String[] args)throws IOException {
function();
}
/*
* File創建文件的功能
* boolean createNewFile()
* 創建的文件路徑和文件名,在File構造方法中給出
* 文件已經存在了,不在創建
*/
public static void function()throws IOException{
File file = new File("c:\\a.txt");
boolean b = file.createNewFile();
System.out.println(b);
}
}
08File類創建目錄功能
* A: File類創建目錄功能
* a: 創建目錄
* public boolean mkdir():創建文件夾 如果存在這樣的文件夾,就不創建了
* public boolean mkdirs():創建文件夾,如果父文件夾不存在,會幫你創建出來
* b: 案例代碼
public class FileDemo2 {
public static void main(String[] args)throws IOException {
function_1();
}
/*
* File創建文件夾功能
* boolean mkdirs() 創建多層文件夾
* 創建的路徑也在File構造方法中給出
* 文件夾已經存在了,不在創建
*/
public static void function_1(){
File file = new File("c:\\abc");
boolean b = file.mkdirs();
System.out.println(b);
}
}
09File類刪除功能
* A: File類刪除功能
* a: 刪除功能
* public boolean delete():刪除文件或者文件夾
* B: 案例代碼
public class FileDemo2 {
public static void main(String[] args)throws IOException {
function_2();
}
/*
* File類的刪除功能
* boolean delete()
* 刪除的文件或者是文件夾,在File構造方法中給出
* 刪除成功返回true,刪除失敗返回false
* 刪除方法,不走回收站,直接從硬碟中刪除
* 刪除有風險,運行需謹慎
*/
public static void function_2(){
File file = new File("c:\\a.txt");
boolean b = file.delete();
System.out.println(b);
}
}
10File類獲取功能
* A:File類獲取功能
* a: 方法介紹
* String getName(): 返迴路徑中表示的文件或者文件夾名
* 獲取路徑中的最後部分的名字
* long length(): 返迴路徑中表示的文件的位元組數
* String getAbsolutePath(): 獲取絕對路徑,返回String對象
* File getAbsoluteFile() : 獲取絕對路徑,返回File對象
* eclipse環境中,寫一個相對路徑,絕對位置工程根目錄
* String getParent(): 獲取父路徑,返回String對象
* File getParentFile(): 獲取父路徑,返回File對象
* b: 案例代碼
public class FileDemo3 {
public static void main(String[] args) {
function_3();
}
/*
* File類的獲取功能
* String getParent() 返回String對象
* File getParentFile()返回File對象
* 獲取父路徑
*/
public static void function_3(){
File file = new File("d:\\eclipse\\eclipse.exe");
File parent = file.getParentFile();
System.out.println(parent);
}
/*
* File類獲取功能
* String getAbsolutePath() 返回String對象
* File getAbsoluteFile() 返回File對象
* 獲取絕對路徑
* eclipse環境中,寫的是一個相對路徑,絕對位置工程根目錄
*/
public static void function_2(){
File file = new File("src");
File absolute = file.getAbsoluteFile();
System.out.println(absolute);
}
/*
* File類獲取功能
* long length()
* 返迴路徑中表示的文件的位元組數
*/
public static void function_1(){
File file = new File("d:\\eclipse\\eclipse.exe");
long length = file.length();
System.out.println(length);
}
/*
* File類的獲取功能
* String getName()
* 返迴路徑中表示的文件或者文件夾名
* 獲取路徑中的最後部分的名字
*/
public static void function(){
File file = new File("d:\\eclipse\\eclipse.exe");
String name = file.getName();
System.out.println(name);
/*String path = file.getPath();
System.out.println(path);*/
// System.out.println(file);
}
}
11File類判斷功能
* A: File類判斷功能
* a: 方法介紹
* boolean exists(): 判斷File構造方法中封裝路徑是否存在
* 存在返回true,不存在返回false
* boolean isDirectory(): 判斷File構造方法中封裝的路徑是不是文件夾
* 如果是文件夾,返回true,不是文件返回false
* boolean isFile(): 判斷File構造方法中封裝的路徑是不是文件
* 如果是文件,返回true,不是文件返回false
* b: 案例代碼
public class FileDemo4 {
public static void main(String[] args) {
function_1();
}
/*
* File判斷功能
* boolean isDirectory()
* 判斷File構造方法中封裝的路徑是不是文件夾
* 如果是文件夾,返回true,不是文件返回false
*
* boolean isFile()
* 判斷File構造方法中封裝的路徑是不是文件
*/
public static void function_1(){
File file = new File("d:\\eclipse\\eclipse.exe");
if(file.exists()){
boolean b = file.isDirectory();
System.out.println(b);
}
}
/*
* File判斷功能
* boolean exists()
* 判斷File構造方法中封裝路徑是否存在
* 存在返回true,不存在返回false
*/
public static void function(){
File file = new File("src");
boolean b = file.exists();
System.out.println(b);
}
}
12File類list獲取功能
* A: File類list獲取功能
* a: 方法介紹
* String[] list():獲取到File構造方法中封裝的路徑中的文件和文件夾名 (遍歷一個目錄)
* 返回只有名字
* File[] listFiles():獲取到,File構造方法中封裝的路徑中的文件和文件夾名 (遍歷一個目錄)
* 返回的是目錄或者文件的全路徑
* static File[] listRoots(): 列出可用的文件系統根
* b: 案例代碼
public class FileDemo {
public static void main(String[] args) {
function_2();
}
public static void function_2(){
//獲取系統中的所有根目錄
File[] fileArr = File.listRoots();
for(File f : fileArr){
System.out.println(f);
}
}
/*
* File類的獲取功能
* File[] listFiles()
* 獲取到,File構造方法中封裝的路徑中的文件和文件夾名 (遍歷一個目錄)
* 返回的是目錄或者文件的全路徑
*/
public static void function_1(){
File file = new File("d:\\eclipse");
File[] fileArr = file.listFiles();
for(File f : fileArr){
System.out.println(f);
}
}
/*
* File類的獲取功能
* String[] list()
* 獲取到,File構造方法中封裝的路徑中的文件和文件夾名 (遍歷一個目錄)
* 返回只有名字
*/
public static void function(){
File file = new File("c:");
String[] strArr = file.list();
System.out.println(strArr.length);
for(String str : strArr){
System.out.println(str);
}
}
}
13文件過濾器
* A: 文件過濾器
* a: 作用
* 過濾一個目錄下的指定擴展名的文件,或者包含某些關鍵字的文件夾
* b: 方法介紹
* public String[] list(FilenameFilter filter)
* public File[] listFiles(FileFilter filter)
* C: 案例代碼
/*
* 自定義過濾器
* 實現FileFilter介面,重寫抽象方法
*/
public class MyFilter implements FileFilter{
public boolean accept(File pathname) {
/*
* pathname 接受到的也是文件的全路徑
* c:\\demo\\1.txt
* 對路徑進行判斷,如果是java文件,返回true,不是java文件,返回false
* 文件的尾碼結尾是.java
*/
//String name = pathname.getName();
return pathname.getName().endsWith(".java");
}
}
/*
* File類的獲取,文件獲取過濾器
* 遍歷目錄的時候,可以根據需要,只獲取滿足條件的文件
* 遍歷目錄方法 listFiles()重載形式
* listFiles(FileFilter filter)介面類型
* 傳遞FileFilter介面的實現類
* 自定義FileFilter介面實現類,重寫抽象方法,
* 介面實現類對象傳遞到遍歷方法listFiles
*/
public class FileDemo1 {
public static void main(String[] args) {
File file = new File("c:\\demo");
File[] fileArr = file.listFiles(new MyFilter());
for(File f : fileArr){
System.out.println(f);
}
}
}
14文件過濾器_原理分析
* A:文件過濾器_原理分析
* listFiles()遍歷目錄的同時,獲取到了文件名全路徑,調用過濾器的方法accept,
* 將獲取到的路徑傳遞給accept方法的參數pathname
* accept方法接收了參數pathname,參數是listFiles傳遞來的
* 在accept方法中,進行判斷,如果這個路徑是Java文件,返回true,走著返回false
* 一旦方法返回了true
* listFiles將路徑保存到File數組中
15遞歸遍歷全目錄
* A: 遞歸遍歷全目錄
* a: 案例代碼
/*
* 對一個目錄的下的所有內容,進行完全的遍歷
* 編程技巧,方法的遞歸調用,自己調用自己
*/
public class FileDemo {
public static void main(String[] args) {
File dir = new File("d:\\eclipse");
getAllDir(dir);
}
/*
* 定義方法,實現目錄的全遍歷
*/
public static void getAllDir(File dir){
System.out.println(dir);
//調用方法listFiles()對目錄,dir進行遍歷
File[] fileArr = dir.listFiles();
for(File f : fileArr){
//判斷變數f表示的路徑是不是文件夾
if(f.isDirectory()){
//是一個目錄,就要去遍歷這個目錄
//本方法,getAllDir,就是給個目錄去遍歷
//繼續調用getAllDir,傳遞他目錄
getAllDir(f);
}else{
System.out.println(f);
}
}
}
}
16遞歸概念和註意事項
* A:遞歸概念和註意事項
* a: 遞歸概念
* 遞歸,指在當前方法內調用自己的這種現象
* 遞歸分為兩種,直接遞歸和間接遞歸
* 直接遞歸稱為方法自身調用自己。間接遞歸可以A方法調用B方法,B方法調用C方法,C方法調用A方法
* b: 註意事項
* 遞歸一定要有出口, 必須可以讓程式停下
* 遞歸次數不能過多
* 構造方法,禁止遞歸
17遞歸求和計算
* A: 遞歸求和計算
* a: 題目分析
* 1+2+3+...+(n-1)+n:求1到n的和
* 總結規律:1到n的和等於1到(n-1)的和再加n
* getSum(n-1)+ n
* 遞歸出口:getSum(1) return 1;
* b: 案例代碼
/*
* 方法的遞歸調用
* 方法自己調用自己
* 適合於,方法中運算的主體不變,但是運行的時候,參與運行的方法參數會變化
* 註意:
* 遞歸一定要有出口, 必須可以讓程式停下
* 遞歸次數不能過多
* 構造方法,禁止遞歸
*/
public class DiGuiDemo {
public static void main(String[] args) {
int sum = getSum(3);
System.out.println(sum);
}
/*
* 計算 1+2+3+100和 = 5050
* 計算規律:
* n+(n-1)+(n-2)
* 100+(100-1)+(99-1)+...1
*/
public static int getSum(int n){
if( n == 1)
return 1;
return n + getSum(n-1);
}
}
18遞歸求階乘
* A: 遞歸求和計算
* a: 題目分析
* 5!=5*4*3*2*1
* =5*4!
* 4!=4*3!
* 3!=3*2!
* 2!=2*1!
* 1!=1
* n!=n*(n-1)!
* 遞歸出口:n*getJieCheng(n-1): getJieCheng(1) return 1;
* b: 案例代碼
/*
* 方法的遞歸調用
* 方法自己調用自己
* 適合於,方法中運算的主體不變,但是運行的時候,參與運行的方法參數會變化
* 註意:
* 遞歸一定要有出口, 必須可以讓程式停下
* 遞歸次數不能過多
* 構造方法,禁止遞歸
*/
public class DiGuiDemo {
public static void main(String[] args) {
System.out.println(getJieCheng(5));
}
/*
* 計算階乘 5!
* 5*4*3*2*1
*/
public static int getJieCheng(int n){
if ( n == 1)
return 1;
return n * getJieCheng(n-1);
}
}
19遞歸計算斐波那契數列
* A: 遞歸計算斐波那契數列
* a:題目分析
* 1 1 2 3 5 8 13 21
* 從第三項開始,後面的每一項都等於前面兩項的和,第一項和第二項的值為1,作為程式的出口
* b: 案例代碼
/*
* 方法的遞歸調用
* 方法自己調用自己
* 適合於,方法中運算的主體不變,但是運行的時候,參與運行的方法參數會變化
* 註意:
* 遞歸一定要有出口, 必須可以讓程式停下
* 遞歸次數不能過多
* 構造方法,禁止遞歸
*/
public class DiGuiDemo {
public static void main(String[] args) {
System.out.println(getFBNQ(12));
}
/*
* 方法遞歸,計算斐波那契數列
*
*/
public static int getFBNQ(int month){
if( month == 1)
return 1;
if( month == 2)
return 1;
return getFBNQ(month-1)+getFBNQ(month-2);
}
}
20遍歷目錄下的所有java文件
* A: 遍歷目錄下的所有java文件
* a: 案例代碼
public class MyJavaFilter implements FileFilter {
public boolean accept(File pathname) {
//判斷獲取的是目錄,直接返回true
if(pathname.isDirectory())
return true;
return pathname.getName().toLowerCase().endsWith(".java");
}
}
/*
* 遍歷目錄,獲取目錄下的所有.java文件
* 遍歷多級目錄,方法遞歸實現
* 遍歷的過程中,使用過濾器
*/
public class FileDemo1 {
public static void main(String[] args) {
getAllJava(new File("c:\\demo"));
// new File("c:\\demo").delete();
}
/*
* 定義方法,實現遍歷指定目錄
* 獲取目錄中所有的.java文件
*/
public static void getAllJava(File dir){
//調用File對象方法listFiles()獲取,加入過濾器
File[] fileArr = dir.listFiles(new MyJavaFilter());
for(File f : fileArr){
//對f路徑,判斷是不是文件夾
if(f.isDirectory()){
//遞歸進入文件夾遍歷
getAllJava(f);
}else{
System.out.println(f);
}
}
}
作業測試
1.使用文件名稱過濾器篩選將指定文件夾下的小於200K的小文件獲取並列印。
2.從鍵盤接收一個文件夾路徑,統計該文件夾大小。
3.從鍵盤接收一個文件夾路徑,刪除該文件夾。
4.從鍵盤接收一個文件夾路徑,把文件夾中的所有文件以及文件夾的名字按層級列印
例如:
aaa是文件夾,裡面有bbb.txt,ccc.txt,ddd.txt這些文件,有eee這樣的文件夾,eee中有fff.txt和ggg.txt,列印出層級來
aaa
bbb.txt
ccc.txt
ddd.txt
eee
fff.txt
ggg.txt
5.鍵盤錄入一個文件夾路徑,統計該文件夾(包含子文件夾)中每種類型的文件及個數,註意:用文件類型(尾碼名,不包含.(點),如:"java","txt")作為key,
用個數作為value,放入到map集合中,並用兩種方式遍歷map集合
例如:
doc 的類型的文件有 3 個
java 的類型的文件有 5 個
txt 的類型的文件有 7 個
如果想進一步的交流,可以加入我們的QQ群,裡面有最新的學習資料,可以學習。