Java基础(25)——File类知识详解及示例分析


版权声明

  • 本文原创作者:清风不渡
  • 博客地址:https://blog.csdn.net/WXKKang

一、文件

  我们为什么要学习文件(File)呢,是因为在I/O处理中,最常见的就是对文件的操作了,也就是对操作系统中的目录和文件的操作。在Java API中,我们使用File类抽象了目录和文件的行为

1、文件和File类的关系
(1)文件

  在一个程序运行的时候,在内存中存储的变量、数据和对象都是暂时的,当程序终止时它们就会丢失。那么,如果我们需要将他们永久保存的时候该怎么办呢?为了能够永久的保存我们创建的数据,就需要将它们存储到移动硬盘等的文件中。由于数据存储在文件里,我们就需要学习如何在程序中操作文件,例如:创建新的文件、查看文件属性、删除文件、重命名文件、查找文件等等操作

(2)File和文件、目录

  当然,Java发展了这么多年,聪明的前辈们已经将常用的方法等已经封装成了对应的类,那么对应我们的文件也是有封装的,即File类
  File类封装了文件系统中的目录和文件,它是一个抽象概念。File类只是用来操作文件本身及其属性,并不会操作文件中的内容,它的内容是使用I/O流实现的文件读写的
  创建一个File类对象并不表示在机器中一定有对应的目录或文件,需要通过exists()方法判断目录或者文件是否真的存在,在目录或文件已存在的情况下(即exists方法返回true值),使用isDirectory或isFile函数来判断该File对象是表示的是一个目录或文件,具体使用方法及用途我们下面再说,先来看看File类中包含了什么东西吧 ~ ~

1、File类

  通过File类可以得到目录或文件的引用对象,并且支持对目录或者文件进行操作

(1)创建File对象

  在创建File对象之前,我们需要了解一个概念,那就是——文件路径
  每个目录或者文件都有一个文件路径,用于确定目录或文件在文件系统中的位置,这就是文件的文件路径
  路径分割符
  各级目录之间使用路径分割符分开。不同的操作平台分割符是不同的,在Windows系统中分割符为“\”,而在Unix/Linux中为“/”。更通用的做法是使用File.separatorChar或者File.separator来获取当前操作平台的分割符样式,它可以根据运行系统动态的得到本地操作系统的路径分割符,例如:

new File(“c:”+File.separatorChar+“a.txt”);

  注意:如果需要在路径字符串中使用“\”,则需要进行转义,即写为“\”才可以
  绝对路径和相对路径
  路径又分为绝对路径和相对路径,绝对路径是从根目录开始的完整路径。Linux平台中根目录是“/”,绝对路径名由根目录开始,例如“/user/bin/ls”。Windows平台中根目录是驱动器名(如:C:),绝对路径由驱动器号开始,例如“C:\Document\abc.txt”
  相对路径是相对于某个位置的路径,相对目录一般以(.)或(…)开始,Linux平台和Windows平台的规则是相同的,例如“./tem/abc.tmp”

(2)构造函数

在这里插入图片描述
  通过构造函数我们就可以创建File类的实例(对象),常见的创建方法有以下几种:

//为一个绝对路径的文件创建File对象
String path = "c:/a.txt";
File file = new File(path);

//为一个绝对路径的目录创建File对象
String path = "c:/demo";
File file = new File(path);

//为一个相对路径的文件创建File对象
File file = new File("a.txt");
System.out.println(file.getAbsolutePath()); //获取该文件的绝对路径
(3)新建文件或目录

  在创建了File类的对象之后,我们就可以新建文件或目录了,会用到File类中的一些函数,常用的如下图:
在这里插入图片描述
  有一个问题需要说明一下,可能有些同学会有这样一个疑惑:我不是创建了一个文件类的对象了吗?为什么还要去创建文件或目录呢?这里需要搞清它们的区别——创建一个File对象,并不是创建一个新的文件和目录,它只是创建了一个文件或目录的引用对象,即我们在创建了一个File对象之后,并不能保证文件或目录真实存在。因此,如果指定的路径不存在(即没有这个文件或文件夹),创建File对象时不会抛出异常,但是调用file.exists()方法将返回false,即说明该文件或文件夹不存在
  这样,在我们创建了一个File对象之后,我们可以使用file.createNewFile();函数创建一个新的文件,或者使用file.mkdir();或file.mkdirs();创建新的目录,或者使用file.renameTo(File dest)方法来重命名文件或目录,举例如下:
  首先,我在D盘下手动创建了一个文件夹:FileDemo,如下:
在这里插入图片描述
  然后,我写了这样一段代码:
  创建一个File对象,如果该对象所对应的文件或目录不存在,则判断它为文件或是目录,如果为文件的话则新建它,如果为目录的话判断它为单一目录还是复合目录,然后进行对应的新建,如果该对象对应的文件或目录存在的话则打印出它的目录并提示,代码如下:

package qfbd.com;
/*
	原创作者:清风不渡
	博客地址:https://blog.csdn.net/WXKKang
*/
import java.io.File;

public class Demo {

