java File 类
一、File的概念
Java.io包下代表平台无关的文件和目录。也就是说如果希望在程序中操作文件或目录都可以通过File类来完成。
File可以新建、删除、和重命名文件和目录。但****File不能访问文件本身****,如果需要访问文件内容,则需要 I/O。
File类的实例表示一个文件或者目录(文件夹)。
构造一个File实例****并不是创建这个目录或文件****,而是该路径的一个抽象,它可能真实存在也可能不存在。(就是指向这个文件或目录)。
二、相对路径和绝对路径
1、路径分类:绝对路径、相对路径
2、绝对路径:从根目录开始的路径,称为绝对路径 D:/dir1/xxx.txt
Windows系统中:盘符目录就是根目录,D:、E:
Linux系统中:/就是根目录,从/开始的路径就是绝对路径
3、相对路径:相对于某个路径而言的路径
相对于不同的路径,同样的相对路径,表达的是不同的路径
Dos命令行中:相对于当前路径(Dos命令行所在的路径),a/b/c.txt
Eclipse中:相对于当前工程的根目录
三、File类的构造方法
File(String pathname) 通过将给定路径名字符串转换为抽象路径名来指向一个文件。 |
---|
[File](#File(java.lang.String, java.lang.String))(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串指向一个文件。 |
[File](#File(java.io.File, java.lang.String))(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串指向一个文件。 |
*注意:*
起的类名不要用File,这样new File() 系统认为new的是自己手写的这个File类。
四、File类的常用方法
4.1 创建的方法
1、boolean 变量名=file的变量名. createNewFile():创建当前File对象所描述的路径的文件
Boolean值为true,说明创建成功,反之不成功。
.createNewFile()方法需要布尔型变量去接收。
2、boolean变量名=file的变量名. mkdir():创建当前File对象所描述的路径的文件夹(如果父级路径不存在,那么不会自动创建父级路径)
3、boolean 变量名=file的变量名. mkdir****s****():创建当前File对象所描述的路径的文件夹(如果父级路径不存在,那么自动创建父级路径)解释:可以同时创建不存在的多级文件夹
*注:mkdir一次只能创建一级目录,一次创建多级目录使用mkdirs()*
package day20;
import java.io.File;
import java.io.IOException;
public class caogao {
public static void main(String[] args) {
File f1 = new File("D:/dir/cc.docx");//创建Word文档,使用后缀.docx
boolean b;
try {
b = f1.createNewFile(); //创建Word文档
System.out.println("cc.docx文件是否创建成功:"+b);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
File f2 = new File("D/dir3"); //原本是没有dir3这个文件夹(目录)的
boolean c = f2.mkdir(); //mkdir一次只能创建一个目录
System.out.println("dir3文件夹是否创建成功:"+c);
File f3 = new File("D/dir4/aa"); //原本是没有dir3和aa文件夹(目录)的
boolean d = f3.mkdirs(); //mkdirs一次可创建多个目录
System.out.println("dir4和aa文件夹是否创建成功:"+d);
}
}
运行结果:
cc.docx文件是否创建成功:true
dir3文件夹是否创建成功:true
dir4和aa文件夹是否创建成功:true
4.2 删除的方法
1、delete():删除调用者描述的文件或者文件夹
2、注意事项:
(1)delete在删除文件夹的时候,只能删除空文件夹
(2)delete方法不走回收站
package day20;
import java.io.File;
public class caogao01 {
public static void main(String[] args) {
File f1 = new File("D:/dir3"); //dir3 是空目录
File f2 = new File("D:/dir4"); //dir4是 非空目录
boolean b = f1.delete();
boolean c = f2.delete();
System.out.println("删除成功?:"+b);
System.out.println("删除成功?:"+c);
}
}
结果:
删除成功?:true
删除成功?:false
4.3 重命名
1、renameTo(File dest)
调用者是当前的文件或者文件夹的路径对象
参数是变化之后的文件或者文件夹的路径对象
2、注意事项:
如果在同一个文件夹下,修改路径,就是重命名
如果在不同文件夹下,修改路径,就是剪切
package day20;
import java.io.File;
public class f {
public static void main(String[] args) {
File f1 = new File("D:/dir2/aa"); //f1为文件夹
File f11 = new File("D:/dir2/cc"); //f11为文件夹
File f2 = new File("D:/dir2/bb.docx"); //f2为office文件
File f22 = new File("D:/dir2/ff.docx"); //f22为office文件
boolean b = f1.renameTo(f11);
boolean c = f2.renameTo(f22);
System.out.println("aa改名cc成功?:"+b);
System.out.println("bb.docx改名ff.docx成功?:"+c);
File f3 = new File("D:/tt.txt");
File f33 = new File("C:/aa.txt");
boolean d = f3.renameTo(f33);
System.out.println("D:/tt.txt移动并改名到E:/aa.txt 成功?"+d);
}
}
结果:
aa改名cc成功?:true
bb.docx改名ff.docx成功?:true
D:/tt.txt移动并改名到E:/aa.txt 成功?false
注意:
(1)扩展名
(2) 如果跨盘符卷移动一个文件夹,移不动
*4.4 判断功能的方法*
(1)exists():判断当前调用者File对象,是否存在
(2)isFile():判断当前调用者File对象,是否是文件
(3)isDirectory():判断当前调用者File对象,是否是文件夹
package day20;
import java.io.File;
public class lei {
public static <f2> void main(String[] args) {
File f1 = new File("D:/dir/a1.txt");
boolean b = f1.exists(); // 判断对象f1是否存在
boolean c = f1.isFile(); // 判断对象f1是否是文件夹
boolean d = f1.isDirectory();// 判断对象f1是否是文件夹
System.out.println("判断对象f1是否存在:" + b);
System.out.println("判断对象f1是否是文件夹" + c);
System.out.println("判断对象f1是否是文件夹" + d);
}
}
结果:
判断对象f1是否存在:true
判断对象f1是否是文件夹true
判断对象f1是否是文件夹false
*4.5 获取功能的方法*
1、getAbsolutePath():获取当前File对象的绝对路径
2、getPath():获取的就是在构造方法中封装的路径
3、getName():获取最底层的简单的文件或者文件夹名称(不包含所造目录的路径)
4、length():获取文件的字节个数(不指文件夹)
5、String[] list():获取当前文件夹下的所有文件和文件夹的名称,到一个字符串数组中
6、File[] listFiles():获取当前文件夹下的所有文件和文件夹的File对象,到一个File对象数组中
package day20;
import java.io.File;
public class lei {
public static <f2> void main(String[] args) {
File f1 = new File("D:/dir/a1.txt");
boolean b = f1.exists(); // 判断对象f1是否存在
boolean c = f1.isFile(); // 判断对象f1是否是文件夹
boolean d = f1.isDirectory();// 判断对象f1是否是文件夹
System.out.println("判断对象f1是否存在:" + b);
System.out.println("判断对象f1是否是文件夹" + c);
System.out.println("判断对象f1是否是文件夹" + d);
}
}
结果:
判断对象f1是否存在:true
判断对象f1是否是文件夹true
判断对象f1是否是文件夹false
package day20;
import java.io.File;
public class lei01 {
public static void main(String[] args) {
File f1 = new File("a.doc");
File b = f1.getAbsoluteFile(); //获取f1的绝对地址
String c = f1.getPath(); //获取f1的封装地址
String name = f1.getName(); //获取f1的文件名
long l = f1.length(); //获取f1的文件字节数
System.out.println(b);
System.out.println(c);
System.out.println(name);
System.out.println(l);
}
}
结果:
D:\soft\eclipse-workspace\day20\a.doc
a.doc
a.doc
0
*练习:*
*练习1:********检查文件是否存在,文件的创建*
描述:检查D盘下是否存在文件a.txt,如果不存在则创建该文件。
package day20;
import java.io.File;
import java.io.IOException;
/**
* @author TaoTianye
*题目:练习1:检查文件是否存在,文件的创建
描述:检查D盘下是否存在文件a.txt,如果不存在则创建该文件。
*/
public class lei04 {
public static void main(String[] args) {
File f1 = new File("D:/a.txt");
boolean b = f1.exists();
System.out.println("D盘下是否存在文件a.txt: "+b);
if(b) {
System.out.println("D盘下a.txt文件已经存在");
}else {
try {
boolean c = f1.createNewFile();
System.out.println("D盘下a.txt文件不存在,现在已经创建,创建结果为:"+c);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
结果:
D盘下是否存在文件a.txt: false
D盘下a.txt文件不存在,现在已经创建,创建结果为:true
*练习2:找出dir文件夹下以a开头的所有文件和文件夹*
提示:String类中有方法:
boolean startsWith()
boolean endsWith()
package day20;
import java.io.File;
/**
* @author TaoTianye
*找出dir文件夹下以a开头的所有文件和文件夹
提示:String类中有方法:
(1)startsWith()方法返回的值为布尔型
startsWith(String prefix)
测试此字符串是否以指定的前缀开头。
(2)endsWith()方法返回的值为布尔型
endsWith(String suffix)
测试此字符串是否以指定的后缀结尾。
*/
public class lei05 {
public static void main(String[] args) {
File f1 = new File("D:/dir/");
File[] lf1 = f1.listFiles();
System.out.println("D盘下dir文件夹下以a开头的所有文件和文件夹如下:");
for(int i=0;i<lf1.length;i++) {
if(lf1[i].getName().startsWith("a")) {
System.out.println(lf1[i]);
}
}
}
}
结果:
D盘下dir文件夹下以a开头的所有文件和文件夹如下:
D:\dir\a1.txt
D:\dir\a2.xlsx
D:\dir\a3.docx
D:\dir\a4.ppt
D:\dir\a5.pub
D:\dir\a6.zip
D:\dir\a7.txt
D:\dir\a8.txt
D:\dir\a9.xls
*练习3:找出dir文件夹下所有的txt文件*
package day20;
import java.io.File;
/**
* @author TaoTianye
*题目:找出dir文件夹下所有的txt文件
*/
public class lei06 {
public static void main(String[] args) {
File f1 = new File("D:/dir");
File[] lfs1 = f1.listFiles();
System.out.println("dir文件夹下所有的txt文件:");
//查找后缀为.txt的文件,就是txt文件
for(int i=0;i<lfs1.length;i++) {
if(lfs1[i].getName().endsWith(".txt")) {
System.out.println(lfs1[i]);
}
}
}
}
结果:
dir文件夹下所有的txt文件:
D:\dir\a1.txt
D:\dir\a7.txt
D:\dir\a8.txt
*练习4:递归方式列出某个目录下的所有文件夹名和文件名*
package day20;
import java.io.File;
/**
* @author TaoTianye
*题目:递归方式列出某个(dir)目录下的所有文件夹名和文件名
*解释:各级文件夹下的文件都要打印出文件名
*/
public class lei07 {
static int a = 1; //静态变量记录递归次数
public static void main(String[] args) {
File f1 = new File("D:/dir");
find(f1);
}
// find方法的目的:查找当级目录(文件夹)下的文件与目录(文件夹)
public static void find(File f) {
System.out.println("第" + a++ + "次递归");// 方便查看每一次递归执行的行为
File[] lf = f.listFiles();// 查找出目录下当级目录下所有的文件与文件夹
for (int i = 0; i < lf.length; i++) {
if (lf[i].isFile()) {// 判断当级目录下的对象是否是文件
System.out.println("文件:" + lf[i]);// 如果是文件就打印
} else {
System.out.println("文件夹:" + lf[i]);// 如果是文件夹就打印
find(lf[i]);// 遇到文件夹就继续使用find方法查找这个文件夹下的文件与目录
}
}
}
}
结果:
第1次递归
文件:D:\dir\a1.txt
文件:D:\dir\a2.xlsx
文件:D:\dir\a3.docx
文件:D:\dir\a4.ppt
文件:D:\dir\a5.pub
文件:D:\dir\a6.zip
文件:D:\dir\a7.txt
文件:D:\dir\a8.txt
文件:D:\dir\a9.xls
文件夹:D:\dir\文件夹1
第2次递归
文件:D:\dir\文件夹1\a1.txt
文件:D:\dir\文件夹1\a2.xlsx
文件:D:\dir\文件夹1\a3.docx
文件:D:\dir\文件夹1\a4.ppt
文件:D:\dir\文件夹1\a5.pub
文件:D:\dir\文件夹1\a6.zip
文件:D:\dir\文件夹1\a7.txt
文件:D:\dir\文件夹1\a8.txt
文件:D:\dir\文件夹1\a9.xls
文件夹:D:\dir\文件夹1\文件夹2
第3次递归
文件:D:\dir\文件夹1\文件夹2\a1.txt
文件:D:\dir\文件夹1\文件夹2\a2.xlsx
文件:D:\dir\文件夹1\文件夹2\a3.docx
文件:D:\dir\文件夹1\文件夹2\a4.ppt
文件:D:\dir\文件夹1\文件夹2\a5.pub
文件:D:\dir\文件夹1\文件夹2\a6.zip
文件:D:\dir\文件夹1\文件夹2\a7.txt
文件:D:\dir\文件夹1\文件夹2\a8.txt
文件:D:\dir\文件夹1\文件夹2\a9.xls
*练习5:递归方式清空某个目录*
package day20;
import java.io.File;
/**
* @author TaoTianye
*题目:递归方式清空某个(dir1)目录
*解释:删除各级目录下的文件与目录(文件夹),只保留一级目录
*/
public class lei08 {
static int a = 1; //静态变量记录递归次数
public static void main(String[] args) {
File f = new File("D:/dir1");
clear(f);
}
// clear方法:删除当前目录(文件夹)及其内部文件
public static void clear(File f) {
System.out.println("第" + a++ + "次递归"); // 方便查看每一次递归执行的行为
File[] lf = f.listFiles();
for (int i = 0; i < lf.length; i++) {
if (lf[i].isFile()) {// 判断对象是否是文件
lf[i].delete(); // 是文件,删除
System.out.println(" 文件" + lf[i] + "删除成功");
} else {
clear(lf[i]); // 继续删除下一个文件夹里的内容
lf[i].delete(); // 是空文件夹,就删除
//说明以上两句程序:
//File类里的delete方法只能删除空文件夹,所以要先进入到文件夹即删除文件才能删除文件夹,
//所以递归语句clear(lf[i]);
//必须在删除文件夹lf[i].delete();的语句之前
System.out.println("文件夹" + lf[i] + "删除成功");
}
}
}
}
结果:
第1次递归
文件D:\dir1\a1.txt删除成功
文件D:\dir1\a2.xlsx删除成功
文件D:\dir1\a3.docx删除成功
文件D:\dir1\a4.ppt删除成功
文件D:\dir1\a5.pub删除成功
文件D:\dir1\a6.zip删除成功
文件D:\dir1\a7.txt删除成功
文件D:\dir1\a8.txt删除成功
文件D:\dir1\a9.xls删除成功
第2次递归
文件D:\dir1\文件夹1\a1.txt删除成功
文件D:\dir1\文件夹1\a2.xlsx删除成功
文件D:\dir1\文件夹1\a3.docx删除成功
文件D:\dir1\文件夹1\a4.ppt删除成功
文件D:\dir1\文件夹1\a5.pub删除成功
文件D:\dir1\文件夹1\a6.zip删除成功
文件D:\dir1\文件夹1\a7.txt删除成功
文件D:\dir1\文件夹1\a8.txt删除成功
文件D:\dir1\文件夹1\a9.xls删除成功
第3次递归
文件D:\dir1\文件夹1\文件夹2\a1.txt删除成功
文件D:\dir1\文件夹1\文件夹2\a2.xlsx删除成功
文件D:\dir1\文件夹1\文件夹2\a3.docx删除成功
文件D:\dir1\文件夹1\文件夹2\a4.ppt删除成功
文件D:\dir1\文件夹1\文件夹2\a5.pub删除成功
文件D:\dir1\文件夹1\文件夹2\a6.zip删除成功
文件D:\dir1\文件夹1\文件夹2\a7.txt删除成功
文件D:\dir1\文件夹1\文件夹2\a8.txt删除成功
文件D:\dir1\文件夹1\文件夹2\a9.xls删除成功
文件夹D:\dir1\文件夹1\文件夹2删除成功
文件夹D:\dir1\文件夹1删除成功
文件D:\dir1\文件夹1\a1.txt删除成功
文件D:\dir1\文件夹1\a2.xlsx删除成功
文件D:\dir1\文件夹1\a3.docx删除成功
文件D:\dir1\文件夹1\a4.ppt删除成功
文件D:\dir1\文件夹1\a5.pub删除成功
文件D:\dir1\文件夹1\a6.zip删除成功
文件D:\dir1\文件夹1\a7.txt删除成功
文件D:\dir1\文件夹1\a8.txt删除成功
文件D:\dir1\文件夹1\a9.xls删除成功
第3次递归
文件D:\dir1\文件夹1\文件夹2\a1.txt删除成功
文件D:\dir1\文件夹1\文件夹2\a2.xlsx删除成功
文件D:\dir1\文件夹1\文件夹2\a3.docx删除成功
文件D:\dir1\文件夹1\文件夹2\a4.ppt删除成功
文件D:\dir1\文件夹1\文件夹2\a5.pub删除成功
文件D:\dir1\文件夹1\文件夹2\a6.zip删除成功
文件D:\dir1\文件夹1\文件夹2\a7.txt删除成功
文件D:\dir1\文件夹1\文件夹2\a8.txt删除成功
文件D:\dir1\文件夹1\文件夹2\a9.xls删除成功
文件夹D:\dir1\文件夹1\文件夹2删除成功
文件夹D:\dir1\文件夹1删除成功