目录

1、基本介绍

2、常用构造器

3、路径分隔符

4、常用方法

5、说明

6、测试


1、基本介绍

java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关

  • File 能新建、删除、重命名文件和目录,但  File 不能访问文件内容本身。 如果需要访问文件内容本身,则需要使用输入/输出流。
  • 想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。
  • File对象可以作为参数传递给流的构造器。

2、常用构造器

public File(String pathname):以pathname为路径创建File对象,可以是绝对路径或者相对路径,如果 pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。

  • 绝对路径:是一个固定的路径,从盘符开始
  • 相对路径:是相对于某个位置开始

user.dir表示用户当前工作目录,查看user.dir的值

说明:

  • 如果使用单元测试,文件相对路径为当前module
  • 如果使用main()测试,文件相对路径为当前工程
@Test
    public void test(){
        System.out.println(System.getProperty("user.dir"));
    }

结果:

D:\workspace_idea1\JavaSenion\day08

public static void main(String[] args) {
        System.out.println(System.getProperty("user.dir"));
    }

 结果:

D:\workspace_idea1\JavaSenion

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

3、路径分隔符

路径中的每级目录之间用一个路径分隔符隔开。

路径分隔符和系统有关:

  • windows和DOS系统默认使用“\”来表示
  • UNIX和URL使用“/”来表示

Java程序支持跨平台运行,因此路径分隔符要慎用。

为了解决这个隐患,File类提供了一个常量:public  static final String separator。根据操作系统,动态的提供分隔符。

举例

File file1 = new File("d:\\atguigu\\info.txt");
File file2 = new File("d:" + File.separator + "atguigu" + File.separator + "info.txt");
File file3 = new File("d:/atguigu");

4、常用方法

 File类的获取功能

  • public String getAbsolutePath():获取绝对路径
  • public String getPath() :获取路径
  • public String getName() :获取名称
  • public String getParent():获取上层文件目录路径。若无,返回null
  • public long length() :获取文件长度(即:字节数)。不能获取目录的长度。
  • public long lastModified() :获取最后一次的修改时间,毫秒值
  • public String[] list() :获取指定目录下的所有文件或者文件目录的名称数组
  • public File[] listFiles() :获取指定目录下的所有文件或者文件目录的File数组

File类的重命名功能

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

File类的判断功能

  • public boolean isDirectory():判断是否是文件目录
  • public boolean isFile() :判断是否是文件
  • public boolean exists() :判断是否存在
  • public boolean canRead() :判断是否可读
  • public boolean canWrite() :判断是否可写
  • public boolean isHidden() :判断是否隐藏

File类的创建功能

  • public boolean createNewFile() :创建文件。若文件存在,则不创建,返回false。路径不存在会报错,系统找不到指定的路径。
  • public boolean mkdir() :创建文件目录。如果此文件目录存在,就不创建了。 如果此文件目录的上层目录不存在,也不创建。
  • public boolean mkdirs() :创建文件目录。如果上层文件目录不存在,一并创建 。

注意事项:如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下。

File类的删除功能

  • public boolean delete():删除文件或者文件夹 

删除注意事项:Java中的删除不走回收站。要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录

5、说明

file类提供了 java java中file类的功能_文件目录

6、测试

1)File的三个构造器

@Test
    public void test() throws IOException {
        File file1=new File("hello4.txt");//相对于当前module
        File file2=new File("D:\\workspace_idea1\\JavaSenion\\day08\\hello.txt");
        file1.createNewFile();
        System.out.println(file1);
        System.out.println(file2);

        //构造器二:
        File file3=new File("D:\\workspace_idea1","JavaSenion");
        System.out.println(file3);

        //构造器三:
        File file4=new File(file3,"hi.txt");
        System.out.println(file4);
    }

file类提供了 java java中file类的功能_file类提供了 java_02

 2)文件重命名(也可以移动文件位置),要想保证返回true,需要file1在硬盘中是存在的,且file2不能在硬盘存在