	public static void main(String[] args) throws Exception {
		int count = 0;
		String path = "D:"+File.separatorChar+"FileDemo"+File.separatorChar+"demo.txt";
		File file = new File(path);
		if (file.exists()) {
			System.out.println("该文件已存在");
			System.out.println(file.getAbsolutePath());
			if(file.isFile()){
				System.out.println("该文件是以文件的形式保存在驱动器中的");
			}else{
				System.out.println("该文件是以目录的形式保存在驱动器中的");
			}
		}else{
			System.out.println("该文件或目录不存在");
			boolean contains = path.contains(".");
			if(contains){
				boolean createNewFile = file.createNewFile();
				System.out.println("该文件不存在,新建是否成功:"+createNewFile);
			}else{
				String pathseparatorchar = ""+File.separatorChar;
				while(path.contains(pathseparatorchar)){
					path = path.substring(path.indexOf(pathseparatorchar)+1);
					++count;
				}
				if(count>1){
					boolean mkdirs = file.mkdirs();
					System.out.println("该目录为复合目录,创建是否成功:"+mkdirs);
				}else{
					boolean mkdir = file.mkdir();
					System.out.println("该目录为单一目录,创建是否成功:"+mkdir);
				}
				
			}
			
		}
	}	
	
}

  第一次执行结果如下:
在这里插入图片描述
  文件新建成功,入下图:
在这里插入图片描述
  第二次执行结果如下:

(4)与文件相关的函数

  File类中常用的与文件相关的函数如下:
在这里插入图片描述

  示例代码如下:

package qfbd.com;
/*
	原创作者:清风不渡
	博客地址:https://blog.csdn.net/WXKKang
*/
import java.io.File;
import java.io.IOException;
import java.sql.Date;
import java.text.SimpleDateFormat;

public class Demo {

	public static void main(String[] args) throws IOException {
		String path = "D:"+File.separatorChar+"FileDemo"+File.separatorChar+"demo.txt";
		File file = new File(path);
		//创建文件
		boolean createNewFile = file.createNewFile();
		System.out.println("创建文件是否成功:"+createNewFile);
		if(file.exists()&&file.isFile()){
			System.out.println("文件名称:"+file.getName());
			System.out.println("是否隐藏文件:"+file.isHidden());
			System.out.println("是否绝对路径"+file.isAbsolute());
			System.out.println("获取路径"+file.getPath());
			System.out.println("获取绝对路径"+file.getAbsolutePath());
			System.out.println("获取文件大小(字节为单位):"+file.length());
			System.out.println("获取文件的父路径:"+file.getParent());
			
			//获取文件的最后更改时间
			long lastModified = file.lastModified();
			Date date = new Date(lastModified);
			SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			System.out.println("最后一次更改时间为:"+simpleDateFormat.format(date));
			
			
		}
	}	
	
}

  执行结果如下:
在这里插入图片描述

(5)与目录相关的函数

  File类中常用的与目录相关的函数如下:
在这里插入图片描述
  需要注意的是,获取文件夹大小不能使用file.length();方法!!!
  常用方法示例如下:

package qfbd.com;
/*
	原创作者:清风不渡
	博客地址:https://blog.csdn.net/WXKKang
*/
import java.io.File;

public class Demo {

	public static void main(String[] args) {
		//获取操作平台所有的根目录
		System.out.println("---------1、获取操作平台所有的根目录-----------");
		File[] listRoots = File.listRoots();
		for(File file1 : listRoots){
			System.out.println("根目录:"+file1);
		}
		
		//获取目录下所有文件及目录的名称_不区分文件及目录
		System.out.println("---------2、获取目录下所有文件及目录的名称_不区分文件及目录-----------");
		File file2 = new File("D:"+File.separatorChar+"FileDemo");
		String[] list = file2.list();
		for(String fileName : list){
			System.out.println(fileName);
		}
		
		//获取目录下所有文件及目录的名称_区分文件及目录
		System.out.println("---------3、获取目录下所有文件及目录的名称_区分文件及目录-----------");
		File[] listFiles = file2.listFiles();
		for(File file3 : listFiles){
			if(file3.isDirectory()){
				System.out.println("目录:"+file3.getName());
			}else{
				System.out.println("文件:"+file3.getName());
			}
		}
		
		//获取文件或文件夹大小
		System.out.println("---------4、获取文件夹大小-----------");
		Demo demo = new Demo();
		long fileLength = demo.getFileLength(file2);
		if(file2.isDirectory()){
			System.out.println("该目录的大小为:"+fileLength+"字节");
		}else{
			System.out.println("该文件的大小为:"+fileLength+"字节");
		}
		
		//删除文件夹
		String dirPath = "D:"+File.separatorChar+"FileDemo";
		demo.deleteDir(dirPath);
		
	}	
	
	public long getFileLength(File file){
		long length = 0;
		if(file.isFile()){
			length = file.length();
			return length;
		}
		File[] fileArray = file.listFiles();
		if(fileArray != null){
			for(File f : fileArray){
				length += getFileLength(f);
			}
		}
		return length;
	}
	
	public void deleteDir(String dirPath){
		File dir = new File(dirPath);
		File[] listFiles = dir.listFiles();
		for(File file : listFiles){
			if(file.isDirectory()){
				Demo demo = new Demo();
				demo.deleteDir(file.getAbsolutePath());
			}else{
				file.delete();
			}
		}
		dir.delete();
	}
}

  执行结果如下:
在这里插入图片描述
  关于File类的内容就这么多,下篇讲述的是I/O流的学习,手打不易,请各位客官多多点赞评论呦 ~ ~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值