File类
1.什么是File类
File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹)
File是用来表示文件和文件夹的类。
2.为什么要使用File类
在开发中,创建文件、删除文件、修改文件的属性时经常会用到的本类。
并未涉及到写入或读取文件内容,如需要读取或写入文件内容,必须使用IO流来完成
说明:File本身的对文件的一些属性的操作用File类。
涉及到File内容的操作,如:读写数据,就要用到IO流。
3.怎么用File类
3.1 创建File类的实例
1. 如何创建File类的实例
- File(String filePath)
- File(String parentPath,String childPath)
- File(File parentFile,String childPath)
2.** 文件的路径问题**(浅层次的概述)
相对路径:相较于某个路径下,指明的路径。
绝对路径:包含盘符在内的文件或文件目录的路径
3. 路径分隔符
windows和DOS: \\\\
Unix和Linux: /
4. 创建File类的实例代码
//构造器1:File(String filePath)
File file = new File("HelloWorld.txt");//在此module下的相对路径
File file1 = new File("C:\\Users\\Administrator\\Desktop\\Hello.txt");//绝对路径
//构造器2:File(String parentPath,String childPath)
File file2 = new File("C:\\Users\\Administrator", "Desktop");
//构造器3:File(File parentFile,String childPath)
File file3 = new File(file2, "Hello.txt");
3.2 File类的常用方法:
1. 获取文件的信息:
- String getAbsolutePath():获取绝对路径
- String getPath():获取路径
- String getName():获取名称
- String getParent():获取上层文件目录路径。若无,返回null
- long length():获取文件长度(即:字节数)。不能获取文件夹的大小。
- long lastModified():获取最后一次的修改时间,毫秒值
//获取文件基本信息示例代码
@Test
public void test1(){
File file1 = new File("hello.txt");
File file2 = new File("d:\\develop\\hi.txt");
System.out.println(file1.getAbsolutePath());
System.out.println(file1.getPath());
System.out.println(file1.getName());
System.out.println(file1.getParent());
System.out.println(file1.length());
System.out.println(new Date(file1.lastModified()));
}
2. 获取文件目录下的所有文件或文件夹:
-
String[] list() :获取指定目录下的所有文件或者文件目录的名称数组
-
File[] listFiles() :获取指定目录下的所有文件或者文件目录的File数组
//获取指定文件路径下所有文件或文件夹的名称或对象示例代码 @Test public void test2(){ File file = new File("D:\\develop"); //获取路径下所有文件的名称:String[] list() String[] list = file.list(); for(String s : list){ System.out.println(s); } System.out.println(); //获取路径下所有文件的File对象:File[] listFiles() File[] files = file.listFiles(); for(File f : files){ System.out.println(f); } }
3. 重命名[+转移]:
-
boolean renameTo(File dest):把文件重命名并转移到指定的文件路径。
比如:file1.renameTo(file2)为例:
要想保证返回true,需要file1在硬盘中是存在的,且file2在硬盘中是不存在的。
//重命名的示例代码 @Test public void test3(){ File file1 = new File("hello.txt"); //要存在(路径要正确!) File file2 = new File("D:\\io\\hi.txt");//不能存在 boolean renameTo = file1.renameTo(file2); System.out.println(renameTo); }
4. 判断功能:
- boolean isDirectory():判断是否是文件目录
- boolean isFile():判断是否是文件
- boolean exists():判断是否存在
- boolean canRead():判断是否可读
- boolean canWrite():判断是否可写
- boolean isHidden():判断是否隐藏
//判断功能示例代码
@Test
public void test4(){
File file1 = new File("hello.txt");
System.out.println(file1.isDirectory()); //false
System.out.println(file1.isFile()); //true
System.out.println(file1.exists()); //true
System.out.println(file1.canRead()); //true
System.out.println(file1.canWrite()); //false
System.out.println(file1.isHidden()); //false
}
5.创建与删除功能:
创建硬盘中对应的文件或文件目录
-
boolean createNewFile():>创建文件。若文件存在,则不创建,返回false
-
boolean mkdir():创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
-
boolean mkdirs():创建文件目录。如果此文件目录存在,就不创建了。 如果上层文件目录不存在,一并创建。
删除磁盘中的文件或文件目录
-
boolean delete():删除文件或者文件夹。
删除注意事项:1)对文件夹来说,要想删除成功,其目录下不能有子目录或文件。(一次只能删除一个文件或文件夹) 2)Java中的删除不走回收站。
//创建和删除文件示例代码
@Test
public void test5() throws IOException {
File file1 = new File("hi.txt");
if(!file1.exists()){
//文件的创建,如果文件已存在,则创建失败。
file1.createNewFile();
}else{//文件存在
file1.delete();
}
}
//创建文件夹
@Test
public void test6(){
//文件目录的创建:
//1)创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
File file1 = new File("d:\\io\\io1\\io2");
boolean mkdir = file1.mkdir();
//2)创建文件目录。如果此文件目录存在,就不创建了。如果上层文件目录不存在,一并创建。
File file2 = new File("d:\\io\\io1\\io4");
boolean mkdir1 = file2.mkdirs();
//要想删除成功,io1文件目录下不能有子目录或文件
File file3 = new File("D:\\io\\io1");
System.out.println(file3.delete());
}
4.课后练习
课后练习1:文件[夹]的创建与删除
创建和删除某个路径下的文件或文件夹。
@Test
public void test1() throws IOException {
File file = new File("hello.txt");
//创建文件
boolean newFile = file.createNewFile();
System.out.println(newFile);
//删除文件
boolean delete = file.delete();
System.out.println(delete);
}
课后练习2:查找指定后缀名的文件
判断指定目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称。
//方法一
@Test
public void test2() {
File file = new File("C:\\Users\\Administrator\\IdeaProjects\\TestGithub");
String[] list = file.list();
for (String s : list) {
if(s.endsWith(".jpg")){
System.out.println(s);
}
}
File[] files = file.listFiles();
for (File file1 : files) {
if(file.getName().endsWith(".jpg")){
System.out.println(files);
}
}
}
/**
* 方法二:使用文件过滤器直接过滤文件
* File类提供了两个文件过滤器方法
* String[] list(FilenameFilter filter)
* File[] listFiles(FileFilter filter)
*/
@Test
public void test3() {
File file = new File("C:\\Users\\Administrator\\IdeaProjects\\TestGithub");
String[] files = file.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".jpg");
}
});
for (String s : files) {
System.out.println(s);
}
}
课后练习3:遍历所有文件…
遍历指定目录所有文件名称,包括子文件目录中的文件。
public static void main(String[] args) {
// 递归:文件目录
//打印出指定目录所有文件名称,包括子文件目录中的文件
// 1.创建目录对象
File dir = new File("C:\\Users\\Administrator\\IdeaProjects\\TestGithub");
// 2.打印目录的子文件
printSubFile(dir);
//3.打印目录的下一级内容
listSubFiles(dir);
//4.打印目录的子文件(与 printSubFile(dir)基本类似)
listAllSubFiles(dir);
}
private static int length=0;
public static void printSubFile(File dir) {
length++;
// 打印目录的子文件
File[] subfiles = dir.listFiles();
for (File f : subfiles) {
for (int i = 1; i < length; i++) {
System.out.print("\t");
}
if (f.isDirectory()) {// 文件目录
System.out.println(f.getName());
printSubFile(f);
} else {// 文件
System.out.println(f.getName());
}
}
length--;
}
// 方式二:循环实现
// 列出file目录的下级内容,仅列出当前文件夹下的内容(文件或文件夹)
// 使用File类的String[] list()比较简单
public static void listSubFiles(File file) {
if (file.isDirectory()) {
//获取的是相对路径
String[] all = file.list();
for (String s : all) {
System.out.println(s);
}
} else {
System.out.println(file + "是文件!");
}
}
// 列出file目录的下级,如果它的下级还是目录,接着列出下级的下级,依次类推
// 建议使用File类的File[] listFiles()
public static 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: 求指定目录所有文件的大小
// 拓展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:删除指定的目录的所有文件
// 拓展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();
}