Java基础—IO编程(文件操作类File)
File类
File类基本使用
File类是在整个java.io包里面唯一一个与文件本身有关的操作类,可以进行操作文件的路径指派、创建文件、删除文件,获取文件想关的内容,File类中有如下几个常用的方法
No. | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public File(String pathname) | 构造方法 | 设置要操作的文件完整路径 |
2 | public File(File parent,String child) | 构造方法 | 设置要操作文件的父目录与子文件路径 |
3 | public boolean creatNewFile()throws IOException | 方法 | 创建一个新的文件 |
4 | public boolean delete() | 方法 | 删除文件 |
5 | public boolean exists() | 方法 | 判断文件是否存在 |
使用上述的File类中的方法实现文件的创建与删除操作。
import java.io.File;
import java.io.IOException;
public class Test01{
public static void main(String[] args) throws IOException{
File file = new File("d:\\zhangdapao.txt");
if(file.exists()){
System.out.println("文件存在");
file.delete();
}else{
System.out.println("文件不存在");
file.createNewFile();
}
}
}
执行结果:D:\java\jdk-11\bin\java.exe "-javaagent:D:\IDEA\IntelliJ IDEA 2018.3.2\lib\idea_rt.jar=61086:D:\IDEA\IntelliJ IDEA 2018.3.2\bin" -Dfile.encoding=UTF-8 -classpath D:\JavaTest\out\production\Test01 zhang.da.pao.Test01
文件不存在
创建成功
Process finished with exit code 0
代码运行前d盘里面没有txt文件,上述代码运行完成后在d盘中创建了zhangdapao.txt文件,创建文件成功,再运行一次代码,查看删除情况:
import java.io.File;
import java.io.IOException;
public class Test01{
public static void main(String[] args) throws IOException{
File file = new File("d:\\zhangdapao.txt");
if(file.exists()){
System.out.println("文件存在");
while(file.delete()){
System.out.println("删除成功");
}
}else{
System.out.println("文件不存在");
while(file.createNewFile()){
System.out.println("创建成功");
}
}
}
}
执行结果:D:\java\jdk-11\bin\java.exe "-javaagent:D:\IDEA\IntelliJ IDEA 2018.3.2\lib\idea_rt.jar=61100:D:\IDEA\IntelliJ IDEA 2018.3.2\bin" -Dfile.encoding=UTF-8 -classpath D:\JavaTest\out\production\Test01 zhang.da.pao.Test01
文件存在
删除成功
Process finished with exit code 0
此时我们就可以轻松的在指定的位置实现文件的创建和删除操作啦,但从刚开始学学习Java的时候我们就知道了Java采用的是跨品台的编程模式,所以我们需要考虑不同系统的路径问题:windows路径分隔符“\”;Unix、Linux路径分隔符“/”,为了统一分隔符的使用问题,File类中提供了一个常量,定义如下:
public static final String separator;
将上述文件删除和创建代码种的分隔符使用常量“separator”来定义:
File file = new File("d:"+File.separator+"zhangdapao.txt");
文件目录操作
当前程序是在d盘进行文件的创建操作,但在很多情况下需要在一些子目录中进行文件的创建,那么在java.io包里,必须保证有父目录的情况下才可以创建文件。如果想要进行目录创建,需要使用File类中的几个方法:
No. | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public boolean mkdir() | 方法 | 只创建单级目录 |
2 | public boolean mkdirs() | 方法 | 创建多级目录 |
3 | public String getParent() | 方法 | 获取父路径信息 |
4 | public File getParent() | 方法 | 获取父路径的File实例 |
使用上述方法实现父路径的创建操作:
import java.io.File;
import java.io.IOException;
public class Test01{
public static void main(String[] args) throws IOException{
File file = new File("d:"+File.separator+"zhang"+File.separator+"da"+File.separator+"pao.txt");
if(!file.getParentFile().exists()){
System.out.println("父路不径存在");
while(file.getParentFile().mkdirs()){
System.out.println("创建父路径");
}
}
if(file.exists()){
System.out.println("文件存在");
}else{
System.out.println("文件不存在");
while(file.createNewFile()) {
System.out.println("创建文件成功");
}
}
}
}
执行结果:D:\java\jdk-11\bin\java.exe "-javaagent:D:\IDEA\IntelliJ IDEA 2018.3.2\lib\idea_rt.jar=53000:D:\IDEA\IntelliJ IDEA 2018.3.2\bin" -Dfile.encoding=UTF-8 -classpath D:\JavaTest\out\production\Test01 zhang.da.pao.Test01
父路不径存在
创建父路径
文件不存在
创建文件成功
Process finished with exit code 0
上述代码已经实现了目录下的文件创建,其中包括了一个判断父路径是否存在的语句“if(!file.getParentFile().exists())”,再多线程中,多个线程并发执行代码,判断语句会多次执行,选用静态代码块实现语句,只要判断一次即可,优化代码效率。实现方式如下:
import java.io.File;
import java.io.IOException;
public class Test01{
private static File file = new File("d:"+File.separator+"zhang"+File.separator+"da"+File.separator+"pao.txt");
static{
if(!file.getParentFile().exists()){
System.out.println("父路不径存在");
while(file.getParentFile().mkdirs()){
System.out.println("创建父路径");
}
}
}
public static void main(String[] args) throws IOException{
if(file.exists()){
System.out.println("文件存在");
}else{
System.out.println("文件不存在");
while(file.createNewFile()) {
System.out.println("创建文件成功");
}
}
}
}
获取文件信息
在File类中除了提供有基本的创建删除操作外,还存在其他的操作信息,方法如下:
No. | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public boolean canExecute() | 方法 | 是否能执行 |
2 | public boolean canRead() | 方法 | 是否能读 |
3 | public boolean canWrite() | 方法 | 是否能写 |
4 | public File getAbsoluateFile() | 方法 | 获取文件绝对路径实例 |
5 | public String getName() | 方法 | 获取文件或路径名称 |
6 | public boolean isDirectory() | 方法 | 当前路径是否为目录 |
7 | public boolean isFile() | 方法 | 当前路径是否为文件 |
8 | public long lastModified() | 方法 | 最后一次的修改日期 |
9 | public long length() | 方法 | 获取文件长度 |
File类中的返回日期long,返回的是毫秒数、文件返回的是字节数,所以数字大小巨大需要使用long型。下例实现输出文件修改日期和文件大小操作。
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test01{
public static void main(String[] args) throws IOException{
File file = new File("d:"+File.separator+"zhang"+File.separator+"da"+File.separator+"pao.txt");
System.out.println("文件修改日期" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date(file.lastModified())));
System.out.println(String.format("文件大小%5.2f",(file.length()/(double)1024/1024)));
}
}
执行结果:D:\java\jdk-11\bin\java.exe "-javaagent:D:\IDEA\IntelliJ IDEA 2018.3.2\lib\idea_rt.jar=61304:D:\IDEA\IntelliJ IDEA 2018.3.2\bin" -Dfile.encoding=UTF-8 -classpath D:\JavaTest\out\production\Test01 zhang.da.pao.Test01
文件修改日期2021-04-02 16:14:22.592
文件大小 0.00
Process finished with exit code 0
获取文件目录信息
使用File可以实现文件或目录的操作,但文件中存在子目录,File中还存在对目录中所有子目录和文件的操作方法:
No. | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public String[] list() | 方法 | 描述的是子路径信息(不包含父目录) |
2 | public File[] listFiles() | 方法 | 列出所有路径信息(File对象数组) |
下面让我们观察list()方法的使用
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
public class Test01{
public static void main(String[] args) throws IOException {
File file = new File("d:"+File.separator);
System.out.println(Arrays.toString(file.list()));
}
}
执行结果:[d:\$RECYCLE.BIN, .temp, 320722199612241211.jpeg, 360, 360Downloads,....
程序运行后会列出当前路径下的所有子路径信息,子路径信息可能是一个文件或一个目录。
使用listFiles()可以列出完整的路径
//listFiles
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
public class Test01{
public static void main(String[] args) throws IOException {
File file = new File("d:"+File.separator);
System.out.println(Arrays.toString(file.listFiles()));
}
}
执行结果:[d:\$RECYCLE.BIN, d:\.temp, d:\320722199612241211.jpeg, d:\360, d:\360Downloads,....
当前的代码可以实现将d盘种的所有目录输出,但这些目录下还有可能存在子目录,我们使用listFiles()方法,递归的把所有目录完整输出,代码如下:
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
public class Test01{
public static void main(String[] args) throws IOException {
File file = new File("d:"+File.separator);
listDir(file);
System.out.println(Arrays.toString(file.listFiles()));
}
public static void listDir(File file){
if(file.isDirectory()){
File result [] = file.listFiles();
if(result!=null){
for(int x = 0;x < result.length;x++){
listDir(result[x]);
}
}
}else{
System.out.println(file);
}
}
}
这样处理文件非常方便,但一定要慎用,如果把输出文件换成如下的代码:这样你的d盘就会递归的删除,眼睁睁看着磁盘清空,这样就Re0了,一定要慎用。
file.delete();
文件更名
还有一个常用的方法,实现文件的更名处理。
public boolean renameTo(File dest);