java之File类
一.File类
File类是java.io包下代表与平台无关的文件和目录,也就是说,如果希望在程序中操作文件和目录,都可以通过File类来完成。不管是文件还是目录都是使用File来操作的,File能新建、删除、重命名文件和目录,File不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。
二.File类的构造方法
构造方法 | 说明 |
---|---|
public File(String pathname) | 根据一个路径得到file对象 |
public File(String parent, String child) | 根据一个目录和一个子文件/目录得到file对象 |
public File(File parent,String child) | 根据父File对象和一个子文件/目录得到File对象 |
1.File可以使用文件路径字符串来创建File实例,该文件路径字符串既可以是绝对路径,也可以是相对路径。
- 路径以盘符开始:绝对路径C:\a.txt
- 路径不以盘符开始:相对路径 a.txt
2.构造函数只是创建了一个File对象,并没有对文件做读取的操作,因此,即使文件是错误的,也可成功的创建对象。
3.构造方法具体说明:构造方法一: public File(String pathname)
通过给定的字符串路径(一般是文件的绝对路径)转为抽象路径名来创建File实例
//把e:\\demo\\a.txt封装成一个File对象。
File file = new File("E:\\demo\\a.txt");
构造方法二:public File(String parent, String child)
从父路径名字符串和子路径名字符串(一般是相对父路径名的相对路径)创建新的File类。
- 如果子路径为null,会抛出NullPointerException空指针异常。
- 父路径为null时,会以子路径作为绝对路径创建实例。
- 当父路径不为null时,会以父路径作为目录,子路径作为父路径下的目录或者文件名,最后得到的实例对象的路径就是父路径和子路径的组合。
//把e:\\demo\\a.txt封装成一个File对象。
File file1 = new File("E:\\demo","a.txt");
构造方法三: public File(File parent,String child)
通过父路径实例对象和子路径字符串创建新的File实例,等同于把父路径字符串创建File实例。
//public File(File parent,String child)
File file2 = new File("e:\\demo");
File file3 = new File(file2,"a.txt");
三.使用File类的创建功能
方法 | 说明 |
---|---|
public boolean createNewFile() | 创建文件 |
public boolean mkdir() | 创建单级文件夹,即此抽象路径名指定的目录。如果存在这样的文件夹就不创建了 |
public boolean mkdirs() | 创建多级文件夹,如果父文件夹不存在,会帮你创建多级文件夹 |
方法一:创建单级文件夹 boolean mkdir()
试图创建一个File对象所对应的目录,如果创建成功,则返回true;否则返回false。调用该方法时File对象必须对应一个路径,而不是一个文件。
//需求:在E盘目录下创建一个文件夹demo
File file = new File("E:\\demo");
System.out.println(file.mkdir());
注意:这个方法只能创建单级文件夹,示例如下:
//下面这种做法是错误的
//在E盘目录test下创建aaa目录
// File file4 = new File("e:\\test\\aaa");
// System.out.println(file4.mkdir());
//正确做法
File file5 = new File("e:\\test");
File file6 = new File("e:\\test\\aaa");
System.out.println(file5.mkdir());
System.out.println(file6.mkdir());
方法二:创建文件public boolean createNewFile()
当此File对象所对应的文件不存在时,该方法将新建一个该File对象所指定的新文件,如果创建成功则返回true;否则返回false。
//需求:我要在E盘目录demo下创建一个文件e.txt
File file2 = new File("E:\\demo\\a.txt");
System.out.println(file2.createNewFile());
注意:要想在某个目录下创建内容,该目录必须存在
File file3 = new File("e:\\test\\b.txt");
System.out.println(file3.createNewFile());
方法三:创建l多级文件夹 public boolean mkdirs()
创建此抽象路径名指定的目录,包括所有必需但不存在的父目录
File file7 = new File("e:\\aaa\\bbb\\ccc\\ddd");
System.out.println(file7.mkdirs());
File file8 = new File("e:\\liuyi\\a.txt");
System.out.println(file8.mkdirs());
四.File类的删除功能public boolean delet()删除File类所对应的的文件或路径
- A:如果创建的文件夹忘记写路径,那么默认在项目路径下
//创建文件
File file = new File("e:\\a.txt");
System.out.println(file.createNewFile());
//如果创建的文件夹忘记写路径,那么默认在项目路径下
File file1 = new File("a.txt");
System.out.println(file1.createNewFile());
File file2 = new File("aaa\\bbb\\ccc");
System.out.println(file2.mkdirs());
如图,在没有指定文件夹路径时,默认在项目路径下创建文件夹
- B:java中的删除不走回收站,所以用的时候需谨慎。
- C:要删除文件夹,该文件夹内不可以有文件夹
public static void main(String[] args) throws IOException
{
//创建文件
File file = new File("e:\\a.txt");
System.out.println(file.createNewFile());
//如果创建的文件夹忘记写路径,那么默认在项目路径下
File file1 = new File("a.txt");
System.out.println(file1.createNewFile());
File file2 = new File("aaa\\bbb\\ccc");
System.out.println(file2.mkdirs());
//删除功能:删除a.txt这个文件
File file3 = new File("a.txt");
System.out.println(file3.delete());
//删除功能:删除ccc这个文进夹
File file4 = new File("aaa\\bbb\\ccc");
System.out.println(file4.delete());
//删除功能:删除aaa文件夹
// File file5 = new File("aaa");
// System.out.println(file5.delete());
//出错,因为文件夹内有文件夹
//先删除aaa文件夹,再删除bbb文件夹
File file6 = new File("aaa\\bbb");
File file7 = new File("aaa");
System.out.println(file6.delete());
System.out.println(file7.delete());
}
五.File类的重命名功能boolean renameTo(File newName)
重命名此File对象所对应的文件或目录,如果重命名成功,则返回true;否则返回false。
- A:如果文件名相同,就是改名
public static void main(String[] args)
{
//创建一个文件对象
File file = new File("林青霞.jpg");
//修改这个文件的名称为东方不败.jpg
File newfile = new File("东方不败.jpg");
System.out.println(file.renameTo(newfile));
}
- B:如果路径名不同,就是剪切加改名(相当于从一个位置到另一个位置,并且改了名字)
public static void main(String[] args)
{
File file2 = new File("东方不败.jpg");
File newfile1 = new File("e:\\林青霞.jpg");
System.out.println(file2.renameTo(newfile1));
}
如图: 从项目路径下剪切粘贴到E盘,并且改了名。
六.File类的判断功能
方法 | 说明 |
---|---|
public boolean isDirectory() | 判断是否是目录 |
public boolean isFile() | 判断是否是文件 |
public boolean exists() | 判断是否存在 |
public boolean canRead() | 判断是否可读 |
public boolean canWrite() | 判断是否可写 |
public boolean isHidden() | 判断是否隐藏 |
public static void main(String[] args)
{
//创建文件对象
File file = new File("a.txt");
System.out.println(file.isDirectory());//false
System.out.println(file.isFile());//true
System.out.println(file.exists());//true
System.out.println(file.canRead());//true
System.out.println(file.canWrite());//true
System.out.println(file.isHidden());//false
}
七.File类的获取功能
方法 | 说明 |
---|---|
public String getAbsolutePath() | 获取此File对象对应的绝对路经 |
public String getPath() | 获取此File对象对应的相对路径 |
public String getName() | 获取此File对象表示的文件名或路径名 |
public long length() | 获取文件内容的长度 |
public long lastModified() | 获取文件的最后一次修改时间,毫秒值 |
绝对路径:以盘符开始的路径。
相对路径:相对于某个位置,在eclipse下是指相对于当前项目路径。
public static void main(String[] args)
{
//创建文件对象
File file = new File("demo\\test.txt");
System.out.println(file.getAbsolutePath());
System.out.println(file.getPath());
System.out.println(file.getName());
System.out.println(file.length());
System.out.println(file.lastModified());
//1551960596595
Date d = new Date(1551960596595L);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:m:ss");
String s = sdf.format(d);
System.out.println(s);
}
结果:
F:\java\刘意\day19_File-2\demo\test.txt
demo\test.txt
test.txt
0
0
2019-03-07 20:9:56
八.File类的高级获取功能
方法 | 说明 |
---|---|
String[] list() | 获取File对象的所有子文件名和路径名,返回String数组。 |
File[] listFiles() | 获取File对象的所有子文件和路径,返回File数组。 |
public String[] list()
获取指定目录下的所有文件或者文件夹的名称数组
//指定一个目录
File file = new File("e:\\");
//public String[] list()
String[] str = file.list();
for(String s:str)
{
System.out.println(s);
}
public File[] listFile()
取指定目录下的所有文件或者文件夹的File数组
//指定一个目录
File file = new File("e:\\");
//public File[] listFile()
File[] fileArray = file.listFiles();
for(File f :fileArray)
{
System.out.println(f.getName());
}
九.文件过滤器public String[] list(FilenameFilter filter)
public File[] listFiles(FilenameFilter filter)
参数是一个接口,需要的是具体类
- A:File类的list()方法中可以接收一个FilenameFilter参数,通过该参数可以只列出符合条件的文件.
- B:FilenameFilter接口里包含了一个accept(File dir, String name)方法,该方法将依次对指定File的所有子目录或者文件进行迭代,如果该方法返回true,则list()方法会列出该子目录或者文件。
例题:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出此文件名称
public static void main(String[] args)
{
//封装E盘目录
File file = new File("e:\\");
//获取该目录下所有文件或者文件夹的数组
//public String[] list()
String[] str = file.list(new FilenameFilter()
{
@Override
public boolean accept(File dir, String name)
{
//File的构造方法3来创建问文件对象
File file = new File(dir,name);
//判断是否是文件
boolean flag = file.isFile();
//判断是否以.jpg结尾
boolean flag2 = name.endsWith(".jpg");
return flag&&flag2;
}
} );
for(String s :str)
{
System.out.println(s);
}
}
十.递归
方法定义中调用方法本身的现象
注意事项:
- A:递归一定要有出口,否则就是死出口
- B:递归的次数不能太多,否则就内存溢出
- C:构造方法不能递归使用
例题:请用代码求5的阶乘
public static void main(String[] args)
{
int jc = 1;
for(int x=2;x<=5;x++)
{
jc *= x;
}
System.out.println(jc);
System.out.println(jieCheng(5));
}
/*
* 做递归要写一个方法:
* 返回值类型:int
* 参数列表:int n
* 出口条件:
* if(n==1){return 1;}
* 规律:
* if(n!==1){return n*方法名(n-1);}
*/
public static int jieCheng(int n)
{
if(n == 1)
{
return 1;
}
else
{
return n*jieCheng(n-1);
}
}
例题:递归删除带内容的目录demo
public static void main(String[] args)
{
//封装目录
File scrFolder = new File("demo");
//递归实现
deleteFolder(scrFolder);
}
private static void deleteFolder(File scrFolder)
{
//获取该目录下所有的文件或文件夹的File数组
File[] fileArray = scrFolder.listFiles();
//遍历该File数组,得到每一个File对象
if(fileArray != null)
{
for(File file:fileArray)
{
//判断给File对象是否是文件夹
if(file.isDirectory())
{
//是:回到B
deleteFolder(file);
}
else
{
//否:就删除
//删除文件
System.out.println(file.getName()+"--"+file.delete());
}
}
//删除文件夹
System.out.println(scrFolder.getName()+"--"+scrFolder.delete());
}
}
例题:把E:\JavaSE目录下所有的java结尾的文件的绝对路径输出在控制台
public static void main(String[] args)
{
//封装目录
File scoFolder = new File("E:\\JavaSE");
//递归功能实现
getAllFilePaths(scoFolder);
}
private static void getAllFilePaths(File scoFolder)
{
//获取该目录下所有的文件或者文件夹的File数组
File[] fileArray = scoFolder.listFiles();
//遍历该File数组,得到每一个File对象
for(File file:fileArray)
{
//判断该File对象是否是文件夹
if(file.isDirectory())
{
getAllFilePaths(file);
}
else
{
if(file.getName().endsWith(".java"))
{
//输出文件的绝对路径
System.out.println(file.getAbsolutePath());
}
}
}
}