叨逼叨两句
- 明天又能够告终一个事。
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;
}
}
}
}