1. 概念
文件和目录路径名的抽象表示方式,File 类可以用于文件和目录的创建、文件查找和文件删除等。File 类实现了 Serializable 和 Comparable 接口,可以进行序列化和文件大小的比较.
路径分隔符:
- windows:
"/"
""
都可以 - linux/unix:
"/"
- 注意:如果 windows 选择用
""
做分割符的话,那么请记得替换成"\"
,因为 Java 中""
代表转义字符
所以推荐都使用"/"
,也可以直接使用代码 File.separator,表示跨平台分隔符。
路径:
- 相对路径:
./
表示当前路径,../
表示上一级路径,其中当前路径:默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。 - 绝对路径:绝对路径名是完整的路径名,不需要任何其他信息就可以定位自身表示的文件
2. 字段
- private static final FileSystem fs = DefaultFileSystem.getFileSystem():返回平台默认的文件系统对象
private final String path:路径名字符串
private static enum PathStatus { INVALID, CHECKED }:表示的是文件路径的状态
private transient PathStatus status = null:用来标识文件路径是否有效
private final transient int prefixLength:抽象路径名的前缀的长度
public static final char separatorChar:系统依赖的默认名称分割符.在UNIX系统中是/
,在Microsoft Windows系统中是//
public static final String separator:系统依赖的默认名称分割符.在UNIX系统中是/
,在Microsoft Windows系统中是//
public static final char pathSeparatorChar:在UNIX系统中是:
,在Microsoft Windows系统中是;
public static final String pathSeparator:在UNIX系统中是:
,在Microsoft Windows系统中是;
3. 方法
1. 构造器
- File(String pathname):
File f1 =new File("c:\\abc\\1.txt");
- File(String parent,String child):
File f2 =new File("c:\\abc","2.txt");
- File(File parent,String child):
File f3 =new File("c:"+File.separator+"abc");//separator 跨平台分隔符 File f4 =new File(f3,"3.txt");
- public File(URI uri) {}:将给定的 file:URI 转成抽象路径名创建一个 File 对象
URI uri = new URI("file:D:/java/home"); //注意格式是"file:/D:/java/home" File file = new File(uri);
2. 创建与删除方法
- boolean createNewFile():如果文件存在返回 false,否则返回 true 并且创建文件
- boolean mkdir():创建一个 File 对象所对应的目录,成功返回 true,否则 false。且 File 对象必须为路径而不是文件。只会创建最后一级目录,如果上级目录不存在就抛异常。
- boolean mkdirs():创建一个 File 对象所对应的目录,成功返回 true,否则 false。且 File 对象必须为路径而不是文件。创建多级目录,创建路径中所有不存在的目录也一起创建
- boolean delete():如果文件存在返回 true 并且删除文件,否则返回 false
- void deleteOnExit():在虚拟机终止时,删除 File 对象所表示的文件或目录。
3. 判断方法
- boolean canExecute():判断文件是否可执行
- boolean canRead():判断文件是否可读
- boolean canWrite():判断文件是否可写
- boolean exists():判断文件是否存在
- boolean isDirectory():判断是否是目录
- boolean isFile():判断是否是文件
- boolean isHidden():判断是否是隐藏文件或隐藏目录
- boolean isAbsolute():判断是否是绝对路径,文件不存在也能判断
4. 获取方法
- String getName():返回文件或者目录的名称
- String getPath():返回路径
- String getAbsolutePath():返回绝对路径
- String getParent():返回父目录,如果没有父目录则返回 null
- long lastModified():返回最后一次修改的时间
- long length():返回文件的长度
- File[] listRoots(): 列出所有的根目录(Window 中就是所有系统的盘符)
- String[] list():返回一个字符串数组,给定路径下的文件或目录名称字符串
- String[] list(FilenameFilter filter):返回满足过滤器要求的一个字符串数组
- File[] listFiles():返回一个文件对象数组,给定路径下文件或目录
- File[] listFiles(FilenameFilter filter):返回满足过滤器要求的一个文件对象数组
接口 FileNameFilter 是个文件过滤器,包含了一个 accept(File dir,String name) 方法,该方法依次对指定 File 的所有子目录或者文件进行迭代,按照指定条件,进行过滤,过滤出满足条件的所有文件。
// 文件过滤
File[] files = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File file, String filename) {
return filename.endsWith(".mp3");
}
});
表示:file 目录下的所有子文件如果满足后缀是 .mp3 的条件的文件都会被过滤出来
4. 案例
public class FileDemo {
public static void main(String[] args) throws IOException, URISyntaxException {
//testCreateDirectory();
//testCreateFile();
//testOtherMethod();
File file = new File("D:/java");
//testAllFileDelete(file);
}
/**
* 递归调用删除所有文件
*/
private static void testAllFileDelete(File file) {
if(file==null||!file.exists()) return;
if(file.isDirectory()) {
File[] listFiles = file.listFiles();
for(File delFile :listFiles) {
testAllFileDelete(delFile);
}
}
file.delete();
}
private static void testOtherMethod() {
File file = new File("D:/java/test.txt");
System.out.println("文件是否存在file.exists-----"+file.exists());
System.out.println("文件绝对路径file.getgetAbsolutePath()------"+file.getAbsolutePath());
System.out.println("文件名file.getName()-----"+file.getName());
System.out.println("file.getParentFile()------"+file.getParentFile());
System.out.println("父级目录路径名file.getParent()-----"+file.getParent());
System.out.println("uri的路径file.toURI()------"+file.toURI());
System.out.println("最后修改时间file.getLastModified()-----"+file.lastModified());
System.out.println("路径名转化成字符串file.getPath()-----"+file.getPath());
File testFile = new File("D:/java");
File[] listFiles = testFile.listFiles();
for(File list : listFiles) {
System.out.println("文件名:"+list.getName()+""+"----是否目录:"+list.isDirectory()+"----是否文件:"+list.isFile()+"-----绝对路径:"+list.getAbsolutePath());
}
}
/**
* 创建文件,前提是要在已有的目录下面
*/
private static void testCreateFile() throws IOException, URISyntaxException {
//******createNewFile()*********
//在已有目录D:/java下面创建文件test.txt.
File javaDir = new File("D:/java");//先创建D:/java目录.
javaDir.mkdir();
//方式1:
File file1 = new File("D:/java/test.txt");
file1.createNewFile();
//方式2:
File file2 = new File("D:/java","test.txt");
file2.createNewFile();
//方式3:
File javaFile = new File("D:/java");
File File3 = new File(javaFile,"test.txt");
File3.createNewFile();
//方式4:
URI uri = new URI("file:/D:/java/home");
File file4 = new File(uri);
file4.createNewFile();
}
/**
* 创建目录方法共两类:
* 1.mkdir()方法,要求父级的目录必须是存在的
* 2.mkdirs()方法,父级目录可以不存在
*/
private static void testCreateDirectory() throws URISyntaxException {
//*******mkdir()********
//1.在已有D:/java目录下面创建home目录
File javaDir = new File("D:/java");
javaDir.mkdir(); //创建D:/java,使得D盘根目录下面java目录已存在.
//方式1:
File file1 = new File("D:/java/home");
file1.mkdir();
//方式2:
File file2 = new File("D:/java","home");
file2.mkdir();
//方式3:
URI uri = new URI("file:/D:/java/home");
File file3 = new File(uri);
file3.mkdir();
//******mkDirs()********
//2.父级别目录不存在,即D:/java目录不存在,创建多级目录,D:/java/home.
//方式1:
File dirsFile1 = new File("D:/java/home");
dirsFile1.mkdirs();
//方式2:
File dirsFile2 = new File("D:/java","home");
dirsFile2.mkdirs();
//方式3:
URI dirsUri = new URI("file:/D:/java/home");
File dirsFile3 = new File(dirsUri);
dirsFile3.mkdirs();
//方法4:
File javaDir1 = new File("D:/java");
File file4 = new File(javaDir1,"home");
file4.mkdirs();
}
}
//testOtherMethod方法运行结果
文件是否存在file.exists-----true
文件绝对路径file.getgetAbsolutePath()------D:\java\test.txt
文件名file.getName()-----test.txt
file.getParentFile()------D:\java
父级目录路径名file.getParent()-----D:\java
uri的路径file.toURI()------file:/D:/java/test.txt
最后修改时间file.getLastModified()-----1536546025013
路径名转化成字符串file.getPath()-----D:\java\test.txt
文件名:test.txt----是否目录:false----是否文件:true-----绝对路径:D:\java\test.txt