Java File文件类

目录

 

Java File文件类

概念和方法具体应用

常用方法

访问文件名的方法

文件检测相关方法

文件过滤器FilenameFilter

语法糖Lambda表达式

Lambda表达式的本质

Lambda表达式存在的意义

Path和Paths以及Files


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);// 文件复制
    	}
    }
    

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值