File类
File类的每一个实例可以表示硬盘(文件系统)中的一个文件或目录(实际上表示的是一个抽象路径)
使用File可以做到:
- 1:访问其表示的文件或目录的属性信息,例如:名字,大小,修改时间等等
- 2:创建和删除文件或目录
- 3:访问一个目录中的子项
但是File不能访问文件数据.
public class FileDemo {
public static void main(String[] args) {
//使用File访问当前项目目录下的demo.txt文件
/*
创建File时要指定路径,而路径通常使用相对路径。
相对路径的好处在于有良好的跨平台性。
"./"是相对路径中使用最多的,表示"当前目录",而当前目录是哪里
取决于程序运行环境而定,在idea中运行java程序时,这里指定的
当前目录就是当前程序所在的项目目录。
*/
/*
实际开发中我们不会使用绝对路径。虽然清晰明了,但是不利于跨平台。
相对路径有更好的跨平台性,但是具体位置要看程序运行环境而定。
例如:
"./":当前目录,对于IDEA而言,该目录是当前程序所在的项目目录。
*/
// File file = new File("c:/xxx/xxx/xx/xxx.txt");
File file = new File("./demo.txt");
//获取名字
String name = file.getName();
System.out.println(name);
//获取文件大小(单位是字节)
//字母是一个字节,汉字是四个字节
long len = file.length();
System.out.println(len+"字节");
//是否可读可写
boolean cr = file.canRead();
boolean cw = file.canWrite();
System.out.println("是否可读:"+cr);
System.out.println("是否可写:"+cw);
//是否隐藏
boolean ih = file.isHidden();
System.out.println("是否隐藏:"+ih);
}
}
##### 创建一个新文件
createNewFile()方法,可以创建一个新文件
package file;
import java.io.File;
import java.io.IOException;
/**
* 使用File创建一个新文件
创建文件的前提是该文件所在的目录必须存在,如果目录不存在则创建时会抛出异常:
java.io.IOException: 系统找不到指定的路径。
*/
public class CreateNewFileDemo {
public static void main(String[] args) throws IOException {
//在当前目录下新建一个文件:test.txt
File file = new File("./test.txt");
//File file = new File("./mydir/test.txt");
//boolean exists()判断当前File表示的位置是否已经实际存在该文件或目录
if(file.exists()){
System.out.println("该文件已存在!");
}else{
file.createNewFile();//将File表示的文件创建出来
System.out.println("文件已创建!");
}
}
}
##### 删除一个文件
delete()方法可以将File表示的文件删除
package file;
import java.io.File;
/**
* 使用File删除一个文件
*/
public class DeleteFileDemo {
public static void main(String[] args) {
//将当前目录下的test.txt文件删除
/*
相对路径中"./"可以忽略不写,默认就是从当前目录开始的。
*/
File file = new File("test.txt");
if(file.exists()){
file.delete();
System.out.println("文件已删除!");
}else{
System.out.println("文件不存在!");
}
}
}
##### 创建目录
mkDir():创建当前File表示的目录
mkDirs():创建当前File表示的目录,同时将所有不存在的父目录一同创建
/**
* directory:目录
* make:做
* 注:mkdir是linux中的一条命令。就是make directory的简写,意思是创建目录
*
* 使用File创建一个目录
*/
public class MkDirDemo {
public static void main(String[] args) throws IOException {
//在当前目录下新建一个目录:demo
// File dir = new File("./demo");
File dir = new File("demo");
// File dir = new File("./a/b/c/d/e/f/demo");
if(dir.exists()){
System.out.println("该目录已存在!");
}else{
// 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()){
dir.delete();//delete方法删除目录时只能删除空目录
System.out.println("目录已删除!");
}else{
System.out.println("目录不存在!");
}
}
}
##### 访问一个目录中的所有子项
listFiles方法可以访问一个目录中的所有子项
package file;
import java.io.File;
/**
* 访问一个目录中的所有子项
*/
public class ListFilesDemo1 {
public static void main(String[] args) {
//获取当前目录中的所有子项
File dir = new File(".");//表示当前目录
/*
boolean isFile()
判断当前File表示的是否为一个文件
boolean isDirectory()
判断当前File表示的是否为一个目录
*/
if(dir.isDirectory()){
/*
File[] listFiles()
将当前目录中的所有子项返回。返回的数组中每个File实例表示其中的一个子项
*/
File[] subs = dir.listFiles();
System.out.println("当前目录包含"+subs.length+"个子项");
for(int i=0;i<subs.length;i++){
File sub = subs[i];
System.out.println(sub.getName());
}
}
}
}
##### 获取目录中符合特定条件的子项
重载的listFiles方法:File[] listFiles(FileFilter)
该方法要求传入一个文件过滤器,并仅将满足该过滤器要求的子项返回。
/**
*
* filter:过滤器
* accept:接受
* contains:包含
*
* 有条件的获取一个目录中的子项
*
* File有一个重载的listFiles方法,允许我们传入一个文件过滤器,并在该过滤器上定义过滤
* 条件,之后listFiles执行完毕会将目录中所有满足过滤器要求的子项进行返回
*/
public class ListFilesDemo2 {
public static void main(String[] args) {
//获取当前目录中名字里含有字母"o"的子项
File dir = new File(".");
if(dir.isDirectory()){
/*
File listFiles(FileFilter filter)
*/
FileFilter filter = new FileFilter() {
public boolean accept(File file) {
System.out.println("正在过滤:"+file.getName());
return file.getName().contains("o");
}
};
/*
File[] listFiles(FileFilter filter)
该方法会将该目录中每一个子项都作为参数先传给filter的accept方法,
只有accept方法返回为true的子项最终才会被包含在返回的File[]数组
中进行返回。
*/
File[] subs = dir.listFiles(filter);
System.out.println("共:"+subs.length+"个子项");
for(int i=0;i<subs.length;i++){
File sub = subs[i];
System.out.println(sub.getName());
}
}
}
}
class MyFilter implements FileFilter{
@Override
public boolean accept(File file) {
//过滤条件是名字中含有"o"的
String name = file.getName();//获取该file表示的文件或目录的名字
// String regex = ".*o.*";//正则表达式写法
// boolean match = name.matches(regex);
// name.indexOf("o")>=0;
return name.contains("o");
}
}
### Lambda表达式
JDK8之后,java支持了lambda表达式这个特性.
- lambda可以用更精简的代码创建匿名内部类.但是该匿名内部类实现的接口只能有一个抽象方法,否则无法使用!
- lambda表达式是编译器认可的,最终会将其改为内部类编译到class文件中
package lambda;
import java.io.File;
import java.io.FileFilter;
/**
* JDK8之后java支持了lambda表达式这个特性
* lambda表达式可以用更精简的语法创建匿名内部类,但是实现的接口只能有一个抽象
* 方法,否则无法使用。
* lambda表达式是编译器认可的,最终会被改为内部类形式编译到class文件中。
*
* 语法:
* (参数列表)->{
* 方法体
* }
*/
public class LambdaDemo {
public static void main(String[] args) {
//匿名内部类形式创建FileFilter
FileFilter filter = new FileFilter() {
public boolean accept(File file) {
return file.getName().startsWith(".");
}
};
FileFilter filter2 = (File file)->{
return file.getName().startsWith(".");
};
//lambda表达式中参数的类型可以忽略不写
FileFilter filter3 = (file)->{
return file.getName().startsWith(".");
};
/*
lambda表达式方法体中若只有一句代码,则{}可以省略
如果这句话有return关键字,那么return也要一并省略!
*/
FileFilter filter4 = (file)->file.getName().startsWith(".");
}
}
精简程序的步骤
package lambda;
/*
lambda表达式
lambda可以使程序员面向函数编程
可以使更精简的语法创建匿名内部类
但是lambda创建匿名内部类是要求所实现的接口只能有一个抽象方法
语法:
(参数列表)->{
方法体
}
*/
//改进前的匿名内部类:
/*
FileFilter filter = new FileFilter() {
@Override
public boolean accept(File file) {
return file.getName().contains("o");
}
};
*/
//改进后的匿名内部类:
/*
FileFilter filter = (File file)-> {
return file.getName().contains("o");
};
*/
//参数类型可以忽略不写
/*
FileFilter filter = (file)-> {
return file.getName().contains("o");
};
*/
//参数如果只有一个,()可以进一步省略
/*
FileFilter filter = file-> {
return file.getName().contains("o");
};
*/
//如果方法体内只有一条语句,则进一步省略{};和return
/*
FileFilter filter = file-> file.getName().contains("o");
*/
import java.io.File;
import java.io.FileFilter;
public class LambdaDemo {
public static void main(String[] args) {
//获取当前目录中名字里面含有字母"o"的子项
File dir = new File(".");
if(dir.isDirectory()){
FileFilter filter = (File file)-> {
String name = file.getName();
System.out.println("正在过滤:"+name);
return file.getName().contains("o");
};
File[] subs = dir.listFiles(filter); //回调
System.out.println("共多少子项"+subs.length);
for(int i=0;i< subs.length;i++){
File sub = subs[i];
System.out.println(sub.getName());
}
}
}
}
package file;
//有条件的获取一个目录中的子项
import java.io.File;
import java.io.FileFilter;
/**
*
* f
* 有条件的获取一个目录中的子项
*
* File有一个重载的ListFiles方法 允许我们传入一个文件过滤器,并在该过滤器上定义过滤条件
* 之后ListFiles执行完毕会将目录中的所有满足条件的过滤器要求的子项进行返回
*/
public class ListFilesDemo2 {
public static void main(String[] args) {
//获取当前目录中名字里面含有字母"o"的子项
/*
File dir = new File(".");
if(dir.isDirectory()){
FileFilter filter = new FileFilter() {
@Override
public boolean accept(File file) {
return file.getName().contains("o");
}
};
File[] subs = dir.listFiles(filter); //回调
System.out.println("共多少子项"+subs.length);
for(int i=0;i< subs.length;i++){
File sub = subs[i];
System.out.println(sub.getName());
}
}
*/
File dir = new File(".");
if(dir.isDirectory()){
File[] subs = new File(".").listFiles(file -> file.getName().contains("o")); //回调
System.out.println("共多少子项"+subs.length);
for(int i=0;i< subs.length;i++){
File sub = subs[i];
System.out.println(sub.getName());
}
}
}
}
package file;
import java.io.File;
import java.io.FileFilter;
//获取
public class Test {
public static void main(String[] args) {
File file = new File("./src/file");//定义目录
if(file.isDirectory()){
FileFilter filter = new FileFilter() {
@Override
public boolean accept(File pathname) { //这里参数进去的是每一个文件
String name = pathname.getName();
System.out.println("正在过滤:"+name);
return pathname.getName().startsWith("D");
}
};
File[] subs = file.listFiles(filter);//listFiles拿到每个子项,将每个子项都通过filter过滤一遍。
System.out.println("多少子项:"+subs.length);
for(int i=0;i<subs.length;i++){
File sub = subs[i];
System.out.println(sub.getName());
}
}
}
}
/**
* 获取./src/file目录下所有名字以"D"开头的子项
*/
public class Test {
public static void main(String[] args) {
File dir = new File("./src/file");
if(dir.isDirectory()){
FileFilter filter = new FF(){}; //多态
File[] subs = dir.listFiles(filter); //回调
for(int i=0;i<subs.length;i++){
System.out.println(subs[i].getName());
}
}
}
}
piblic class FF implements FileFilter(){ //实现FileFilter借口,重写其中的抽象方法
public boolean accept(File file) {
String name = file.getName();
System.out.println("正在过滤:"+name);
return name.startsWith("D");
}
}