Java26File类:new File(),递归
Posted 码农编程录
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java26File类:new File(),递归相关的知识,希望对你有一定的参考价值。
1.File类三个构造方法和获取方法:\\
package com.itheima01.constructor;
import java.io.File;
/*
File : 既表示文件,又表示文件夹
1. File(String pathname):通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
2. File(File parent, String child):根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
3. File(String parent, String child):根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
路径分隔符:
1. windows : \\
2. Unix : / 正斜杠在java中, 用 / 或 \\\\ 都可以
*
* 正则表达式 : 用简短的符号来表示复杂的意思
* \\t : 表示制表符 tab
* \\r\\n : 表示回车换行
* \\\\ : 表示一个\\
*/
public class Demo01 {
public static void main(String[] args) {
// new File("C:\\\\test\\\\a.txt");
File file = new File("C:/test/a.txt"); //直接指定一个完整路径
System.out.println(file);
File file2 = new File("C:/test", "a"); //a表示文件夹 //指定一个父路径+名字
System.out.println(file2);
//如下同上
File fu = new File("C:/test");
File file3 = new File(fu, "a");
System.out.println(file3);
}
}
package com.itheima02.method;
import java.io.File;
/*
获取方法
1. String getAbsolutePath() :返回此File的绝对路径名字符串。
2. String getPath() :将此File转换为路径名字符串。(构造时使用的路径)
3. String getName() :返回由此File表示的文件或目录的名称。(路径最后一级名称)
4. long length() :返回由此File表示的文件的长度。(文件夹的大小无法获取)
路径:
1. 绝对路径 : 带盘符的路径
2. 相对路径 : 相对而言的路径(java工程中,相对当前工程而言)
*/
public class GetDemo {
public static void main(String[] args) {
File file1 = new File("E:\\\\mywork\\\\IdeaProjects\\\\class897\\\\day11\\\\a.txt");
File file2 = new File("a.txt"); //在当前项目里找
String absPath1 = file1.getAbsolutePath();
String absPath2 = file2.getAbsolutePath();
System.out.println(absPath1); //E:\\mywork\\IdeaProjects\\class897\\day11\\a.txt
System.out.println(absPath2); //打印同上行,没有包路径如com..
String path1 = file1.getPath();
String path2 = file2.getPath();
System.out.println(path1); //E:\\mywork\\IdeaProjects\\class897\\day11\\a.txt
System.out.println(path2); //a.txt
String name = file1.getName();
String name2 = file2.getName();
System.out.println(name); //a.txt
System.out.println(name2); //a.txt
long length = file1.length();
System.out.println(length); //3 byte,因为a.txt里有abc三个字母
File src = new File("src");
System.out.println(src.length()); //0,不能获取文件夹大小
}
}
如下是项目路径
2.File的判断/创建/删除/列举方法:listFiles
package com.itheima02.method;
import java.io.File;
/*
判断方法
1. public boolean exists() :此File表示的文件或目录是否实际存在。
2. public boolean isDirectory() :此File表示的是否为目录。
3. public boolean isFile() :此File表示的是否为文件。
*/
public class BooleanDemo {
public static void main(String[] args) {
File f1 = new File("src"); //目录
File f2 = new File("a.txt");
File f3 = new File("xxx");
System.out.println(f1.exists());//true //因为在day11模块下找
System.out.println(f2.exists());//true
System.out.println(f3.exists());//false
System.out.println("-------------------");
System.out.println(f1.isDirectory());//true
System.out.println(f2.isDirectory());//false
System.out.println(f3.isDirectory());//false
System.out.println("---------------");
System.out.println(f1.isFile()); // false
System.out.println(f2.isFile());// true
System.out.println(f3.isFile());//false
}
}
package com.itheima02.method;
import java.io.File;
import java.io.IOException;
/*
* 1. public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
* 1. 如果文件不存在,则创建,返回true
* 2. 如果文件存在,不创建,返回false
* 3. 如果文件父路径不存在,则抛出IOException
2. public boolean mkdir() :创建由此File表示的目录。 (make directory)
1. 如果父路径不存在, 不会创建
2. 如果目录已存在,也不会创建,都返回false
3. public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。(多级)
*/
public class CreateDemo {
public static void main(String[] args) throws IOException {
// create();
File dir = new File("ccc"); //单级路径也算多级路径中一种
boolean result = dir.mkdirs();
System.out.println(result); //true
}
private static void create() throws IOException {
File file = new File("dir/xxx");
boolean result = file.createNewFile();
System.out.println(result); //false,dir不存在
}
}
package com.itheima02.method;
import java.io.File;
/*
* public boolean delete() :删除由此File表示的文件或目录。
* 1. 此方法不走回收站, 慎用
* 2. delete可以删除 空文件夹和文件
* 3. 删不了非空文件夹,返回false。一个文件被其他程序所占用,其他程序无法删除,win下word一直用原文件,绘图软件是复制一份。所以word在使用修改时原文件删不了,绘图可以删除原文件
*/
public class DeleteDemo {
public static void main(String[] args) {
File file = new File("c:/test/b");
boolean result = file.delete();
System.out.println(result);
}
}
package com.itheima02.method;
import java.io.File;
/*
目录的遍历
1. public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
1. 此方法只能用在文件夹上
2. 列出当前文件夹的所有子文件and子文件夹
2. public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录
*/
public class ListDemo {
public static void main(String[] args) {
File file = new File("c:/test/filedoc"); // 需求: 打印目录 C:\\test\\filedoc 下的所有文件(单级)
/* String[] list = file.list();
for (String name : list) {
System.out.println(name);
}*/
//如下(列出对象)等同于上面(列出名字)
File[] files = file.listFiles();
for (File sonFile : files) {
System.out.println(sonFile.getAbsolutePath());
}
}
}
3.案例:listFiles,isFile,.delete()
package com.itheima03.recursion;
import java.io.File;
/*
* 需求: 删除非空文件夹 filedoc
* 前提: delete方法不能直接删除非空文件夹
* 解决: 1. 列出文件夹下的所有子路径(子文件和子文件夹)
* 2. 进行遍历
* 3. 判断每个子路径 是文件还是文件夹
* 3.1. 如果是文件,直接删
* 3.2 如果是文件夹
* 1. 接着列出此文件夹的所有子路径
* 2. 进行遍历
* 3. 判断每个子路径 是文件还是文件夹
* 3.1 如果是文件,直接删
* 3.2 如果是文件夹...
* ....
* 有一段逻辑不断重复,重复的次数不知道, 但是结束条件: 删除到最后一级文件夹的子文件全都删掉
*/
public class DeleteDemo {
public static void main(String[] args) {
File dir = new File("c:/test/filedoc");
// file.delete(); //无用,删不了非空文件夹
deleteDir(dir);
}
private static void deleteDir(File dir) {
File[] files = dir.listFiles();
for (File sonFile : files) {
if(sonFile.isFile()){//是文件
sonFile.delete();
}else{//是文件夹
deleteDir(sonFile);
}
}
//如上是把子文件夹删了
dir.delete(); //自己变成空文件夹,就可以删掉
}
}
package com.itheima03.recursion;
/*
* 5! = 5 * 4 * 3 * 2 * 1 = 120
* 递归计算阶乘:
* 0.表现形式: 方法不断调用自己
* 1. 每个步骤规律相同
* 2. 一定要有结束条件
* 5! = 5 * 4 * 3 * 2 * 1
* = 5 * 4!
* = 4 * 3!
* = 3 * 2!
* = 2 * 1!
* = 1
* 归纳:
* 当 n>1
* n!= n * (n-1)!
* 当 n=1 , n! = 1
*/
public class JieChengDemo {
public static void main(String[] args) {
// method01();
int result = getResult(10);
System.out.println(result);
}
//111111111111111111111111111111111111111111111111111111111111
private static int getResult(int n) { //计算n的阶乘
if(n == 1){
return 1;
}else{
int result = n * getResult(n-1);
return result;
}
}
private static void method01() {
int n = 5;
int result = 1;
for (int i = n; i >= 1; i--) {
result *= i;
}
System.out.println(result);
}
}
堆内存溢出:out of memory
package com.itheima03.recursion;
import java.io.File;
/*
* 案例 : 计算非空文件夹的大小。length() : 计算文件的大小
* 思路: 1. 列出此文件夹的所有子路径
* 2. 遍历每个子路径
* 3. 判断是文件还是文件夹
* 3.1 是文件, 加总其大小
* 3.2 是文件夹, 递归
* 隐含结束条件: 文件夹不可能无限创建的
*/
public class CalcDemo {
static int sum = 0;
public static void main(String[] args) {
File dir = new File("c:/test/filedoc");
calc(dir);
System.out.println(sum);
}
private static void calc(File dir) {
File[] files = dir.listFiles();
for (File sonFile : files) {
if(sonFile.isFile()){ // 子文件
sum += sonFile.length();
}else{ //文件夹
calc(sonFile);
}
}
}
}
不死神兔:上个月都不死。1是一对。||是或。n是n个月。前不死,第3都生1。
package com.itheima03.recursion;
/*
* 斐波那契数列 : 有一对兔子,从第三个月开始生一对小兔子,之后每个月都生一对小兔子,其他兔子具备相同特点.
* 而且兔子永远不死,问第20个月,兔子有几对?
*/
public class RabbitDemo {
public static void main(String[] args) {
int n = 6; //第6个月
int result = calcRabbit(n);
System.out.println(result); //8
}
private static int calcRabbit(int n) { //计算n个月兔子的对数
if(n == 1 || n == 2){
return 1;
}else{
return calcRabbit(n-1) + calcRabbit(n-2); //上个月和上两个月兔子相加
}
}
}
package com.itheima03.recursion;
public class RabbitDemo02 {
//用循环写,不用递归【递归不需要思考循环次数,但比循环占内存多,因为循环只有一个方法】
public static void main(String[] args) {
int n = 20;
int[] array = new int[n]; // 20个月不同月份兔子数量
array[0] = 1; // 第一个月
array[1] = 1; // 第二个月
for (int i = 2; i < n; i++) {
array[i] = array[i-1] + array[i-2];
}
System.out.println(array[19]); //6765
}
}
以上是关于Java26File类:new File(),递归的主要内容,如果未能解决你的问题,请参考以下文章