File 类

1、构造器

注意:以下构造器都是创建 File 对象,没有涉及到硬盘中真实存在的文件

1、 public File(String pathname):以 pathname 为路径创建 File 对象,可以是绝对路径或相对路径。

相对路径即为当前代码窗口所在的 module 路径。
(注意:在Test中写的相对路径是相对于该 module 下的,但是在类中的 main 方法中写的相对路径是相对于该工程下的)

绝对路径:包含盘符在内的文件或文件目录路径

路径分隔符:Windows \ —— unix / ——也可以用File类的常量File.separator

@Test
publc void Test(){
	File file1 = new File("hello.txt");
	File file2 = new File("C:\\Users\\admin\\AppData\\he.txt");
	//等价于
	//File file2 = new File("C:" + File.separator + "Users" + File.separator + "admin" + File.separator + "AppData" + File.separator + "he.txt");
	
	System.out.println(file1);  //hello.txt
	System.out.println(file2);  //C:\Users\admin\AppData\he.txt
}

(注意:在Test中写的相对路径是相对于该 module 下的,但是在类中的 main 方法中写的相对路径是相对于该工程下的)

@Test
publc void Test(){
	File file1 = new File("hello.txt");
	System.out.println(file1);  //D:\Project\day01\hello.txt
}
public class A{
	public static void main(String[] args){
		File file2 = new File("hello.txt");
		System.out.println(file2);  //D:\Project\hello.txt
		File file3 = new File("day01\\hello.txt");
		System.out.println(file2);  //D:\Project\day01\hello.txt
	}
}

2、 public File(String parent,String child):以 parent 为父路径,child 为子路径创建 File 对象

child 可以是路径,也可以是具体文件

@Test
publc void Test(){
	//此时是个路径,而非文件
	File file3 = new File("C:\\Users\\admin", "AppData");
	System.out.println(file3);  //C:\Users\admin\AppData
}

3、 public File(File parent,String child):根据一个父 File 对象和子文件路径创建 File 对象

@Test
publc void Test(){
	//此时是个文件
	File file4 = new File(file3,"he.txt");
	System.out.println(file3);  //C:\Users\admin\AppData\he.txt
}

2、常用方法

public String getAbsolutePath():获取绝对路径
public String getPath():获取路径
public String getName():获取名称
public String getParent():获取上层文件目录路径,若无,返回 null
public long length():获取文件长度(文件字节大小),只可以是文件,不可以是目录
public long lastModified():获取最后一次修改时间,毫秒数,时间戳

@Test
public void Test1(){
	File file1 = new File("hello.txt");
	
	System.out.println(file1.getAbsolutePath());   //D:\workspace\atguigu\hello.txt
	System.out.println(file1.getPath());   //hello.txt
	System.out.println(file1.getName());   //hello.txt
	System.out.println(file1.getParent());   // null
	System.out.println(file1.length());   // 0
	System.out.println(new Date(file1.lastModified()));   // 0
	
	File file2 = new File("C:\\Users\\admin\\AppData\\he.txt");

	System.out.println(file2.getAbsolutePath());   //C:\Users\admin\AppData\he.txt
	System.out.println(file2.getPath());   //C:\Users\admin\AppData\he.txt
	System.out.println(file2.getName());   //he.txt
	System.out.println(file2.getParent());   //C:\Users\admin\AppData
	System.out.println(file2.length());   // 0
	System.out.println(file2.lastModified());   // 0
}

以下的两个方法适用于文件目录:
public String[] list():获取指定目录下的所有文件或文件目录的 名称 数组
public File[] listFiles():获取指定目录下的所有文件或者文件目录的 File 数组

如果传入的目录不存在,则抛 空指针异常

@Test
public void Test1(){
	File file = new File("C:\\Users\\admin\\AppData");
	
	String[] list = file.list();
	for(String s : list){
		System.out.println(s);
	}
	
	File[] files = file.listFiles();
	for(File f : files){
		System.out.println(f);
	}
}

public boolean renameTo(File dest):把文件重命名为指定的文件路径

比如:file1.renameTo(file2);
要想返回是true,就需要 file1 在硬盘中是存在的,而 file2 在硬盘中不存在

