Java通过java.io.File类来操作文件(或者是目录),也就是说通过File类创建的对象可以表示一个文件,也可以表示一个目录.
File概述
一.构造方法
1. File(File parent, String child)
说明:根据父目录和孩子文件路径,来创建File实例
2. File(String pathname)
说明:根据文件路径来创建File实例,文件路径可以是绝对路径或者是相对路径
3. File(String parent, String child)
说明:根据父目录路径和孩子文件路径,创建File实例
假设,我们现在的java项目路径是E:/test/fzu,这个项目下有一个txt文件,它的路径是E:/test/fzu/pzn.txt,那我们可以依据这个路径,通过上面三种方式来创建一个File对象
通过第一种方式创建File对象,代码如下
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
File parentDir = new File("E:/test/fzu");
File targetFile = new File(parentDir,"pzn.txt");
System.out.println(targetFile.exists());
}
}
或者
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
File parentDir = new File("E:/test");
File targetFile = new File(parentDir,"fzu/pzn.txt");
System.out.println(targetFile.exists());
}
}
第一种方法通过父目录和孩子文件路径来创建File对象
这里父目录和孩子文件路径是相对的,对于E:/test/fzu/pzn.txt这个路径,
你可以认为E:/test/fzu是父目录,也可以认为E:/test是父目录,只要根据不同的父目录后面对应好相对的孩子文件路径即可
通过第二种方式创建File对象,代码如下
import java.io.File;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
File targetFile = new File("E:/test/fzu/pzn.txt");
System.out.println(targetFile.exists());
}
}
第二种方法通过文件的绝对路径或者相对路径来创建File对象,绝对路径即是E:/test/fzu/pzn.txt
而对于相对路径,这里的相对是针对项目路径的,也就是说如果你想要用相对路径来创建File对象,应该保证该文件在项目路径上的,而pzn.txt文件正是在项目路径e:/test/fzu下
那么我就可以直接通过相对路径来创建,代码如下
import java.io.File;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
File targetFile = new File("pzn.txt");
System.out.println(targetFile.exists());
}
}
通过第三种方式创建File对象,代码如下
import java.io.File;
import java.io.IOException;
public class Test {
public static void main(String[] args) {
File file = new File("E:/test/fzu","pzn.txt");
//或者
//File file = new File("E:/test","fzu/pzn.txt");
System.out.println(file.exists());
}
}
第三种方式通过父目录路径和孩子文件路径来创建File对象,其实跟第一种方式相似,第一种方式先通过父目录路径来创建出父目录对象,在通过父目录对象和孩子文件路径来创建File对象,而第三种方式直接通过父目录路径和孩子文件路径创建File对象,跳过了创建父目录对象这一步
二.方法
返回值 方法名 说明
String getParent() 返回File对象的父目录路径
String getName() 返回File对象的文件名称
String getPath() 返回File对象的文件路径
String getAbsolutePath() 返回File对象的绝对路径
String getCanonicalPath() 返回简化过的绝对路径
boolean exists() 判断File对象是否存在
boolean isDirectory 判断File对象是否是一个目录
boolean isFile() 判断File对象是否是一个文件
boolean createNewFile() 根据File对象,创建一个空文件,创建成功返回true,反之返回false
boolean delete() 根据File对象,删除该文件,若删除成功返回true,反之返回false
void deleteOnExit() 根据File对象,先标记该文件,直到jvm运行结束时删除该文件
String[] list() 返回File对象代表的目录下的所有文件名
File[] listFiles() 返回File对象代表目录下的所有文件
boolean mkdir() 创建File对象代表的目录,成功返回true,反之返回false
boolean mkdirs() 创建File对象代表的目录,如有必要,会创建中间目录,成功返回true
boolean renameto(File dest) 进行文件改名,成功返回true,反之返回false
boolean canRead() 判断用户是否对文件有可读权限
boolean canWrite() 判断用户是否对文件有可写权限
仍然引用上面的例子,我们现在的java项目路径是E:/test/fzu,这个项目下有一个txt文件,它的路径是E:/test/fzu/pzn.txt
1.分析getParent(),getName(),getPath(),getAbsolutePath(),getCanonicalPath()
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("E:/test/fzu/pzn.txt");
System.out.println(file.getParent());
System.out.println(file.getName());
System.out.println(file.getPath());
System.out.println(file.getAbsolutePath());
System.out.println(file.getCanonicalPath());
}
}
运行结果如下
父目录是E:/test/fzu,文件名称是pzn.txt,这个不难理解,文件路径,绝对路径和规范路径都是E:/test/fzu/pzn.txt,那它们有什么区别呢
让我们把代码稍作修改
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("./pzn.txt");
System.out.println(file.getParent());
System.out.println(file.getName());
System.out.println(file.getPath());
System.out.println(file.getAbsolutePath());
System.out.println(file.getCanonicalPath());
}
}
运行结果如下
这里的.代表当前目录(..代表上一目录),也就是这里的.代表的是E:/test/fzu
./这种写法就是相对路径的写法
父目录是. ,文件名称是pzn.txt
文件路径是./pzn.txt,绝对路径是E:\test\fzu\.\pzn.txt,规范路径是E:\test\fzu\pzn.txt
可以发现当用到./这样的写法时候,绝对路径不会省略这个.,而规范路径则会将.去掉
2.分析exists(),isFile(),isDirectory()
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("pzn.txt");
System.out.println(file.exists());
System.out.println(file.isFile());
System.out.println(file.isDirectory());
}
}
运行结果如下
编辑
pzn.txt是个txt文件,不是目录,且它存在于项目目录下
3.分析createNewFile(),delete(),deleteOnExit()
现在我先将pzn.txt文件删除
运行如下代码
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("E:/test/fzu/pzn.txt");
System.out.println(file.createNewFile());
}
}
结果如下
再运行如下代码
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("E:/test/fzu/pzn.txt");
System.out.println(file.delete());
}
}
结果如下
可以看到通过createNewFile()我们可以依据File对象来创建一个文件,通过delete()我们则可以依据File对象删除一个文件
对于deleteOnExit(),它的作用是在jvm结束时删除文件,这里可以用多线程演示,代码如下
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("E:/test/fzu/pzn.txt");
Thread thread = new Thread() {
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
file.deleteOnExit();
thread.start();
}
}
这段代码的效果是,在线程结束时删除pzn.txt,线程的存在时间是五秒
此时pzn.txt存在项目目录下
当启动程序后,等待五秒我们可以发现,pzn.txt被删除
4.分析mkdir(),mkdirs(),list(),listFiles()
现在项目目录下创建一个新目录newDir,代码如下
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("E:/test/fzu/newDir");
System.out.println(file.mkdir());
}
}
结果如下
在手动在newDir加p.txt,z.txt,n.txt,三个txt文件
然后调用list(),和listFiles()方法,代码如下
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("E:/test/fzu/newDir");
String[] ret1 = file.list();
File[] ret2 = file.listFiles();
System.out.println(Arrays.toString(ret1));
for (File f: ret2) {
System.out.print(f.getName() + " ");
}
}
}
结果如下
对于mkdirs(),它是在给定路径中间不存在对应目录时,会手动帮你创建目录
比如我想在项目路径E:/test/fzu下创建一个目录,它的路径是E:/test/fzu/newDir1/newDir2
因为项目路径下并没有newDir1,所以就需要使用mkdirs()来创建
5.分析renameto(File dest),canRead(),canWrite()
若我想将pzn.txt改名为p.txt,代码如下
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("E:/test/fzu/pzn.txt");
File newFile = new File("E:/test/fzu/p.txt");
System.out.println(file.renameTo(newFile));
}
}
项目目录下文件情况如下
运行代码结果如下
对于canRead()和canWrite(),它们是用来判断用户是否有可读和可写的权限,代码如下
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("E:/test/fzu/p.txt");
System.out.println(file.canRead());
System.out.println(file.canWrite());
}
}
结果如下
结束语
文件操作不难,多写几遍,差不多就可以掌握了,因为图文的限制,有些操作不好演示,大家可以自己动手敲敲,加深理解,如果我的文章有帮助到你的话,点个赞吧
如果有什么不理解也可以跟我交流交流,发现文章有错误的话也可以向我反馈
谢谢阅读!