一、File类的基本使用
总述:在Java中,File类是唯一一个与文件本身操作(文件的创建、删除、重命名等等)有关的类,要进行File类的操作,必须提供一个完整的文件路径,而后才可以调用我们相应的方法。
1、File类是Comparable接口的子类,所以File类的对象是可以进行排序处理的;
在进行File类处理的时候,要设置访问路径,对路径的配置主要通过File类的构造方法处理。
- 构造方法一:public File(String pathname); 设置要操作完整路径。
- 构造方法二:public File(File parent,String child); 设置父路径与子目录。
2、文件的基本操作有如下方法:
- 创建新的文件:public boolean createNewFile() throws IOException;
文件存在就为false,不存在就创建为true - 判断文件是否存在:public boolean exists();
- 删除文件:public boolean delete();
3、范例:使用File类创建一个文件(d:\qw.txt)
public class FileDemo{
public static void main(String[] args){
File file = new File("d:\\qw.txt"); // 构造qw.txt文件
if(file.exists()){
file.delete(); // 如果文件存在就删除
}else{
file.createNewFile(); // 文件不存在就创建新的文件
}
}
}
4、总结:File类的处理就是文件的基础操作。
二、File类的优化
1、在实际的软件开发和运行中,常会在windows中进行项目开发,而在项目部署的时候基于Linux或Unix系统开进行项目的发布以保证生产环节的安全性。
2、在不同的操作系统中会存在不同的路径分割符:
- Windows分割符:“\”,
- Linux分割符:“/”
由于分割符不同,所以在最初进行开发的时候就必须考虑不同系统环境下的分割符的问题,所以为了解决此问题,File类提供有一个常量:public static final String separator;
3、范例:正常的路径编写
File file = new File(“d:”+File.separator+”qw.txt”); // 标准
但是随着系统适应性的增强,对于当前的路径操作,也可以随意使用,比如在Windows系统中也可以使用Linux下的分割符。
File file = new File("d:/qw.txt");
4、在使用File类进行文件处理的流程:程序->JVM->操作系统函数->文件处理,所以在进行同一文件的反复删除或者创建的时候有可能会有延迟,所以最好的方案是不要重名。
5、在创建文件的时候,要注意的是父目录必须存在,
- 获取父路径:public File getParentFile();
- 创建多级目录:public boolean mkdirs();
- 创建单级目录:public boolean mkdir();
6、范例:创建父目录
public class FileDemo{
public static void main(String[] args){
File file = new File("d:"+File.separator+"LK"+File.separator+"MN"+File.separator+"qw.txt"); // 构造qw.txt文件
if(!file.getParentFile().exists()){ // 父路径不存在
file.getParentFile().mkdirs(); // 创建多级父目录
}
if(file.exists()){
file.delete(); // 如果文件存在就删除
}else{
file.createNewFile(); // 文件不存在就创建新的文件
}
}
}
7、总结:创建父目录的操作在很多情况下只需要一次,但是如果将这个判断一致停在代码中就会造成时间复杂度的提升,所以这个时候如果要想提升性能,就请先保证目录已经创建。
三、获取文件信息
1、通过File类来获取文件本身提供的信息,有以下方法:
- 文件是否可读:public boolean canRead();
- 文件是否可写:public boolean canWrite();
- 获取文件长度:public long length(); 该方法返回的是一个long数据类型;
- 最后一次修改日期时间:public long lastModified(); 一般要转换为Date类型;
- 判断是否是目录:public boolean isDirectory();
- 判断是否是文件:public boolean isFile();
- 列出目录内容:public File[] listFiles();
2、范例一:读取文件信息
// 定义一个工具类,保留两位小数
class MathUtils{
private MathUtils(){}
public static double round(double num,int scale){
return Math.round(Math.pow(10,scale)*num)/Math.pow(10,scale);
}
}
public class FileDemo{
public static void main(String[] args){
File file = new File("d:"+File.separator+"qw.txt"); // 构造qw.txt文件
System.out.printIn("文件是否可读: "+file.canRead()); // true
System.out.printIn("文件是否可读: "+file.canWrite()); // true
// file.length()/(double)1024/1024 把单位由字节变为M
System.out.printIn("文件大小: "+MathUtils.round(file.length()/(double)1024/1024,2));
}
}
3、范例二:列出目录中的全部内容
public class FileDemo{
public static void main(String[] args){
File file = new File("d:"+File.separator);
if(file.isDirectory()){ // 当前是一个目录
File result[] = file.listFiles(); // 列出目录中的全部内容
for(int x=0;x<result.length;x++){
System.out.printIn(result[x]); // 打印D盘下的全部目录
}
}
}
}
四、案例
案例一:列出制定目录中的全部文件
题目:现在可以由开发者任意设置一个目录的路径,而后将这个目录中的文件信息以及目录下的所有文件信息输出。
设计思想:使用递归
程序设计如下:
public class FileDemo{
public static void main(String[] args){
File file = new File("d:"+File.separator); // 是一个目录
listDir(file);
}
public static void listDir(File file){
if(file.isDirectory()){ // 是一个目录
File results[] = file.listFiles(); // 列出目录中的全部内容
if(results !=null){
for(int x=0;x<results.length;x++){
listDir(results[x]); // 继续依次判断
}
}
}
System.out.printIn(file); // 获取完整路径
}
}
案例二:批量修改文件名称
题目:程序运行时输入目录名称,并把该目录下的所有文件名后缀改为.txt。
设计思想:
(1) 能够重命名的文件都是有后缀的,如果没有后缀,则为其追加路径。
(2) 如果有后缀的名称,则必须以最后一个“.”进行截取。
程序设计如下:
public class FileDemo{
public static void main(String[] args){
File file = new File("d:"+File.separator); // 是一个目录
renameDir(file);
}
public static void renameDir(File file){
if(file.isDirectory()){ // 是一个目录
File results[] = file.listFiles(); // 列出目录中的全部内容
if(results !=null){
for(int x=0;x<results.length;x++){
renameDir(results[x]); // 继续依次判断
}
}
}else{
if(file.isFile()){ // 如果是文件则必须进行重命名
String fileName = null;
if(file.getName().contains(".")){
fileName = file.getName().subString(0,file.getName().lastIndexOf("."))+".txt";
}else{
fileName = file.getName()+".txt";
}
File newFile = new File(file.getParentFile(),fileName); // 新的文件名称
file.renameTo(newFile); // 重命名
}
}
}
}