目录
一、什么是File类
Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。File类在java.io包里。
说的通俗易懂就是,file就是指一个文件或文件夹,文件及文件夹的创建、删除需要用到它,可以通过他获取文件的各种信息,但是不能获取文件的内容!!要获取文件的内容需要用到其他的类。
二、File类的常用操作
1. 创建一个File实例
File共有4个构造方法,都可以用来创建对象,在这里我们只介绍最简单最常用的一种。
在括号内直接输入文件目录的路径,第一行的路径为相对路径,可以直接写文件名,但是文件要放在该项目的文件夹下,否则是无法找到该文件的;第二行为绝对路径,即无论文件放在何处,都能找到。而此时的f或者f1指的就是路径对应下的文件。
注意:在Java中‘\’是转义符,用\\或/表示文件的分隔符
2. File中的get方法
File类中有很多get方法,但是其最终返回的结果都是文件(夹)的名称或路径,接下来就让我们窥探一二:
(1)getName():此方法用来获取当前的文件名或目录名(文件夹名)
(2)getPath():获取当前文件或文件夹的路径,也就是new file中填写的路径
(3)getAbsolutePath():获取当前文件或文件夹的绝对路径
(4)getParent():获取当前文件获取文件夹的父级路径,即其上一级文件夹的路径
具体例子如下所示:
通过结果可以看到在获取f的父级路径时返回值为空,这是因为我们在new file的时候填写的不是绝对路径,系统找不到它的父级路径,因此返回null。
3. 文件或文件夹的重命名
重命名文件或文件夹时我们使用 renameTo() 方法。
如下图显示,在我们的文件夹下有一个名为text的txt文件,将其重命名为t,操作如下:
我们可以观察其前后变化
4. 判断当前文件或文件夹是否存在
我们利用exists()方法来判断当前文件或文件夹是否存在,如果存在则返回true,不存在则返回false。
在这里由于我们之前重命名了text.txt文件,所以现在是不存在的,故返回false。
5. 判断文件(夹)是否可读可写
由于某些文件权限的设置,如果我们需要对文件内容进行操作时,就要先判断该文件是否可读或可写,提前避免因读取或写入失败导致的程序异常。
判断是否可读用canRead();判断是否可写用canWrite()。
这里可以看出该文件即可读也可写,当我们在文件属性中修改其权限后得到输出如下:
6. 判断当前对象是文件还是文件夹
判断是否是文件:isFile()
判断是否是文件夹:isDirectory()
7. 获取文件或文件夹的长度
length()方法可以获得当前对象的长度,单位为字节,例如获得text文件的长度:
8. 文件(夹)的创建与删除
文件和文件夹删除都使用delete()方法,如下:
创建文件用createNewFile();创建单层文件夹用mkdir();创建多级文件夹用mkdirs().
如下:判断一个文件是否存在,如果不存在则创建
分别创建一个单层目录和多层目录,单层目录命名为A,多层目录命名为B\C\D
9. 获取当前文件夹下所有目录名称
利用list()方法我们可以获取当前文件夹下所有文件夹和文件的名称,但是只能过去这一层,无法再深入获取该文件夹目录下文件夹的内容。
刚刚我们创建了一个B文件夹,其目录下有C文件夹,我们再手动创建一个text1.txt文件,并用此方法获取。
三、综合实战:获取指定目录下所有文件或文件夹的名称
我们选择已经知道 list()法可以获取当前目录下所有文件和文件夹的名称,但是无法获取文件夹下的文件夹中的内容,所以我们要设计一个算法获取指定目录下所有文件和文件夹的名称并输出其绝对路径,无论层级有多深。
算法思想:
首先我们需要判断当前目录是文件还是文件夹,如果是文件则不进行操作,如果是文件夹就获取该文件夹下的目录名称,并再对这些目录进行判断,如此反复迭代,直至最后一层。
由于我们之前已经创建了B\\C\\D这样的多层目录,并且在B层文件夹下添加了text1.txt文件,我们再随机创建一些文件和文件夹用来实验验证。
/*
* 练习:遍历某个目录下的所有文件,无论层级多深
* 需要用递归
* 主要方法如下
*/
public void traverse(File file){
if(file.isFile()) {
System.out.println("File:"+file.getAbsolutePath());
}else {
System.out.println("Folder:"+file.getAbsolutePath());
File[] f = file.listFiles();
if(f != null && f.length > 0) {
for(File fs : f) {
traverse(fs);
}
}
}
}
四、所有代码
package io_lx;
/*
* File只能操作文件本身:新建、删除、重命名文件和目录
* 但是不能操作文件内容,如果需要,则要使用输入输出流
*/
import java.io.File;
import java.io.IOException;
public class File_lx {
public static void main(String[] args) {
//此时对象f就是text.txt文件
//在Java中‘\’是转义符,用\\或/表示文件的分隔符
File f = new File("text.txt");
File f1 = new File("D:/JavaProgram/Study");
System.out.println(f.getName());//获取当前文件名
System.out.println(f1.getName());//获取当前目录名
System.out.println("----------------------");
System.out.println(f.getPath());//获取文件或文件夹路径,就是new file的路径
System.out.println(f1.getPath());
System.out.println("----------------------");
System.out.println(f.getAbsolutePath());//获取当前文件的绝对路径
System.out.println(f1.getAbsolutePath());
System.out.println("----------------------");
System.out.println(f.getParent());//返回当前文件或文件夹的父级路径
System.out.println(f1.getParent());
//f.renameTo(new File("text.txt"));//文件或文件夹重命名
File f2 = new File("text.txt");
System.out.println(f2.exists());//文件或文件夹是否存在
System.out.println(f.canWrite());//是否可写
System.out.println(f.canRead());//是否可读
System.out.println(f1.isFile());//判断当前file对象是否是文件
System.out.println(f1.isDirectory());//判断当前file对象是否是文件夹
System.out.println(f1.lastModified());//获取文件最后修改时间,返回一个毫秒数
System.out.println(f.length());//返回文件(夹)长度,单位是字节
//判断文件是否存在,不存在就创建一个
File f3 = new File("text1.txt");
System.out.println(f3.exists());
if(!f3.exists()) {
try {
f3.createNewFile();//创建文件
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
File ff = new File("text.txt");
System.out.println(ff.exists());
ff.delete();//删除文件
System.out.println(ff.exists());
File f4 = new File("A");
f4.mkdir();//创建单层目录,用此方法创建多层目录需要一层一层创建
File f5 = new File("B\\C\\D");
f5.mkdirs();//创建多级目录
File f6 = new File("B");//返回当前文件夹子集的名称
String[] s = f6.list();
for(String s1 : s) {
System.out.println(s1);
}
/*
* 练习:遍历某个目录下的所有文件,无论层级多深
* 需要用递归
*/
File f7 = new File("B");
new File_lx().traverse(f7);
}
/*
* 练习:遍历某个目录下的所有文件,无论层级多深
* 需要用递归
* 主要方法如下
*/
public void traverse(File file){
if(file.isFile()) {
System.out.println("File:"+file.getAbsolutePath());
}else {
System.out.println("Folder:"+file.getAbsolutePath());
File[] f = file.listFiles();
if(f != null && f.length > 0) {
for(File fs : f) {
traverse(fs);
}
}
}
}
}