叨逼叨兩句
- 明天又能夠告終一個事。
23-(01-08):遞歸練習
23-01:鍵盤獲取一個文件夾路徑,統計文件夾大小
- File的length()方法只能統計文件的大小,不能統計文件夾的大小。
package com.test.demo001;
import java.io.File;
import java.util.Scanner;
/**
* @author wangtao
*練習:從鍵盤接收一個文件夾路徑,統計該文件夾大小
*/
public class Demo010 {
public static void main(String[] args){
File file = getDir();
System.out.println(getFileLength(file));
}
/**
* @author wangtao
*1. 從鍵盤接收一個文件夾路徑
* 1. 建立鍵盤錄入對象
* 2. 定義一個無限循環
* 3. 將鍵盤錄入的結果存儲在字符串中,並封裝成File對象
* 4. 對File對象作判斷
* 5. 將文件夾路徑對象返回
*
*2. 統計該文件夾大小
* 1. 定義一個求和變量
* 2. 獲取該文件夾下全部的文件和文件夾listFiles();
* 3. 遍歷數組
* 4. 判斷是文件就計算大小並累加
* 5. 判斷是文件夾就遞歸調用
*
*/
public static File getDir(){
//1. 建立鍵盤錄入對象
Scanner sc = new Scanner(System.in);
//2. 定義一個無限循環
while(true){
System.out.println("請輸入文件夾路徑:");
String line = sc.nextLine();
//3. 將鍵盤錄入的結果存儲在字符串中,並封裝成File對象
File file = new File(line);
//4. 對File對象作判斷
if(!file.exists()){
System.out.println("該文件夾不存在,請從新輸入");
}else if(file.isFile()){
System.out.println("您輸入的是文件路徑,請輸入文件夾路徑");
}else{
//5. 將文件夾路徑對象返回
return file;
}
}
}
public static long getFileLength(File dir){
//1. 定義一個求和變量
long len = 0;
//2. 獲取該文件夾下全部的文件和文件夾listFiles();
File[] files = dir.listFiles();
//3. 遍歷數組
for(File file: files){
//4. 判斷是文件就計算大小並累加
if(file.isFile()){
len = len + file.length();
//5. 判斷是文件夾就遞歸調用
}else{
len = len + getFileLength(file);
}
}
return len;
}
}
23-02:從鍵盤接收一個文件夾路徑,刪除該文件夾
- File類的delete()方法不走回收站
package com.test.demo001;
import java.io.File;
import java.util.Scanner;
/**
* @author wangtao
* 1. 獲取該文件夾下的全部文件和文件夾
* 2. 遍歷數組
* 3. 判斷是文件直接刪除
* 4. 若是是文件夾,遞歸調用
* 5. 循環結束後,把空文件夾刪除
*/
public class Demo011 {
public static void main(String[] args) {
File dir = getDir();
deleteDir(dir);
}
public static void deleteDir(File dir){
//1. 獲取該文件夾下的全部文件和文件夾
File[] subFiles = dir.listFiles();
//2. 遍歷數組
for(File file: subFiles){
//3. 判斷是文件直接刪除
if(file.isFile()){
file.delete();
//4. 若是是文件夾,遞歸調用
}else{
deleteDir(file);
}
}
//5. 循環結束後,把空文件夾刪除
dir.delete();
}
public static File getDir(){
//1. 建立鍵盤錄入對象
Scanner sc = new Scanner(System.in);
//2. 定義一個無限循環
while(true){
System.out.println("請輸入文件夾路徑:");
String line = sc.nextLine();
//3. 將鍵盤錄入的結果存儲在字符串中,並封裝成File對象
File file = new File(line);
//4. 對File對象作判斷
if(!file.exists()){
System.out.println("該文件夾不存在,請從新輸入");
}else if(file.isFile()){
System.out.println("您輸入的是文件路徑,請輸入文件夾路徑");
}else{
//5. 將文件夾路徑對象返回
return file;
}
}
}
}
23-03:從鍵盤接收兩個文件夾路徑,把其中一個文件夾中(包含內容)拷貝到另外一個文件夾中
- 不能把源文件夾拷貝到源文件裏面
- windows系統刪除文件也是先遞歸到最裏層再刪除
package com.test.demo001;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
public class Demo012 {
public static void main(String[] args) throws IOException {
File src = getDir();
File dest = getDir();
copy(src,dest);
}
/**
* @author wangtao
* 1. 在目標文件夾中建立原文件夾
* 2. 獲取原文件夾中全部的文件和文件夾,存儲在File數組中
* 3. 遍歷數組
* 4. 若是是文件就用io流讀寫
* 5. 若是是文件夾就遞歸調用
*/
public static void copy(File src,File dest) throws IOException{
//1. 在目標文件夾中建立原文件夾
File newDir = new File(dest,src.getName());
newDir.mkdir();
//2. 獲取原文件夾中全部的文件和文件夾,存儲在File數組中
File[] subFiles = src.listFiles();
//3. 遍歷數組
for(File subFile : subFiles){
//4. 若是是文件就用io流讀寫
if(subFile.isFile()){
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(subFile));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(newDir,subFile.getName())));
int b;
while((b = bis.read())!= -1){
bos.write(b);
}
bis.close();
bos.close();
//5. 若是是文件夾就遞歸調用
}else{
copy(subFile,newDir);
}
}
}
public static File getDir(){
//1. 建立鍵盤錄入對象
Scanner sc = new Scanner(System.in);
//2. 定義一個無限循環
while(true){
System.out.println("請輸入文件夾路徑:");
String line = sc.nextLine();
//3. 將鍵盤錄入的結果存儲在字符串中,並封裝成File對象
File file = new File(line);
//4. 對File對象作判斷
if(!file.exists()){
System.out.println("該文件夾不存在,請從新輸入");
}else if(file.isFile()){
System.out.println("您輸入的是文件路徑,請輸入文件夾路徑");
}else{
//5. 將文件夾路徑對象返回
return file;
}
}
}
}