@Test
public void Test1(){
	File file1 = new File("C:\\Users\\admin\\AppData\\hello.txt");   //存在
	File file2 = new File("C:\\Users\\admin\\he.txt");  //不存在
	
	boolean r = file1.renameTo(file2);
	System.out.prinln(r);   // true
}

执行后的结果就是目录下,C:\Users\admin 有一个文件 he.txt,内容是 hello 。而目录 C:\Users\admin\AppData 下没有文件了

常用:
public boolean isDirectory():判断是否是文件目录
public boolean isFile():判断是否是文件
public boolean exists():判断是否存在

不常用:
public boolean canRead():判断是否可读
public boolean canWrite():判断是否可写
public boolean isHidden():判断是否隐藏

@Test
public void Test1(){
	File file1 = new File("hello.txt");   //该文件存在
	
	System.out.prinln(file1.isDirectory());   //false
	System.out.prinln(file1.isFile());     //true
	System.out.prinln(file1.exists());     //true
	System.out.prinln(file1.canRead());    //true
	System.out.prinln(file1.canWrite());   //true
	System.out.prinln(file1.isHidden());   //false
	
	File file2 = new File("hello11.txt");   //该文件不存在
	
	System.out.prinln(file1.isDirectory());   //false
	System.out.prinln(file1.isFile());     //false
	System.out.prinln(file1.exists());     //false
	System.out.prinln(file1.canRead());    //false
	System.out.prinln(file1.canWrite());   //false
	System.out.prinln(file1.isHidden());   //false
}

文件若是不存在,都是false

创建硬盘中对应的文件:
public boolean createNewFile():创建文件,若文件存在,则不创建
public boolean delete():删除磁盘中的文件或文件夹(要想删除目录成功,文件下面不可以有子目录或文件)

注意:java中的删除不走回收站

@Test
public void Test1() throw IOException{
	File file = new File("hello.txt");
	if(!file.exists()){
		file.createNewFile();
		System.out.println("创建成功");
	}else{
		file.delete();
		System.out.println("文件已删除");
	}
}

//要想删除目录 AppData 成功,文件下面不可以有子目录或文件
@Test
public void Test1() throw IOException{
	File file = new File("C:\\Users\\admin\\AppData");
	System.out.println(file.delete(););
}

创建硬盘中对应的文件目录:
public boolean mkdir():创建文件目录,若此目录存在,就不创建了。如果上层目录不存在,也不创建
public boolean mkdirs():创建文件目录,如果上层目录不存在,一并创建

注意:若创建文件或文件目录没有写盘符路径,则默认在该项目路径下

@Test
public void Test1() throw IOException{
	//此时只有D盘中的io文件夹
	File file = new File("D:\\io\\io1");
	boolean b = file.mkdir();
	if(b){
		System.out.println("创建成功");
	}
}

执行过后,D盘中的 io 文件夹中出现 io1 文件夹

此时没有 io2 文件夹,两个方法对比执行

@Test
public void Test1() throw IOException{
	File file1 = new File("D:\\io\\io2\\io3");
	boolean b1 = file.mkdir();
	if(b1){
		System.out.println("创建成功1");
	}
	
	File file2 = new File("D:\\io\\io2\\io3");
	boolean b2 = file.mkdirs();
	if(b2){
		System.out.println("创建成功2");
	}
}

输出:创建成功2

说明mkdirs()方法创建文件目录,如果上层目录不存在,一并创建
mkdir()方法如果上层目录不存在,都不创建

3、练习

1、 创建一个与 file1 同目录下的另外一个文件

@Test
public void Test1() throw IOException{
	File file1 = new File("hello.txt");
	
	//创建一个与file1同目录下的另外一个文件
	File file2 = new File(file1.getParent(),"hi.txt");
	boolean b = file2.creatNewFile();
	if(b){
		System.out.prinln("创建成功");
	}
}

2、 判断指定目录下是否有后缀名为 “.jpg” 的文件,如果有,输出文件名称

