详解File类

File类

java.io.File类

如果希望在程序中操作文件和目录都可以通过File类来完成,File类能新建、删除、重命名文件和目录。

在API中File的解释是文件和目录路径名的抽象表示形式,即File类是文件或目录的路径,而不是文件本身,因此File类不能直接访问文件内容本身,如果需要访问文件内容本身,则需要使用输入/输出流。

构造方法
  • public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
  • public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
  • public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。
// 通过父路径和子路径字符串
 String parent = "d:\\aaa";
 String child = "bbb.txt";
 File file3 = new File(parent, child);

// 通过父级File对象和子路径字符串
File parentDir = new File("d:\\aaa");
String child = "bbb.txt";
File file4 = new File(parentDir, child);

1. 一个File对象代表硬盘中实际存在的一个文件或者目录。
2. 无论该路径下是否存在文件或者目录,都不影响File对象的创建。

常用方法

1. 获取文件和目录基本信息的方法

  • public String getName() :返回由此File表示的文件或目录的名称。

  • public long length() :返回由此File表示的文件的长度。

  • public String getPath() :将此File转换为路径名字符串。

  • public long lastModified():返回File对象对应的文件或目录的最后修改时间(毫秒值)

        File f = new File("d:/aaa/bbb.txt");     
        System.out.println("文件构造路径:"+f.getPath());
        System.out.println("文件名称:"+f.getName());
        System.out.println("文件长度:"+f.length()+"字节");
        System.out.println("文件最后修改时间:" + LocalDateTime.ofInstant(Instant.ofEpochMilli(f.lastModified()),ZoneId.of("Asia/Shanghai")));
        
输出结果:
文件构造路径:d:\aaa\bbb.java
文件名称:bbb.java
文件长度:636字节
文件最后修改时间:2019-07-23T22:01:32.065

length(),表示文件的长度。但是File对象表示目录,则返回值未指定。

2.各种路径问题

  • public String getPath() :将此File转换为路径名字符串。

  • public String getAbsolutePath() :返回此File的绝对路径名字符串。

  • String getCanonicalPath():返回此File对象所对应的规范路径名。

    File类可以使用文件路径字符串来创建File实例,该文件路径字符串既可以是绝对路径,也可以是相对路径。

  • 绝对路径:从盘符开始的路径,这是一个完整的路径。

  • 相对路径:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。

  • 规范路径:所谓规范路径名,即对路径中的“…”等进行解析后的路径名

    • window的路径分隔符使用“\”,而Java程序中的“\”表示转义字符,所以在Windows中表示路径,需要用“\”。或者直接使用“/”也可以,Java程序支持将“/”当成平台无关的路径分隔符。或者直接使用File.separator常量值表示。

    • 把构造File对象指定的文件或目录的路径名,称为构造路径,它可以是绝对路径,也可以是相对路径

    • 当构造路径是绝对路径时,那么getPath和getAbsolutePath结果一样

    • 当构造路径是相对路径时,那么getAbsolutePath的路径 = user.dir的路径 + 构造路径

    • 当路径中不包含"…“和”/开头"等形式的路径,那么规范路径和绝对路径一样,否则会将…等进行解析。路径中如果出现“…”表示上一级目录,路径名如果以“/”开头,表示从“根目录”下开始导航。

3.判断功能的方法

  • public boolean exists() :此File表示的文件或目录是否实际存在。
  • public boolean isDirectory() :此File表示的是否为目录。
  • public boolean isFile() :此File表示的是否为文件。

如果文件或目录存在,那么exists()、isFile()和isDirectory()都是返回true

4.创建删除功能的方法

  • public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
  • public boolean delete() :删除由此File表示的文件或目录。 只能删除空目录。
  • public boolean mkdir() :创建由此File表示的目录。
  • public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。

delete方法,如果此File表示目录,则目录必须为空才能删除。

5.目录操作

  • public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
  • public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
  • public File[] listFiles(FileFilter filter):返回所有满足指定过滤器的文件和目录。如果给定 filter 为 null,则接受所有路径名。否则,当且仅当在路径名上调用过滤器的 FileFilter.accept(java.io.File) 方法返回 true 时,该路径名才满足过滤器。如果当前File对象不表示一个目录,或者发生 I/O 错误,则返回 null。

强化练习:
(1)递归打印多级目录

@Test
	public void test3() {
		 File dir = new File("d:/study");
		 listSubFiles(dir);
	}
	public void listSubFiles(File dir) {
		if (dir != null && dir.isDirectory()) {
			File[] listFiles = dir.listFiles();
			if (listFiles != null) {
				for (File sub : listFiles) {
					listSubFiles(sub);//递归调用
				}
			}
		}
		System.out.println(dir);
	}

(2)递归打印某目录下(包括子目录)中所有满足条件的文件****列出"D:/study"下所有".java"文件

	public void listByFileFilter(File file) {
		if (file != null && file.isDirectory()) {
			File[] listFiles = file.listFiles(new FilenameFilter() {

				@Override
				public boolean accept(File dir, String name) {
					return name.endsWith(".java") || new File(dir,name).isDirectory();
				}
			});
			if (listFiles != null) {
				for (File sub : listFiles) {
					if(sub.isFile()){
						System.out.println(sub);
					}else
						listByFileFilter(sub);
				}
			}
		}
	}

(3)递归求目录总大小

public long getLength(File dir){
		if (dir != null && dir.isDirectory()) {
			File[] listFiles = dir.listFiles();
			if(listFiles!=null){
				long sum = 0;
				for (File sub : listFiles) {
					sum += getLength(sub);
				}
				return sum;
			}
		}else if(dir != null && dir.isFile()){
			return dir.length();
		}
		return 0;
	}

(4)递归删除非空目录
如果目录非空,连同目录下的文件和文件夹一起删除

public void forceDeleteDir(File dir) {
		if (dir != null && dir.isDirectory()) {
			File[] listFiles = dir.listFiles();
			if(listFiles!=null){
				for (File sub : listFiles) {
					forceDeleteDir(sub);
				}
			}
		}
		dir.delete();
	}

案例:复制一个文件夹到另外一个文件夹中

@Test
    public void cutFile() throws IOException {
        File srcFile = new File("testIO");
        File destFile = new File("test");
        copyFile(srcFile, destFile);
    }

    public static void copyFile(File srcFile, File destFile) throws IOException {
        if (srcFile.isFile()) {
            String s = destFile.getPath() + "/" + srcFile.getName();
            File file = new File(s);
            file.createNewFile();
            copyContent(srcFile, file);
        } else if (srcFile.isDirectory()) {
            String dirs = destFile.getPath() + "/" + srcFile.getName();
            File file = new File(dirs);
            file.mkdir();
            for (File listFile : srcFile.listFiles()) {
                copyFile(listFile, file);
            }
        }
    }

    public static void copyContent(File srcFile, File destFile) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
        int len;
        byte[] by = new byte[8 * 1024];
        while ((len = bis.read(by)) != -1) {
            bos.write(by, 0, len);
        }
        bos.close();
        bis.close();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力奋斗的JAVA小余

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值