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流的学习,手打不易,请各位客官多多点赞评论呦 ~ ~