PART01-File
File----文件
getName(); 获取当前文件名字的方法
length(); 获取当前文件的长度(字节)
canWrite();判断文件是否可写
canRead();判断文件是否可读
isHidden();判断文件是否隐藏
isFile();判断当前路径是否是文件
isDirectory(); 判断当前路径是否是文件夹
getParent();获取当前路径的父级目录
getAbsolutePath();获取当前文件的完整路径
可以访问文件或文件夹(目录)的属性
访问文件的路径 要看文件的名字 名字中带后缀 则加后缀 不带则不加.
访问文件夹的路径 没有后缀,直接写文件路径即可.
FileDemo
package day01;
import java.io.File;
import java.io.IOException;
/**
* 1.可以访问文件或文件夹(目录)的属性
* <p>
* 2.创建和删除文件或文件夹(目录)
* <p>
* 3.访问一个文件夹(目录)下的所有子项
*/
public class FileDemo {
public static void main(String[] args) throws IOException {
//1.访问文件
//pathName --- 文件路径
//文件路径分类:
// 绝对路径 : 指的是通过路径可以绝对的能访问到当前电脑的位置(开发基本不用 太局限.)
// 相对路径 : ./ 指的是相对应用程序(项目) 的路径 ----(开发必用)
//访问文件一般是要加后缀的.
File file = new File("./demo.txt");//访问文件的方式
//1.获取当前文件路径的名字
String fileName = file.getName();
System.out.println(fileName);
//2.获取当前文件的长度 (字节)
long length = file.length();
System.out.println(length);
//3.获取当前文件是否可写
System.out.println("是否可写:" + file.canWrite());
System.out.println("是否可读:" + file.canRead());
//4.获取当前文件是否隐藏
System.out.println("是否隐藏:"+ file.isHidden());
//5.可以当前file这个对象路径 是否是文件
System.out.println("是否是文件:"+file.isFile());
//6.可以获取当前文件存不存在的状态.
System.out.println("文件是否存在"+file.exists());
//7.获取当前文件所在的父级路径
System.out.println("当前文件的父级路径:"+ file.getParent());
//8.获取当前文件的完整路径
System.out.println("当前文件的完整路径"+file.getAbsolutePath());
}
}
创建和删除文件或文件夹(目录)
创建文件:CreateFileDemo
package day01;
import java.io.File;
import java.io.IOException;
/**
* 创建文件的使用演示类:
*/
public class CreateFileDemo {
public static void main(String[] args) throws IOException {
//在当前项目路径下创建一个文件
File file = new File("./demo2.txt");//创建一个文件路径对象
if(file.exists()){//判断当前文件路径的物理文件是否存在.
System.out.println("文件已存在,不能进行创建");
}else {
//光标选中 错误提示 alt + Enter + Enter
file.createNewFile();
System.out.println("创建文件成功!!");
}
}
}
创建文件夹:MKDirDemo
package day01;
import java.io.File;
/**
* 创建文件夹的使用演示类:
*/
public class MKDirDemo {
//MK : make 做
//Dir : Directory 文件夹
public static void main(String[] args) {
//在当前项目路径下创建文件夹 test
File dir = new File("./test/a/b/c/d/e");
if(dir.exists()){//判断当前路径下的文件夹存不存在
System.out.println("目录已存在");
}else {
// dir.mkdir(); //创建单个目录
//创建单个目录 若 路径中有不存在的多个目录 则创建不成功
dir.mkdirs();//创建多个目录
System.out.println("目录创建成功!");
}
}
}
删除文件/文件夹DeleteDirDemo
package day01;
import java.io.File;
import java.lang.reflect.Field;
/**
* 删除除文件夹/文件的使用演示类:
*/
public class DeleteDirDemo {
public static void main(String[] args) {
//删除文件夹
File dir = new File("./test/a/b/c/d/e");//一个文件夹路径的对象
if(dir.exists()){//判断文件夹是否存在
dir.delete();//只能删除空的文件夹
//System.out.println("已删除");
}else {
//System.out.println("文件不存在");
}
//删除文件
File file = new File("./demo2.txt");//一个文件路径的对象
if(file.exists()){ //判断文件是否存在
file.delete();//删除文件
System.out.println("删除成功");
}else {
System.out.println("文件不存在!");
}
}
}
3.访问一个文件夹(目录)下的所有子项ListFilesDemo
package day01;
import java.io.File;
/**
* 获取一个文件夹(目录)下的子项
*/
public class ListFilesDemo {
public static void main(String[] args) {
//获取当前项目路径下的所有子项
File dir = new File(".");//一个文件夹路径对象
if(dir.isDirectory()){//判断当前dir路径是否是文件夹
File[] files = dir.listFiles();
System.out.println(files.length);
for (int i = 0; i < files.length; i++) {//遍历File数组 获取数组中每个文件
System.out.println(files[i].getName());//打印每个文件的名字
}
}
}
}
递归删除文件夹
递归(recursion) :是程序中常见的解决问题的方法 (使用频率尽可能限制,因为效率低下)
递归使用时,容易产生死循环.使用递归的时候,一定要加if语句(做一个出口).
递归的思想: 自己调自己(本方法内部调用本方法) , 也可以间接的调用自己.
循环是重复执行某段代码,递归的重复整个过程
main{
recursion();
}
public void recursion(){
...
recursion();
...
}
RecursionDemo
package day01;
import java.io.File;
/**
* 递归的使用演示类:
* 删除文件夹的递归操作。
*/
public class RecursionDemo {
public static void main(String[] args) {
deleteDir(new File("./test"));
System.out.println("执行删除操作。");
}
public static void deleteDir(File file){
/*
* 先判断 传入的file 文件路径对象 是否是 文件夹
* 若是 获取下该文件夹有没有子项
* 循环遍历 接收的子项File数组
* 在循环里 再调用当前本方法 传递 当前数组每个对象
* 如果不是文件夹 就直接 file.delete();
* */
if(file.isDirectory()){//判断当前文件路径是否是文件夹
//若是 获取下该文件夹有没有子项
File[] files = file.listFiles();//获取文件夹下所有子项
for (int i = 0; i < files.length; i++) {
deleteDir(files[i]);//递归:调用本方法传递子项路径
}
}
file.delete();//执行删除
}
}
面试题:
/**
* 面试题:
* 请写一段程序,传入数据100 ,则该程序会返回1+2+3+4+5+....+100 的相加和
* 递归记得做出口,一定是有退出条件的
*/
public static int recursionTest(int number) {
if (number >= 1) {
//规律 最开始100 += 99 += 98 += 97 += 96 +=....+=1
number += recursionTest(number-1);
}
return number;
}
获取文件夹(目录)下的所有子项,也可以有条件的进行获取
文件过滤器ListFilesDemo2
package day01;
import java.io.File;
import java.io.FileFilter;
/**
* 文件过滤器 可以有条件的进行筛选要获取的文件内容:
*/
public class ListFilesDemo2 {
public static void main(String[] args) {
//获取当前项目路径下的子项
File file = new File(".");
FileFilter filter = new FileFilter() {//创建文件过滤器的匿名内部类
@Override
public boolean accept(File filePath) { //重写实现 过滤的条件
//contains 判断内容是否包含 o 这个字母
return filePath.getName().contains("o");//过滤条件为true 则将文件存储(过滤)起来
}
}; //方法参数 通过ctrl + P 查看
File[] files = file.listFiles(filter);//传入文件过滤器对象
System.out.println(files.length);
for (int i = 0; i < files.length; i++) {
System.out.println(files[i].getName());
}
}
}
Lambda 表达式
JDK1.8后 ,java支持了lambda表达式
lambda更好的关注逻辑如何写,而不是语法. 这样的写法是编译器认可的,但是.class文件还会被还原.
lambda表达式:使用匿名内部类实现接口,且接口只有一个抽象方法 才可使用.
LambdaDemo
package day01;
import java.io.File;
import java.io.FileFilter;
/**
* lambda表达式的使用演示类:
*/
public class LambdaDemo {
public static void main(String[] args) {
//获取当前项目路径下的子项
File file = new File(".");
// FileFilter filter = new FileFilter() {
// @Override
// public boolean accept(File filePath) {
// return filePath.getName().contains("o");
// }
// };
//lambda 表达式的语法: 可以忽略 new FileFilter(接口名) 和 内部重写的方法名
//1.可以忽略 new FileFilter(接口名) 和 内部重写的方法名
FileFilter filter1 = (File filePath) ->{
return filePath.getName().contains("o");
};
//2.当 内部方法的形式参数 只有一个的话 则参数类型可以省略 小括号可以省略
FileFilter filter2 = filePath ->{
return filePath.getName().contains("o");
};
//3.若内部重写的方法 方法体只有一行代码的话 {} 可以不写 return 也不要写
FileFilter filter3 = filePath -> filePath.getName().contains("o");
// File[] files1 = file.listFiles( filePath -> filePath.getName().contains("o"));
File[] files = file.listFiles(filter3);
for (int i = 0; i < files.length; i++) {
System.out.println(files[i].getName());
}
}
}