@Test
    public void test4(){
        File file1 = new File("hello.txt");
        File file2 = new File("d:\\io\\hii.txt");
        boolean renameTo = file1.renameTo(file2);
        System.out.println(renameTo);
    }

 3)File类的获取功能

@Test
    public void test(){
        File file1 = new File("d:\\io\\hi.txt");
        File file2 = new File("src\\exer\\FileDemo.java");

        System.out.println(file1.getAbsoluteFile());
        System.out.println(file1.getPath());
        System.out.println(file1.getName());
        System.out.println(file1.getParent());
        System.out.println(file1.length());
        System.out.println(file1.lastModified());
        System.out.println(new Date(file1.lastModified()));

        System.out.println();

        System.out.println(file2.getAbsoluteFile());
        System.out.println(file2.getPath());
        System.out.println(file2.getName());
        System.out.println(file2.getParent());
        System.out.println(file2.length());
        System.out.println(file2.lastModified());
        System.out.println(new Date(file2.lastModified()));
    }

file类提供了 java java中file类的功能_文件目录_03

4)判断指定目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称

public class FindJPGFileTest {

	@Test
	public void test1(){
		File srcFile = new File("D:\\io");
		
		String[] fileNames = srcFile.list();
		for(String fileName : fileNames){
			if(fileName.endsWith(".jpg")){
				System.out.println(fileName);
			}
		}
	}

	@Test
	public void test2(){
		File srcFile = new File("d:\\io");
		
		File[] listFiles = srcFile.listFiles();
		for(File file : listFiles){
			if(file.getName().endsWith(".jpg")){
				System.out.println(file.getAbsolutePath());
			}
		}
	}

	/*
	 * File类提供了两个文件过滤器方法
	 * public String[] list(FilenameFilter filter)
	 * public File[] listFiles(FileFilter filter)

	 */
	@Test
	public void test3(){
		File srcFile = new File("d:\\io");
		
		File[] subFiles = srcFile.listFiles(new FilenameFilter() {
            
			@Override
            //dir为目录的file对象,name为文件名称
			public boolean accept(File dir, String name) {
				return name.endsWith(".jpg");
			}
		});
		
		for(File file : subFiles){
			System.out.println(file.getAbsolutePath());
		}
	}
	
}

5)遍历指定目录所有文件名称,包括子文件目录中的文件。

拓展1:并计算指定目录占用空间的大小
拓展2:删除指定文件目录及其下的所有文件

public class ListFilesTest {

    //打印指定目录所有文件名称
	public void printSubFile(File dir) {
		// 打印目录的子文件
		File[] subfiles = dir.listFiles();

		for (File f : subfiles) {
			if (f.isDirectory()) {// 文件目录
				printSubFile(f);
			} else {// 文件
				System.out.println(f.getAbsolutePath());
			}

		}
	}


	// 列出file目录的下级,如果它的下级还是目录,接着列出下级的下级,依次类推
	// 建议使用File类的File[] listFiles()
	public void listAllSubFiles(File file) {
		if (file.isFile()) {
			System.out.println(file);
		} else {
			File[] all = file.listFiles();
			// 如果all[i]是文件,直接打印
			// 如果all[i]是目录,接着再获取它的下一级
			for (File f : all) {
				listAllSubFiles(f);// 递归调用
			}
		}
	}

	// 拓展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的下一级
			// 累加all[i]的大小
			for (File f : all) {
				size += getDirectorySize(f);// f的大小;
			}
		}
		return size;
	}

	// 拓展2:删除指定的目录
	public void deleteDirectory(File file) {
		// 如果file是文件,直接delete
		// 如果file是目录,先把它的下一级干掉,然后删除自己
		if (file.isDirectory()) {
			File[] all = file.listFiles();
			// 循环删除的是file的下一级
			for (File f : all) {// f代表file的每一个下级
				deleteDirectory(f);
			}
		}
		// 删除自己
		file.delete();
	}

}