java.io.File是文件和目录的重要类
(JDK6及以前是唯一的一个可以表示文件和目录的类)
File类是建立Java程序和系统文件的联系的类。
1 File类的两个常量:路径分隔符和名称分隔符
打开cmd,输入path,可以看到C:\Program Files (x86)\Common Files\Oracle\Java\javapath
和C:\WINDOWS\system32
用***分号***分隔开,这个分号就是路径分隔符;各个层次之间用***反斜线***分割,这个反斜线就是名称分隔符。
C:\Users\Administrator>path
PATH=C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\WINDOWS\system32;
@Test
public void test00() {
//路径分隔符
System.out.println(File.pathSeparator);
System.out.println(File.pathSeparatorChar);
//名称分隔符
System.out.println(File.separator);
System.out.println(File.separatorChar);
}
windows系统上运行结果:
;
;
\
\
2 文件路径
2.1 文件路径的常见使用形式
2.1.1 使用转义字符,不推荐使用
// 使用转义字符\,不推荐使用
String path1 = "F:\\JavaDemo\\1.txt";
文件分割符(系统属性 file.separator)是**\**
从windows文件管理器复制路径:H:\jee\workspace\io
在java等编程语言中,反斜杠\具有转义的特殊作用,比如\t表示制表符,\n表示回车,
所以如果你想在字符串里使用\的本意,就要用双反斜杠,即\\才表示
具体来说,要把你路径里的反斜杠改成“\\”.
H:\jee\workspace\io变为H:\\jee\\workspace\\io
或者是改为/。
H:\jee\workspace\io变为H:/jee/workspace/io
2.1.2 使用常量separator,不推荐使用,常用于动态生成,可跨平台
// 常用于动态生成,可跨平台,不推荐使用。
String path2 = "F:" + File.separator + "JavaDemo" + File.separator + "1.txt";
2.1.3 使用/,推荐使用
//推荐使用
String path3 = "F:/JavaDemo/1.txt";
2.2 文件的相对路径与绝对路径
举例:
绝对地址:我在中华人民共和国湖北省武汉市洪山区洛南街道129号。(地球文明的人可以按照这个地址找到我)
相对地址:我在华中师范大学对面。(相对地址是指我相对华师的位置,要找到我首先要找到华师的位置)
马克思主义哲学认为,世界上一切事物既包含有相对的方面,又包含有绝对的方面,任何事物都既是绝对的,又是相对的。
如果有地球以外文明,这个绝对地址也是错误的。这个绝对地址也只是相对地球上的人。
2.2.1 绝对路径构造File实例(对象)
code:
File file1 = new File("F:/JavaDemo/2.jpg");
System.out.println(file1.getName());
System.out.println(file1.getPath());
console:
2.jpg
F:\JavaDemo\2.jpg
2.2.2 相对路径构造File实例(对象)
相对路径名必须使用取自其他路径名的信息进行解释。
默认情况下,java.io 包中的类总是根据当前用户目录来解析相对路径名。此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。
code:
System.out.println(System.getProperty("user.dir"));
console:
G:\eclipsephoton\javaio
①指定相对路径
使用两种不同的构造器构造File实例
code:
//相对路径
String parent = "F:/javaDemo";
String name = "3.jpg";
File file2 = new File(parent,name);
File file3 = new File (new File(parent),name);
System.out.println(file2.getName());
System.out.println(file2.getPath());
System.out.println(file3.getName());
System.out.println(file3.getPath());
console:
3.jpg
F:\javaDemo\3.jpg
3.jpg
F:\javaDemo\3.jpg
②使用默认相对路径
在路径中如果没有盘符(windows操作系统)或者没有根路径(其他操作系统),则以user.dir为默认的相对路径
code:
//默认相对路径
System.out.println(System.getProperty("user.dir"));
File file4 = new File("test.txt");
System.out.println(file4.getName());
System.out.println(file4.getPath());
System.out.println(file4.getAbsolutePath());
console:
G:\eclipsephoton\javaio
test.txt
test.txt
G:\eclipsephoton\javaio\test.txt
3 File类常用方法
3.1 获取文件名及路径
(1)getAbsolutePath,获取完整路径
// 获取文件名及其相关路径
File file1 = new File("test.txt");//默认路径构造
File file2 = new File("G:/eclipsephoton/javaio/test.txt");//绝对路径构造
String parent = "G:/eclipsephoton/javaio";
String name = "test.txt";
File file3 = new File(parent,name);//指定相对路径构造,可以看做是绝对路径构造
// 获取完整路径
System.out.println("getAbsulutePath:");
System.out.println(file1.getAbsolutePath());
System.out.println(file2.getAbsolutePath());
System.out.println(file3.getAbsolutePath());
System.out.println("================");
G:\eclipsephoton\javaio\test.txt
G:\eclipsephoton\javaio\test.txt
G:\eclipsephoton\javaio\test.txt
(2)getName,获取文件名
File file1 = new File("test.txt");//默认路径构造
File file2 = new File("G:/eclipsephoton/javaio/test.txt");//绝对路径构造
String parent = "G:/eclipsephoton/javaio";
String name = "test.txt";
File file3 = new File(parent,name);//指定相对路径构造,可以看做是绝对路径构造
// 获取文件名
System.out.println("getName:");
System.out.println(file1.getName());
System.out.println(file2.getName());
System.out.println(file3.getName());
System.out.println("================");
getName:
test.txt
test.txt
test.txt
================
(3)getParent,获取文件所在目录
File file1 = new File("test.txt");//默认路径构造
File file2 = new File("G:/eclipsephoton/javaio/test.txt");//绝对路径构造
String parent = "G:/eclipsephoton/javaio";
String name = "test.txt";
File file3 = new File(parent,name);//指定相对路径构造,可以看做是绝对路径构造
// 获取所在目录
System.out.println("getParent:");
System.out.println(file1.getParent());
System.out.println(file2.getParent());
System.out.println(file3.getParent());
System.out.println("================");
getParent:
null
G:\eclipsephoton\javaio
G:\eclipsephoton\javaio
================
(4)getPath,获取文件,如果file是绝对路径则返回绝对路径,如果是默认相对路径则返回文件名
File file1 = new File("test.txt");//默认路径构造
File file2 = new File("G:/eclipsephoton/javaio/test.txt");//绝对路径构造
String parent = "G:/eclipsephoton/javaio";
String name = "test.txt";
File file3 = new File(parent,name);//指定相对路径构造,可以看做是绝对路径构造
// 获取路径getPath( ),如果file是绝对路径则返回绝对路径,如果是默认相对路径则返回文件名
System.out.println("getPath:");
System.out.println(file1.getPath());
System.out.println(file2.getPath());
System.out.println(file3.getPath());
System.out.println("================");
getPath:
test.txt
G:\eclipsephoton\javaio\test.txt
G:\eclipsephoton\javaio\test.txt
================
3.2 判断
准备数据:
File file1 = new File("test.txt");// 文件存在
File file2 = new File("test1.txt");// 文件不存在
String parent = "G:/eclipsephoton/javaio";
String name = "test.txt";
File file3 = new File(parent, name);
File file4 = file3.getParentFile();// 文件夹
System.out.println(file4);
File file5 = new File("G:/eclipsephoton/javaio/test.txt");
File file6 = file5.getParentFile();// 文件夹
System.out.println(file6);
file1文件不存在
file2文件存在
file4文件夹存在
(1)exist():文件是否存在
System.out.print("file1是否存在:");
boolean bool = file1.exists();
if (bool) {
System.out.println("文件存在");
} else {
System.out.println("文件并不存在");
}
// 文件是否存在
System.out.print("file2是否存在:");
boolean bool2 = file2.exists();
if (bool2) {
System.out.println("文件存在");
} else {
System.out.println("文件并不存在");
}
// 文件是否存在
System.out.print("file4是否存在:");
boolean bool3 = file4.exists();
if (bool3) {
System.out.println("文件夹存在");
} else {
System.out.println("文件夹并不存在");
}
file1是否存在:文件并不存在
file2是否存在:文件存在
file4是否存在:文件夹存在
(2)canWrite(),canRead() : 是否能读写
//
System.out.print("file1是否能写:");
System.out.println(file1.canWrite());
System.out.print("file1是否能读:");
System.out.println(file1.canRead());
System.out.print("file2是否能写:");
System.out.println(file2.canWrite());
System.out.print("file2是否能写:");
System.out.println(file2.canRead());
file1是否能写:false
file1是否能读:false
file2是否能写:true
file2是否能写:true
(3)isFile(),isdirctory():判断为目录还是文件
//
System.out.print("file1:");
if(file1.isFile()) {
System.out.println("文件");
}else if(file1.isDirectory()) {
System.out.println("文件夹");
}else {
System.out.println("不存在");
}
//
System.out.print("file2:");
if(file2.isFile()) {
System.out.println("文件");
}else if(file2.isDirectory()) {
System.out.println("文件夹");
}else {
System.out.println("不存在");
}
//
System.out.print("file6:");
if(file6.isFile()) {
System.out.println("文件");
}else if(file6.isDirectory()) {
System.out.println("文件夹");
}else {
System.out.println("不存在");
}
file1:不存在
file2:文件
file6:文件夹
(4)isAbsolute():判断是否是绝对路径构建
//判断是否为抽象路径
System.out.print("file1是否是抽象路径:");
System.out.println(file1.isAbsolute());
System.out.println(file2.isAbsolute());
System.out.print("file4是否是抽象路径:");
System.out.println(file4.isAbsolute());
System.out.print("file6是否是抽象路径:");
System.out.println(file6.isAbsolute());
file1是否是抽象路径:false
false
file4是否是抽象路径:true
file6是否是抽象路径:true
3.3 文件属性
所谓属性信息是指:位置,大小,时间等
(1)length() :文件长度,字节数
//判断长度
File file = new File("C:/Users/Administrator/Desktop/j");
File file1 = file.getParentFile();
System.out.println(file1);
System.out.println(file1.length());
File file3 = new File("C:/Users/Administrator/Documents/j");
File file4 = file3.getParentFile();
System.out.println(file4);
System.out.println(file4.length());
File file5 = new File("G:/eclipsephoton/javaio/test.txt");
File file6 = file5.getParentFile();// 文件夹
System.out.println(file6);
System.out.println(file6.length());
File file7 = new File("C:\\Users\\Administrator\\Desktop\\hibernate\\1");
File file8 = file7.getParentFile();// 文件夹
System.out.println(file8);
System.out.println(file8.length());
不明白为什么有的文件夹的length()方法可以有长度,我以为都是0。意外发现
C:\Users\Administrator\Desktop
8192
C:\Users\Administrator\Documents
4096
G:\eclipsephoton\javaio
0
C:\Users\Administrator\Desktop\hibernate
0
(2)判断文件所在分区容量的方法
//判断长度
File file = new File("C:/Users/Administrator/Desktop/XSL.jpg");
System.out.println(file.length());
System.out.println(file.getFreeSpace());
System.out.println(file.getTotalSpace());
System.out.println(file.getUsableSpace());
446671
163204370432
239218368512
163204370432
可以看到其中的相关的联系,可用空间和总容量与FreeSpace(),TotalSpace()对应。
3.4 创建和删除文件
(1)createNewFile()
File file1 = new File("G:/eclipsephoton/javaio/test.txt");
if(!file1.exists()) {
boolean createNewFile = file1.createNewFile();
System.out.println(createNewFile?"成功":"失败");
}
File file2 = new File("G:/eclipsephoton/javaio/con");
if(!file2.exists()) {
boolean createNewFile = file2.createNewFile();
System.out.println(createNewFile?"成功":"失败");
}
在windows中不能创建con为名的文件和文件夹,con为系统关键字
成功
失败
(2)delete()
boolean delete = file1.delete();
System.out.println(delete);
3.5 操作目录
(1)创建
mkdir():创建目录,如果没有父目录则创建不成功;mkdirs():无论是否有父目录都会创建下来
G盘没有这样的dir目录
File dir = new File("G:/dir/xsl");
boolean mkdir = dir.mkdir();
System.out.println(mkdir);
File dir1 = new File("G:/dir/xsl");
boolean mkdirs = dir1.mkdirs();
System.out.println(mkdirs);
false
true
(2)遍历
①list(),返回文件名字符串
File dir = new File("G:/");
String[] list = dir.list();
for(String sub :list) {
System.out.println(sub);
}
$RECYCLE.BIN
dir
eclipsephoton
matlab2016b
System Volume Information
Ubuntu
Workspaces
②listFiles(),返回文件对象
File dir = new File("G:/eclipsephoton");
File[] list = dir.listFiles();
for(File sub :list) {
System.out.println(sub);
}
G:\eclipsephoton\.metadata
G:\eclipsephoton\.recommenders
G:\eclipsephoton\CommonIO
G:\eclipsephoton\*******
G:\eclipsephoton\******
③listFiles(FilenameFilter filter),返回文件对象
此方法jdk源码
public File[] listFiles(FilenameFilter filter) {
String ss[] = list();
if (ss == null) return null;
ArrayList<File> files = new ArrayList<>();
for (String s : ss)
if ((filter == null) || filter.accept(this, s))
files.add(new File(s, this));
return files.toArray(new File[files.size()]);
}
File dir = new File("G:/eclipsephoton/javaio");
File[] list = dir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
System.out.println(this);
System.out.println(dir);
return name.endsWith(".txt");
}
});
for(File sub :list) {
System.out.println(sub);
}
G:\eclipsephoton\javaio
G:\eclipsephoton\javaio
G:\eclipsephoton\javaio
G:\eclipsephoton\javaio
G:\eclipsephoton\javaio
G:\eclipsephoton\javaio
G:\eclipsephoton\javaio
G:\eclipsephoton\javaio\test1.txt
递归遍历某个文件下的所有子孙文件
public void printName(File file) {
if (file.isDirectory()) {
for (File file1 : file.listFiles()) {
if (file1.isDirectory()) {
printName(file1);
} else {
System.out.println(file1);
}
}
}
④listRoots(),静态方法,列出根路径
File[] listRoots = File.listRoots();
System.out.println(Arrays.toString(listRoots));
[C:\, D:\, E:\, F:\, G:\, H:\]