File类基本操作
在Java语言里面提供有对于文件操作系统操作的支持,而这个支持就在java.io.File类中进行了定义,也就是说在整个java.io包里面,File类是唯一一个与文件本身操作(创建,删除,重命名等等)有关的类,而如果要想进行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类创建一个文件(d:\mldn.txt)
import java.io.File;
public class JavaAPIDemo08 {
public static void main(String args[]) throws Exception{
File file = new File("\\text.txt");
if(file.exists()){
System.out.println(file.delete()); // 创建新文件
}else{ // 文件不存在
System.out.println(file.createNewFile()); // 创建新文件
}
}
}
通过代码可以发现,File类实现的就是本身的处理。
File类操作深入
现在已经实现了文件的基础操作,但是对于这个操作里面也是存在有一些问题,下面针对于之前的代码进行优化处理
1.在实际的软件项目开发和运行过程之中,往往都会在window中进行项目的开发,而在项目部署的时候基于Linux或Unix系统来进行项目的发布以保证生产环节的安全性
在不同的操作系统之中会存在有不同的路径分隔符:Windows分隔符"“,Linux分隔符”/",所以在最初进行开发的时候就必须考虑不同系统环境下的分隔符的问题,所以为了解决此问题,FIle类提供有一个常量:public static final String separator
这是java早期历史遗留问题,早期很多常量用的是小写
范例:正常的路径编写 - 建议 - 虽然麻烦点但是出现不兼容问题小
public class JavaAPIDemo{
public static void main(String args[]) throws Exception{
File file = new File("C:"+ File.separator+"Users"+File.separator +"zhizcy"+File.separator+"Desktop"+File.separator+"java"+File.separator+"mldn.txt");
if(file.exists()){
System.out.println(file.delete()); // 创建新文件
}else{ // 文件不存在
System.out.println(file.createNewFile()); // 创建新文件
}
}
}
但是随着系统的适应性的不断加强,但是当前的路径操作,也可以随意使用了
public class JavaAPIDemo{
public static void main(String args[]) throws Exception{
File file = new File("C:/Users/zhizcy/Desktop/java/mldn.java");
if(file.exists()){
System.out.println(file.delete()); // 创建新文件
}else{ // 文件不存在
System.out.println(file.createNewFile()); // 创建新文件
}
}
}
2.在使用File类进行文件处理的时候需要注意的是:程序->JVM->操作系统函数->文件处理,所以在进行同一文件反复删除或创建的时候有可能会出现有延迟的问题,所以这个时候最好的方案是别重名UUID命名
3.在进行文件创建的时候有一个重要的前提:文件的父路径必须首先存在
‒ 如何获取父路径:public File getParentFile()
‒ 创建多级目录:public boolean mkdirs()
范例:标准模型
public class JavaAPIDemo{
public static void main(String args[]) throws Exception{
File file1 = new File("./文件操作/text/text1.txt");
if (!file1.getParentFile().exists()){
file1.getParentFile().mkdir();
}else {
System.out.println(file1.createNewFile());
}
}
}
这种判断并且建立父目录的操作在很多情况下可能只需要一次,但是如果将这个判断一直都停留在代码里面,就会造成时间复杂度的提升
在linux图形界面下开发往往是装逼装的不到位的傻绷子,不要去学它
用windows做服务器的人也会有但是也很少
获取文件信息
除了可以进行文件的操作之外也可以通过File类来获取一些文件本身提供的信息,可以获取如下内容
‒ 文件是否可读:public boolean canRead()
‒ 文件是否可写:public boolean canWrite()
‒ 获取文件长度:public long length(),该方法返回的是long类型数据,字节长度
‒ 最后一次修改日期时间:public long lastModified()
‒ 判断是否是目录:public boolean isDirectory()
‒ 判断是否是文件:public boolean isFile()
既然可以判断给定的路径是文件还是目录,那么就可以进一步的判断,如果发现是目录,则应该列出目录中的全部内容
‒ 列出目录内容:public File[] listFiles()
‒
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.SimpleTimeZone;
class FileUtil {
private FileUtil(){
}
public static double round(double num,int scale) {
return Math.round(Math.pow(10, scale) * num) / Math.pow(10, scale);
}
}
public class javaAPIDemo11 {
public static void main(String[] args) {
File file = new File("./文件操作/text/text.txt");
System.out.println("文件是否可读:"+file.canRead());
System.out.println("文件是否可写:"+file.canWrite());
System.out.println("文件大小:"+FileUtil.round(file.length()/(double)1024/1024,10)+"MB");
System.out.println("最后修改的时间:"+new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒sss毫秒").format(file.lastModified()));
System.out.println("路径时目录吗:"+file.isDirectory());
System.out.println("文件是否可读:"+file.isFile());
File file1= new File("./");
if (file1.isDirectory()){
File[] files = file1.listFiles();
for (File f :files) {
System.out.println(f);
}
}
}
}
这些信息的获得都是文件或目录本身的操作,都是不涉及到文件内容处理的
学习资料
阿里云开发者社区