FILE
java.io.File
File用来表示硬盘上的一个文件或目录的(本质是表示一个抽象路径)
使用File可以
- 访问其表示的文件或目录
- 创建和删除文件或目录
- 访问一个目录中所有子项
- File不能访问文件数据
public class FileDemo{
public static void main(String[] args){
/*
创建File时需要指定路径,而路径通常使用相对路径,绝对路径存在跨平台问题,
相对路径中常见"./"表示当前目录,在IDEA中执行时"./"的位置是当前项目
*/
File file =new File("./demo1.2.3.432");
//获取文件大小
long len=file.length();
System.out.println(len+":字节");
//获取名字
String name =file.getName();
System.out.println("名字:"+name);
//是否可读
boolean cr=file.canRead();
boolean cw=file.canWrite();
System.out.println("可读:"+cr);
System.out.println("可写:"+cw);
//是否隐藏
boolean ih = file.isHidden();
System.out.println("是否隐藏:"+ih);
}
}
使用File创建一个新文件
createNewFile()方法,可以创建一个新的文件
package file;
import java.io.File;
import java.io.IOException;
/**
* 使用File创建一个新文件
*/
public class CreateNewFileDemo {
public static void main(String[] args) throws IOException {
//在当前项目目录下新建一个文件test.txt
// File file = new File("./test.txt");
//在相对路径中"./"可以忽略不写的。默认就是从"./"开始
File file = new File("test.txt");
//如果创建文件时指定的目录不存在则会抛出异常:java.io.IOException: 系统找不到指定的路径。
// File file = new File("./a/test.txt");
/*
boolean exists()
判断当前File表示的文件或目录是否真实存在。若存在则返回true否则返回false
exists:存在
create:创建
*/
if(file.exists()){
System.out.println("该文件已存在!");
}else{
file.createNewFile();//alt+enter(回车) 选第一项Add exception....
System.out.println("文件已创建!");
}
}
}
删除文件
delete()方法可以将File表示的文件删除
package file;
import java.io.File;
/**
* 删除一个文件
*/
public class DeleteFileDemo {
public static void main(String[] args) {
//向当前项目目录下的test.txt文件删除
File file = new File("test.txt");
if(file.exists()){
file.delete();//delete:删除
System.out.println("该文件已删除!");
}else{
System.out.println("该文件不存在!");
}
}
}
创建目录
mkDir():创建当前File表示的目录
mkDirs():创建当前File表示的目录,同时将所有不存在的父目录一同创建
package file;
import java.io.File;
/**
* 创建目录
*/
public class MkDirDemo {
public static void main(String[] args) {
//在当前项目目录下新建一个目录(文件夹)demo
// File dir = new File("demo");
File dir = new File("a/b/c/d/e/f");
if(dir.exists()){
System.out.println("该目录已存在");
}else{
/*
make:做
directory:目录
mkdir()创建目录是要求该目录所在的目录必须存在,否则无法创建
mkdirs()创建目录时会将所有不存在的父目录一同创建出来,推荐使用.
*/
// dir.mkdir();
dir.mkdirs();
System.out.println("该目录已创建!");
}
}
}
删除目录
delete():方法可以删除一个目录,但是只能删除空目录
package file;
import java.io.File;
/**
* 删除目录
*/
public class DeleteDirDemo {
public static void main(String[] args) {
//将当前项目目录下的demo目录删除
// File dir = new File("./demo");
File dir = new File("./a");
if(dir.exists()){
/*
delete方法在删除目录时要求该目录必须是一个空目录!!
*/
dir.delete();
System.out.println("该目录已删除!");
}else{
System.out.println("该目录不存在!");
}
}
}
访问一个目录中所有的子项
listFiles()方法可以访问一个目录中的所有子项
package file;
import java.io.File;
/**
* 访问一个目录中的所有子项
*/
public class ListFilesDemo {
public static void main(String[] args) {
//获取当前项目目录下的所有子项
File dir = new File(".");
/*
boolean isFile()
判断当前File对象表示的是否为一个文件
boolean isDirectory()
判断当前File对象表示的是否为一个目录
*/
if(dir.isDirectory()){
System.out.println(dir.getName()+":是一个目录");
/*
File[] listFiles()
获取当前File对象表示的目录中的所有子项.
返回的数组中每个File对象就是该目录中的一个子项.
*/
File[] subs = dir.listFiles();
System.out.println(subs.length+"个子项");
for(File sub : subs){
System.out.println(sub.getName());
}
}
}
}
获取一个目录中的部分子项
重载的listFile方法:file[] listFile(FileFilter)
package file;
import java.io.File;
import java.io.FileFilter;
/*** 重载的listFiles方法,允许我们传入一个文件过滤器从而可以有条件的获取一个目录 * 中的子项。 */
public class ListFilesDemo2 {
public static void main(String[] args) {
/* 需求:获取当前目录中所有名字以"."开始的子项 */
File dir = new File(".");
if(dir.isDirectory()){
// FileFilter filter = new FileFilter(){
// 匿名内部类创建过滤器
// public boolean accept(File file) {
// String name = file.getName();
// boolean starts = name.startsWith(".");//名字是否以"."开始
// System.out.println("过滤器过滤:"+name+",是否符合要求:"+starts);
// return starts;
// }
// };
// File[] subs = dir.listFiles(filter);//方法内部会调用accept方法
File[] subs = dir.listFiles(new FileFilter(){
public boolean accept(File file) {
return file.getName().startsWith(".");
}
});
System.out.println(subs.length);
}
}
}
Lambda表达式
- JDK8之后,java就支持了Lambda表达式这个特性
- Lambda可以使用更精确的代码创建匿名内部类,但是该匿名内部类实现的接口只能有一个抽象方法,否则无法使用
- Lambda表达式是编译器认可的,最终还是会将其改为内部类编译到class文件中.
语法:
(参数列表)->{
方法体
}
public class LambdaDemo1 {
public static void main(String[] args) {
//定义一个文件过滤器,规律规则为名字中含有字母"F"
//文件过滤器的匿名内部类创建形式
FileFile filter=new FileFilter(){
public boolean accept(File file){
return file.getName().contains("F");
};
//箭头函数,和上一个函数一样
//省去了接口名和方法名部分
FileFilter filter1=(File file)->{
return file.getName().contains("F");
} ;
//还可以省略为,参数列表中的参数类型可以忽略不写
FileFilter filter2=(file)->{
return file.getName().contains("F");
};
//还可以如下省略
//前提是:如果方法体中只有一句代码,那么方法体"{}"可以忽略不写,如果这句代码包含return,也要一同忽略
FileFilter filter3=(file)->file.getName().contains("F");
//如果只有一个参数,那么参数列表的"()"可以忽略不写
FileFilter filter4=file->file.getName().contains("F");
//实际应用
File dir = new File("./src/main/java/file");
// File[] subs = dir.listFiles(new FileFilter() {
// public boolean accept(File file) {
// return file.getName().contains("F");
// }
// });
File[] subs = dir.listFiles(f->f.getName().contains("F"));
}
}
Lambda表达式集合排序
package lambda;
import java.util.*;
/**
* 集合排序
*/
public class LambdaDemo2 {
public static void main(String[] args) {
List<Integer> list=new ArrayList<>();
Random random=new Random();
for(int i=0;i<10;i++){
list.add(random.nextInt(100));
}
System.out.println(list);
//从大到小
// Collections.sort(list, new Comparator<Integer>() {
// @Override
// public int compare(Integer o1, Integer o2) {
// return o2-o1;
// }
// });
Collections.sort(list,(o1,o2)->o2-o1);
System.out.println(list);
list.sort((o1,o2)->o2-o1);
System.out.println(list);
}
}
下面这种形式也是lambda表达式
package lambda;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class LambdaDemo3 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("一个");
list.add("东方");
list.add("南方");
System.out.println(list);
Collections.sort(list, Comparator.comparingInt(String::length));
System.out.println(list);
}
}
总结
File类的每一个实例可以表示硬盘(文件系统)中一个文件或目录(实际上表示的是一个抽象路径).
使用File可做到:
- 访问其表示的文件或目录的属性信息,例如名字,大小,修改时间等等
- 创建和删除文件或目录
- 访问一个目录中的子项
- 不能访问文件数据
常用构造器
- File(String pathname)
- File(File parent,String name)
常用方法:
- length():返回一个long值,表示占用的磁盘空间,单位为字节。
- canRead():File表示的文件或目录是否可读
- canWrite():File表示的文件或目录是否可写
- isHidden():File表示的文件或目录是否为隐藏的
- createNewFile():创建一个新文件,如果指定的文件所在的目录不存在会抛出异常
- java.io.FileNotFoundException
- mkdir:创建一个目录
- mkdirs:创建一个目录,并且会将所有不存在的父目录一同创建出来,推荐使用。
- delete():删除当前文件或目录,如果目录不是空的则删除失败。
- exists():判断File表示的文件或目录是否真实存在。true:存在 false:不存在isFile():判断当前File表示的是否为一个文件。
- isDirectory():判断当前File表示的是否为一个目录
- listFiles():获取File表示的目录中的所有子项
- listFiles(FileFilter fifilter):获取File表示的目录中满足fifilter过滤器要求的所有子项