//第一种:使用public String[] list()
@Test
public void Test1(){
	File file1 = new File("D:\\io");
	
	String[] list = file1.list();
	for(String s : list){
		if(s.endsWith(".jpg")){
			System.out.println(s);
		}
	}
}
//第二种:使用public File[] listFiles()
@Test
public void Test1(){
	File file1 = new File("D:\\io");
	
	File[] list = file1.listFiles();
	for(File f : list){
		if(f.getName().endsWith(".jpg")){
			System.out.println(f.getAbsolutePath());
		}
	}
}
//第三种:File类提供了两个文件过滤器方法
// public String[] list(FilenameFilter filter)
// public File[] listFiles(FileFilter filter)
@Test
public void Test1(){
	File file1 = new File("D:\\io");
	
	File[] subFile = file1.listFiles(new FilenameFilter(){
		@Override
		public boolean accept(File f, String name){
			return name.endsWith(".jpg");
		}
	});
	for(File f : subFile){
		System.out.println(f.getAbsolutePath());
	}
}

3、 遍历指定目录下所有文件名称,包括子目录中的文件

//第一种:递归实现
public class Test{
	public static void main(String[] args){
		//创建文件目录
		File dir = new File("hello.txt");
	
		//打印目录的子文件
		println(dir);
	}
	public static void println(File f){
		//打印目录的子文件
		File[] file = f.listFiles();
		
		for(File i : file){
			if(i.isDirectory()){  //判断目录的子文件是否是文件目录
				println(i);
			}else{   //若目录下是子文件,输出文件名
				System.out.prinln(i.getAbsolutePath());
			}
		}
	}
}

拓展1:求指定目录所在空间的大小,求任意一个目录的大小

public long getDirectorySize(File file){
	//file是文件,那么直接返回 file.length()
	//如果file是目录,把他的下一级所有大小加起来就是总大小
	long size = 0;
	if(file.isFile()){
		size += file.length();
	}else{
		File[] all = file.listFiles();  //file是目录,获取下一级
		//递归,循环判断下一级
		for(file f : all){
			size += getDirectorySize(f);
		}
	}
	return size;
}

拓展2:删除指定的目录

public long deleteDirectory(File file){
	//如果file是文件或者空目录,直接删除自己
	//如果file是有内容的目录,先把下一级干掉,最后删除自己
	if(file.isDirectory()){
		File[] all = file.listFiles();  //file是目录,获取下一级
		//递归,循环判断下一级
		for(file f : all){
			size += deleteDirectory(f);
		}
	}
	//删除自己
	delete file;
}

4、小结

  1. File 类是一个对象,代表一个文件或一个文件目录(俗称:文件夹)
  2. File 类声明在 java.io 包下
  3. File 类中涉及到关于文件或文件目录的创建、删除、修改时间、文件大小等方法
  4. 但并未涉及到写入、读取文件内容的操作
    若需要读取或写入内容,必须使用IO流来完成
  5. 后续File 类的对象常作为参数传递到流的构造器中,指明读取或写入的“终点”

常用方法

  1. public String getAbsolutePath():获取绝对路径
  2. public String getPath():获取路径
  3. public String getName():获取名称
  4. public String getParent():获取上层文件目录路径,若无,返回 null
  5. public long length():获取文件长度(文件字节大小),只可以是文件,不可以是目录
  6. public long lastModified():获取最后一次修改时间,毫秒数,时间戳
  7. public String[] list():获取指定目录下的所有文件或文件目录的 名称 数组
  8. public File[] listFiles():获取指定目录下的所有文件或者文件目录的 File 数组
  9. public boolean renameTo(File dest):把文件重命名为指定的文件路径
    需要 file1 在硬盘中是存在的,而 dest 在硬盘中不存在
  10. public boolean isDirectory():判断是否是文件目录
  11. public boolean isFile():判断是否是文件
  12. public boolean exists():判断是否存在
  13. public boolean createNewFile():创建文件,若文件存在,则不创建
  14. public boolean delete():删除磁盘中的文件或文件夹
    (要想删除目录成功,文件下面不可以有子目录或文件)
  15. public boolean mkdir():创建文件目录,若此目录存在,就不创建了。如果上层目录不存在,也不创建
  16. public boolean mkdirs():创建文件目录,如果上层目录不存在,一并创建
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值