目录
Java File文件类
概念和方法具体应用
java.io.File用于封装和平台无关的文件夹和文件夹对象
Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。
File对象代表磁盘中实际存在的文件和目录。
常见的构造方法
- File(String pathName)以path为路径创建File对象,如果pathname是相对路劲,则默认的当前路径在系统属性user.dir中存储
- File(String parent,String child) 这里文件对象的路径为相对于parent路径的child路径
静态属性:
- Separator存储当前系统的路径分隔符
- pathSeparator路径分隔符;如果写多个路径使用;分割
常用方法
exists():boolean文件或者文件夹是否存在
length():long获取文件大小,单位为字节,如果是文件夹则返回值没有指定
renameTo(File):boolean修改名称,可以修改文件名和文件夹名称
delete():boolean 删除文件。也可以删除文件夹,要求文件夹为空,不能有文件和子文件夹
注意:因为具体的文件或者文件夹的删除操作是由操作系统负责实现的,所以Java不能保证一定能够删除成功!
deleteOnExit():void退出系统时自动删除
mkdir():boolean只能创建一层文件夹,如果创建d:/a1/a2/a3时,当父文件夹d:/a1/a2不存在时则创建失败
mkdirs():boolean自动创建多级文件夹
list():String[]获取当前文件夹的所有子文件信息
listFiles():File[]获取当前文件夹的所有子文件信息,子文件为File对象
package IO;
import java.io.File;
public class D05 {
public static void main(String[] args) {
System.out.println(File.separator);// 目录的分隔符\
System.out.println(File.pathSeparator);//路径分隔符;如果写多个路径使用;分割
File a = new File("C:/Users/苑/Desktop/JAVA_DY");// \ 在字符串中为转义字符,如果需要使用 \ 则必须写成 \\ 。一般推荐使用/
File b = new File("C:/Users/苑/Desktop/JAVA_DY/Yuan.txt");
File c = new File("");
System.out.println(c.exists());// 是否存在对应的文件对象,返回true则表示存在
System.out.println(b.getName());// 返回由此抽象路径名表示的文件或目录的名称。Yuan.txt
System.out.println(c.getAbsolutePath());// 获取文件绝对路径,不存在也有路径,当前java代码所在路径
System.out.println(b.getAbsolutePath());// 获取文件绝对路径
System.out.println(a.isDirectory());// true 用于判断当前文件对象是否为文件夹
System.out.println(b.isFile());// true 用于判断当前文件对象是否为文件
System.out.println(b.length());// 获取指定文件对象的字节数,单位为字节。文件里有七个汉字 字节数 :21 (UTF—8一个汉字三字节)
System.out.println(b.canRead());// canRead():boolean是否可读
System.out.println(b.canWrite());//canWrite():boolean 是否可写
// b.delete(); 删除文件或者文件夹,注意Java并不能保证删除一定成功,删除成功在运行一次就被删除了
}
}
访问文件名的方法
getName():String获取文件名称 ;
getPath():String获取路径,如果构建File时使用的是相对路径,则这里返回的就是相对路径;如果创建时参数为绝对路径,则返回绝对路径 ;
getAbsolutePath():String获取绝对路径 ;
getParent():String获取当前文件对象的上级File对象,如果构建文件对象时使用的是相对路径,则这里返回为 null。
文件检测相关方法
canWrite():boolean 是否可写;
canRead():boolean是否可读 ;
isFile():boolean 是否是文件,因为File对象可以封装文件和文件夹 ;
isDirectory():boolean是否为文件夹 ;
isAbsolute():boolean是否为绝对路径 ;
lastModified():long文件的最后修改时间 。
listFiles():File[]获取当前文件夹的所有子文件信息,子文件为File对象
常见操作
createNewFile():boolean 创建一个新文件
package IO;
import java.io.File;
import java.io.IOException;
public class D06 {
public static void main(String[] args) throws IOException {//抛出受检性异常
File ff = new File("abc.txt");
if (!ff.exists()) //同名文件不存在时才能创建文件
ff.createNewFile();//创建在代码上层文件夹内
System.out.println(ff.getAbsolutePath());
}
}
static createTempFile(String prefix, string suffix): File 这个临时文件名称会有随机内容
临时文件的默认存放位置为操作系统默认的临时文件位置 c:\Users\Administrator\AppData\Local\Temp\
package IO;
import java.io.File;
import java.io.IOException;
public class D06 {
public static void main(String[] args) throws IOException {//抛出受检性异常
File a = File.createTempFile("javayuan", ".txt");//其中javayuan是文件的前缀内容,.bak是文件的后缀,其中包含 一段随机内容
//static createTempFile(String prefix, string suffix):File 这个临时文件名称会有随机内容
//临时文件的默认存放位置为操作系统默认的临时文件位置 c:\Users\Administrator\AppData\Local\Temp\
//运行一次多一个临时文件
System.out.println(a.getAbsolutePath());
}
}
/*
C:\Users\苑\AppData\Local\Temp\javayuan6468887907539083187.txt
*/
定义一个方法,能够删除任意文件夹,文件夹路径由键盘录入
package IO;
import java.io.File;
public class D09 {
public static void main(String[] args) {
File ff = new File("c:\\abc");//选一个文件夹
delFile(ff);
}
private static void delFile(File ff) {// 这个方法就是删除文件夹的
if (ff != null) {
if (ff.isFile())// 是文件直接删除
ff.delete();
else if (ff.isDirectory()) {// 这是个文件夹
File[] fs = ff.listFiles(); // 获取当前文件夹的所有子文件信息,子文件为File对象
for (File temp : fs) // 循环遍历拆分文件夹
delFile(temp);
ff.delete();// 传到最深删文件后在回来删文件夹
}
}
}
}
编写程序,在命令行中以树状结构显示特定的文件夹及其子文件夹,如果子文件是文件则需要显示文件大小,最后统计整个目录的大小
package IO;
import java.io.File;
//编写程序,在命令行中以树状结构显示特定的文件夹及其子文件夹,如果子文件是文件则需要显示文件大小, 最后统计整个目录的大小
public class D10 {
static long fileNum = 0; //统计文件数目
static long fileLen = 0; //统计文件总大小
public static void main(String[] args) {
File ff = new File("C:\\Users\\苑\\Desktop\\JAVA_DY\\JAVA2");
if (ff != null && ff.exists()) {
System.out.println(ff.getAbsolutePath()); //输出:C:\Users\苑\Desktop\JAVA_DY\JAVA2
showFile(ff, 0); //调用showFile静态方法
}
System.out.println(ff.getAbsolutePath() + "的文件数目为:" + fileNum + ",总大小为:" + fileLen);
}
public static void showFile(File ff, int level) {
if (ff != null) {
for (int i = 0; i < level; i++)//控制"空格"通过递归达到树状结构显示的特点
System.out.print(" ");
System.out.print("|-"); //文件前的符号
if (ff.isFile()) {
fileNum++; //静态文件数加一
fileLen += ff.length(); //文件大小叠加
System.out.println(ff.getName() + ":" + ff.length()); //getName():String获取文件名称 ;大小
} else if (ff.isDirectory()) {
System.out.println(ff.getName()); //getName():String获取文件夹名称
File[] fs = ff.listFiles(); //listFiles():File[]获取当前文件夹的所有子文件信息,子文件为File对象
for (File temp : fs) //循环遍历
showFile(temp, level + 1); //递归调用
}
}
}
}
C:\Users\苑\Desktop\JAVA_DY\JAVA2
|-JAVA2
|-.classpath:303
|-.project:381
|-.settings
|-org.eclipse.jdt.core.prefs:598
|-abc.txt:36
|-bin....
....
....
|-D14.java:775
|-D15.java:92
|-InsufficientFundsException.java:438
C:\Users\苑\Desktop\JAVA_DY\JAVA2的文件数目为:141,总大小 为:93574
文件过滤器FilenameFilter
带参数的listFiles()方法支持对于子文件进行过滤,只获取需要满足条件的文件对象。
自定义FilenameFilter接口中包含一个accept(File dir,String name)方法,该方法用于对指定File的所有子目录或者文件进行迭代,如果方法返回true则list方法会获取该目录或者文件。
package IO;
import java.io.File;
import java.io.FilenameFilter;
/*带参数的listFiles方法支持对于子文件进行过滤,只获取需要满足条件的文件对象 FilenameFilter接口中包含一个accept(File dir,String name)方法,
* 该方法用于对指定File的所有子目录或者文件进 行迭代,如果方法返回true则list方法会获取该目录或者文件
*/
public class D11 {
public static void main(String[] args) {
File a = new File("C:/windows");
File[] c = a.listFiles(new MyFilenameFilter());// 这是一种写法,MyFilenameFilter可以用匿名内部类代替
// listFiles方法里会调用accept方法这也是对except方法里的返回值设定达到目的的原因
for (File temp : c) {
System.out.println(temp.getAbsolutePath());
}
System.out.println("内部类格式下的另一种操作:");
File b = new File("D:/");
File[] d = b.listFiles(new FilenameFilter() {// 直接new无法实例化FilenameFilter类型调用实现接口的内部类来自动实例化
public boolean accept(File dir, String name) {// listFiles方法会调用这个方法。
return name.endsWith(".exe");
}
});
for (File temp : d) {
System.out.println(temp.getAbsolutePath());
}
}
}
//@FunctionalInterface
//public interface FilenameFilter {// FilenameFilter(文件名筛选器)接口 这是内部java.io.FilenameFilter
//
// boolean accept(File dir,String name); //参数dir是路径格式的文件,name是文件名称;通过accept方法的返回值决定要不要执行这个方法?
//
//}
class MyFilenameFilter implements FilenameFilter {
public boolean accept(File dir, String name) {// 接口中的方法
return name.endsWith(".exe"); // String类 endWith()方法
}
}
C:\windows\py.exe
C:\windows\pyw.exe
C:\windows\regedit.exe
C:\windows\RtkBtManServ.exe
C:\windows\splwow64.exe
C:\windows\winhlp32.exe
C:\windows\write.exe
内部类格式下的另一种操作:
D:\1271-2021-01-07033350-1609961630958.exe
D:\1__5000520__3f7372633d6c6d266c733d6e30646564323362623963__68616f2e3336302e636e__0cf4.exe
D:\6559-2020-07-16060258-1594893778501.exe
D:\WeGameSetup3.30.0.3122_0_1_0_2002019031201(lenovo).exe
语法糖Lambda表达式
Lambda表达式的本质
Lambda表达式和匿名内部类,其实都是用来生成一个接口的实例。
与通过类来实现接口,然后类实例化的一个对象相比,Lambda表达式和匿名内部类语法更加简洁,不必去定义类,就可以生成接口的实例。
编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。简洁,难懂,难以调试。
lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。Lambda表达式还增强了集合库。
Lambda表达式存在的意义
匿名内部类和Lambda表示式其实都是为了简化接口实例化的代码。
当接口的实例仅仅是拿过来使用1次时,单独去写一个类有点浪费了,不如直接一个表达式搞定。
Lambda比匿名内部类更加简单,但是Lambda表达式只能面向只有一个方法的接口,而匿名函数可以支持有任意多个方法的接口。
只有一个方法的接口,可以被称为函数式接口。
Java8为函数式接口提供了一个注解@FunctionalInterface
,用来检查接口是否为函数式接口,可见函数式接口的重要性!
package IO;
import jiekou.A;
public class D13 {
public static void main(String[] args) {
DDD a = (dy) -> { //语法糖
return dy + 10;
};// 相当于接口的内部类实例化重写接口方法
int result = a.dd(2);
System.out.println(result);
}
}
interface DDD {//接口
public int dd(int dy); //唯一方法
}
/*
12
*/
文件过滤器的语法糖写法
package IO;
import java.io.File;
import java.io.FilenameFilter; //@FunctionInterface 只有一个函数的接口
public class D12 {
public static void main(String[] args) {
File a = new File("C:/windows");
//Lambda表达式只能面向只有一个方法的接口 @FunctionInterface 只有一个方法 boolean accept(File dir, String name);
File[] fs = a.listFiles((dir, name) -> {//语法糖的写法 接受唯一个方法两个参数返回 return name != null && name.endsWith(".exe");
return name != null && name.endsWith(".exe");
});
for (File temp : fs) {
System.out.println(temp.getAbsolutePath());
}
}
}
Path和Paths以及Files
- Path接口代表一个平台无关的平台路径
- Files提供工具方法操作文件
- Paths提供创建Path的静态工厂方法
-
package IO; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path;//这是接口 import java.nio.file.Paths; //用Files作为一个操作类 public class D14 { public static void main(String[] args) throws IOException { Path a = Paths.get("C:\\Users\\苑\\Desktop\\JAVA_DY\\JAVA2"); // 方法返回值类型是Paths。 System.out.println(a.toAbsolutePath()); // 获取path对应的绝对路径 System.out.println(a.getRoot()); // 获取path对应的根路径 System.out.println(a.getParent());// 上级目录 System.out.println(Files.getLastModifiedTime(a));// 最后修改时间 System.out.println(Files.getOwner(a));// 拥有者 System.out.println(Files.size(a));// 文件大小 Path b1 = Paths.get("C:\\Users\\苑\\Desktop\\JAVA_DY\\Yuan.txt"); Path b2 = Paths.get("C:\\Users\\苑\\Desktop\\JAVA_DY\\Java2/abc.txt"); Files.copy(b1, b2);// 文件复制 } }