Java中不像C、C++那样设有专门的文件打开、关闭、跳转等方式,直接交给File类管理,开放几个方法,直接操作文件和文件夹。这十分利于新手入门。
File类的功能:
- 将操作系统中的文件、目录(文件夹)、路径,封装成File对象;
- 提供操作以上三种的方法函数;
方法
Java的API上都有以下的所讲方法。可以直接看API学习,也可以看别人写的文章学习。我的这篇文件的所讲述相关方法,首先是基于API,将其简略化,再辅助代码,更利于新手学习,以及对我以后复习时使用。
构造方法
File(File 父文件夹,String 文件名)
File(String 文件绝对路径)
File(String 父文件夹,String 文件名)
三种构造方法的使用
import java.io.File;
public class Main {
public static void main(String[] args) {
function();
}
public static void function(){
//1. File(String pathname) 把String字符串构成一个File对象,不检测这个路径是否合法
File file01 = new File("D:\\test"); //第一个'\'是转移字符,第二个'\'是路径分隔符;
System.out.println(file01); //输出:D:\test
//2. File(File parent, String child)
File parent = new File("D:\\test\\");
File file02 = new File(parent,"a.txt");
System.out.println(file02); //输出:D:\test\a.txt
//3. File(String parent, String child)
String pp = "D:\\test\\";
File file03 = new File(pp,"b.txt");
System.out.println(file03); //输出:D:\test\b.txt
}
}
路径问题
绝对路径
: 该文件在硬盘上的完整路径。绝对路径一般都是以盘符开头的。相对路径
: 相对路径就是资源文件相对于当前程序所在的路径。“.”当前路径;“…”上一级路径;
注意: 如果程序当前所在的路径与资源文件不是在同一个盘下面,是没法写相对路径的。
File file = new File(".");
System.out.println("当前路径是:"+ file.getAbsolutePath()); //获取当前的绝对路径
目录分隔符:
- 在windows机器上的目录分隔符是 \ ,在Linux机器上的目录分隔符是/ .
- 在windows上面\ 与 / 都可以使用作为目录分隔符。 而且,如果写/ 的时候只需要写一个即可。
- File中的分割符:
File.pathSeparator
:返回路径的分割符(在配置环境变量时各个Path路径的分割)。File.separator
:返回目录名称的风格符 (各级目录之间的分割)。
创建文件、文件夹方法
使用方法:
由File对象直接调用
boolean createNewFile()
:在new File()时里面的参数指定的位置创建一个空文件;创建的文件路径和文件名,由File对象的构造方法中给出;成功返回true,已存在就不创建,然后返回false(下同)。boolean mkdir()
:在new时指定位置创建目录,这只会创建最后一级目录,如果上级目录不存在就抛异常。boolean mkdirs()
:在指定位置创建目录,这会创建路径中所有不存在的目录。boolean renameTo(File dest)
:重命名文件或文件夹,也可以操作非空的文件夹,文件不同时相当于文件的剪切,剪切时候不能操作非空的文件夹。
删除文件、文件夹方法
使用方法:
由File对象直接调用
1)delete()
删除文件或一个空文件夹,如果是文件夹且不为空,则不能删除;成功返回true,失败返回false。当执行方法时就立即删除该文件。删除一个文件夹,这个文件夹下面不能有其他的文件和文件夹。
2)deleteOnExit()
在虚拟机终止时,请求删除此抽象路径名表示的文件或目录,保证程序异常时创建的临时文件也可以被删除;常用于删除程序运行后的临时文件的删除;
判断方法
boolean exists()
判断文件或文件夹是否存在。boolean isFile()
是否是一个文件,如果不存在,则始终为false。boolean isDirectory()
是否是一个目录,如果不存在,则始终为false。boolean isHidden()
是否是一个隐藏的文件或是否是隐藏的目录。boolean isAbsolute()
是否为绝对路径名。
获取方法
文件相关:
-
String getName()
获取文件或文件夹的名称,不包含上级路径。 -
String getPath()
返回绝对路径,可以是相对路径,但是目录要指定 -
String getAbsolutePath()
获取文件的绝对路径,与文件是否存在没关系 -
File getAbsoluteFile()
-
long length()
获取文件的大小(字节数),如果文件不存在则返回0L,如果是文件夹也返回0L。 -
String getParent()
返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回null。 -
File getParentFile()
-
long lastModified()
获取最后一次被修改的时间。
文件夹相关:
static File[] listRoots()
:列出所有的根目录(Window中就是所有系统的盘符)String[] list()
:返回目录下的文件或者目录名,包含隐藏文件。对于文件这样操作会返回null。返回一个String数组;String[] list(FilenameFilter filter)
:返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。File[] listFiles()
返回目录下的文件或者目录对象(File类实例),包含隐藏文件。对于文件这样操作会返回null。
File[] files = file.listFiles(); // 把当前文件夹下面的所有子文件与子文件夹都使用了一个File对象描述,然后把这些File对象存储到一个FIle数组中返回
for(File fileItem : files){
System.out.println("文件名:"+ fileItem.getName());
}
File[] listFiles(FilenameFilter filter)
:返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。
遍历
- public String[] list() 获取当前目录下的所有一级文件名、文件夹
- public File[] listFiles() 获取当前目录下的所有一级文件
//递归遍历目录
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class Main {
private static List<File> fileList = new ArrayList<>();
private static List<File> dirList = new ArrayList<>();
public static void main(String[] args) {
File file = new File("C:/users/kyle/desktop");
getAllFile(file);
for(File e:fileList) {
System.out.println(e.toPath());
}
for(File e:dirList) {
System.out.println(e.toPath());
}
}
/**
* 方法:获取某个目录下的所有文件、文件夹
* 输入:目录
* 输出:fileList、dirList
* 算法:
* 1.exists()
* 2.isFile() isDirectory()
*/
public static void getAllFile(File dir) {
if(dir.exists() && dir.isDirectory()) {
File[] files = dir.listFiles(); //获取当级目录下的所有文件、文件夹
if(files!=null && files.length>0) { //注意files的取值可能为null、可能为大小为0的数组
for(File file:files) {
if(file.isFile()) { //是文件
fileList.add(file);
} else if(file.isDirectory()) { //是文件夹
dirList.add(file);
getAllFile(file);
}
}
}
}
}
}
文件过滤器
功能: 遍历目录时,可以根据需要,只获取满足条件的相关文件。
实现文件过滤器的相关接口
- FilenameFilter:实现此接口的类实例,可用于过滤文件名。
方法摘要:boolean accept(File dir, String name); 测试指定文件是否应该包含在某一个文件列表中。- FileFilter:用于抽象路径的过滤器。
方法摘要boolean accept(File pathname); 测试指定的抽象路径名是否应该包含在路径列表中。
使用文件过滤器的步骤:
- 创建自定义的文件过滤器类,实现相关接口,重写抽象方法
- File对象调用listFiles方法,传入匿名的过滤器对象,实现过滤目的。
- 其中listFiles方法的作用有两个:调用accept方法和传入该方法所需的参数
简单示例:
import java.io.File;
import java.io.FileFilter;
class MyFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
//对路径进行判断,如果是java文件,返回true,不是java文件,返回false
return pathname.getName().endsWith(".java");
}
}
public class Main {
public static void main(String[] args) {
File file = new File("c:\\users\\KYLE\\desktop\\");
File[] fileArr = file.listFiles(new MyFilter());
for(File f : fileArr){
System.out.println(f);
}
}
}