文件操作
在Java语言中提供了对于文件操作系统操作的支出,而这个支持就在java.io.File类中进行了定义,在java.io包中,File类时唯一一个与文件本身操作(创建、删除、重命名等)有关的类。如果要进行File的操作,必须要提供有完整的路径,然后可以调用相应的方法进行处理。
File类基本使用。
public class File extends Object implements Serializable, Comparable<File>{}
在JDK文档中可以发现,File类是Comparable接口的子类,所以在File类的对象是可以进行排序处理的。
在进行File类处理时,需要对其配置访问路径,对于路径的配置主要通过File类的构造方法处理:
- 构造方法:public File(String pathname)、设置要操作的完整路径;
- 构造方法:public File(String parent, String child)、设置父路径和子目录;
如果现在想进行文件的基本操作,可以使用如下的方法:
- 创建新文件:public boolean createNewFile() throws IOException;
- 判断文件是否已存在:public boolean exists();
- 删除文件:public boolean delete();
范例:使用File类创建一个文件
(macOS:/Users/fzc/Documents/mldn.txt)
import java.io.File;
public class JavaApiDemo {
public static void main(String[] args) throws Exception {
String path="/Users/fzc/Documents/dir1/mldn.txt";
File file = new File(path);
System.out.println("文件是否存在:" + file.exists());
boolean success = file.createNewFile();//创建文件,返回true,则返回false
if (success) {
//文件不存在并创建成功
System.out.println("文件创建成功");
} else {
//文件已存在
System.out.println("文件创建失败:文件已存在");
}
System.out.println("文件是否存在:" + file.exists());
success = file.delete();//文件删除
if (success) {
//文件删除成功
System.out.println("文件删除成功");
} else {
//文件不存在
System.out.println("文件删除失败:文件不存在");
}
System.out.println("文件是否存在:" + file.exists());
}
}
File类操作深入
1、在实际的软件项目开发和运行过程中,往往都会在Windows和macOS中进行项目的开发,而在项目部署时基于Linux或者Unix系统来进行发布以保证生产环境的安全性。
在不同的操作系统中存在不同的路径分隔符:
- Windows标准分隔符为“\”,目前也可以使用“/”;
- macOS和Linux分隔符未“/”;
所以在最初的开发时就必须考虑不同系统环境下的分隔符问题,所以为了解决此问题,File类提供有一个常量:public static final String separator;随着系统的适应性的不断加强,对于当前的路径操作,也可以比较随意的使用了。
范例:正常的路径编写
import java.io.File;
public class JavaApiDemo {
public static void main(String[] args) throws Exception {
File file = new File(File.separator + "Users" + File.separator + "fzc" + File.separator + "Documents" + File.separator + "mldn.txt");
System.out.println(file.getPath());
}
}
2、在使用File类进行文件处理时,需要注意的是:程序→JVM→操作系统函数→文件处理。所以在进行同一文件反复删除或创建的时候有可能会出现延迟的问题,所以这时最好的方案是不要重名;
3、在进行文件创建时有个重要前提:文件的父路径必须存在并且有读写权限。
如果父目录不存在则会抛出异常:
java.io.IOException: java.io.IOException: No such file or directory;
如果父目录没有读写权限则会抛出异常:
java.io.IOException: Permission denied;
- 如何获取父路径:public File getParentFile();
- 创建父目录:public boolean mkdir()、创建单级目录;
- 创建父目录:public boolean mkdirs()、创建多级目录;
import java.io.File;
public class JavaApiDemo {
public static void main(String[] args) throws Exception {
String path="/Users/fzc/Documents/dir1/mldn.txt";
File file = new File(path);
if(file.getParentFile().exists()==false){//判断父路径是否存在
file.mkdirs();//创建父路径
}
System.out.println("文件是否存在:" + file.exists());
boolean success = file.createNewFile();//创建文件,返回true,则返回false
if (success) {
//文件不存在并创建成功
System.out.println("文件创建成功");
} else {
//文件已存在或创建失败
System.out.println("文件创建失败:文件已存在");
}
System.out.println("文件是否存在:" + file.exists());
}
}
这种判断并建立父目录的操作在很多情况下只需要执行一次,但是如果将这个判断一致都停留在代码中,那么就会造成时间复杂度的提高,所以要想提升性能,请先保证目录已经创建。
获取文件信息
除了可以进行文件的操作之外,也可以通过File类来获取一些文件本身提供的信息,可以获取如下内容:
- 文件是否可读:public boolean canRead();
- 文件是否可写:public boolean canWrite();
- 文件是否可执行:public boolean canExecute();
- 获取文件长度:public long length()、该方法返回的是long数据类型;
- 最后一次修改日期时间:public long lastModified();
- 判读是否是目录:public boolean isDirectory();
- 判断是否是文件:public boolean isFile();
- 文件重命名: public boolean renameTo(File dest);
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
class MathUtil {
private MathUtil() {}
public static double round(double num, int scale) {
return Math.round(Math.pow(10, scale) * num) / Math.pow(10, scale);
}
}
class DateUtil {
private static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private DateUtil() {}
public static String formatDate(Date date) {
return sdf.format(date);
}
}
public class JavaApiDemo {
public static void main(String[] args) throws Exception {
String path = "/Users/fzc/Documents/mydir/my.JPG";
File file = new File(path);
System.out.println("文件是否可读:" + file.canRead());//true
System.out.println("文件是否可写:" + file.canWrite());//true
System.out.println("文件是否可执行:" + file.canExecute());//false
System.out.println("文件大小:" + MathUtil.round(file.length()/1024d,2)+"KB");//字节长度:51.2KB
System.out.println("最后的修改时间:"+DateUtil.formatDate(new Date(file.lastModified())));//上次修改时间最后的修改时间:2019-07-20 11:16:11
System.out.println("是否为目录?"+file.isDirectory());//false
System.out.println("是否为文件?"+file.isFile());//true
}
}
既然可以判断给的路径是文件还是目录,那么就可以进一步的判断,如果是目录,则应该列出目录中的全部内容。
- 列出目录内容:public File[] listFiles();
import java.io.File;
public class JavaApiDemo {
public static void main(String[] args) throws Exception {
String dirPath = "/Users/fzc/Documents/mydir";
File dir = new File(dirPath);
if(dir.isDirectory()){
File results[]=dir.listFiles();
for (File result:results){
System.out.println(result);
}
/**
* /Users/fzc/Documents/mydir/my.JPG
* /Users/fzc/Documents/mydir/mldn.txt
*/
}
}
}
这些信息的获得都是文件或目录自身的操作,都不涉及文件内容的操作。