文件操作
在Java语言中提供有文件操作系统的支持,而这个支持就这java.io.File类中进行了定义,也会是说在整个java.io包中,File类是唯一一个与文件本身操作(创建、删除、重命名等等)有关的类。如果要想进行File类操作,必须提供有完整的路径而后才可以调用相应的方法进行处理。
File类基本操作
打开JDK文档可以发现,File类是Comparable接口的子类,所以File类的对象是可以进行排序处理的。而在进行File类处理的时候需要为其设置访问路径,那么对于路径的配置主要通过File类的构造方法处理。
- 构造方法:
public File(String pathname);
,设置要操作文件完整路径 - 构造方法:
public File(File parent,String child);
,设置父路径与子目录;
使用如下方法进行文件操作:
- 创建新的文件:
public boolean createNewFile() throws IOException;
- 判断文件是否存在:
public boolean exists();
- 删除文件:
public boolean delete();
使用File类创建一个文件
import java.io.File;
public class File_Basic {
public static void main(String[] args) throws Exception {
File file = new File("C:\\Project\\Java_study\\src\\文件\\test.txt");
if(file.exists()) {
file.delete();
System.out.println("文件已删除!");
}else {
file.createNewFile(); //创建新文件
System.out.println("已创建新文件!");
}
}
}
File类实现的就是文件本身的处理。
File类操作深入
现在已经实现了文件的基础操作,但是对于这个操作里面也是存在一些问题的,下面针对之前的代码进行优化处理。
在实际的软件项目开发和运行过程之中,往往都会在Windows进行项目的开发,而在项目部署时基于Linux或Unix进行项目的发布来保证生产环境的安全性;
在不同操作系统之中存在不同路径的分隔符,Windows分隔符“\”,Linux分隔符是“/”,则此时必须考虑不同系统的分隔符问题,为了解决此问题,File类提供有一个常量:public static final String separator;
正常的路径编写
File file = new File("C:"+File.separator+"Project"+File.separator+"Java_study"+File.separator+"src"+File.separator+"文件"+File.separator+"test.txt");
随着系统适应性的不断加强,对于当前路径操作可以随意使用了。
在使用File类进行文件处理的时候需要注意:程序->JVM->操作系统函数->文件处理,所以进行同一文件重复删除或创建的时候可能会出现延迟的问题,所以此时最好的方案是不要重复命名。
进行文件创建的时候有一个重要的前提:文件父路径存在。
- 获得父路径:
public File getParentFile();
- 创建目录:
public boolean mkdir/mkdirs();
import java.io.File;
import java.io.IOException;
public class File_Inner {
public static void main(String[] args) throws IOException {
File file = new File("C:"+File.separator+"Project"+File.separator+"Java_study"+File.separator+"src"+File.separator+"文件"+File.separator+"test.txt");
if(!file.getParentFile().exists()) { //父路径不存在
file.getParentFile().mkdirs(); //创建父路径
}
if(file.exists()) {
file.delete(); //删除文件
}else {
file.createNewFile(); //创建新文件
}
}
}
这种判断并且建立父目录的操作很多情况下可能只需要一次,但是如果将这个判断一致停留在代码中,那么就会造成时间复杂度的提升,所以此时要想提升性能,要先保证目录已经创建。
获取文件信息
除了可进行文件的查找之外也可以通过File类来获取一些文件本身提供的信息,可以获取如下内容:
- 可读/写/执行:
public boolean canRead()/canWrite()/canExecute();
- 获取文件长度:
public long length();
,该方法返回的是long数据类型,字节长度。 - 最后一次修改日期时间:
public long lastModified();
- 判断是否是目录/文件:
publio boolean isDirectory()/isFile();
- 列出目录内容:
public File[] listFiles();
import java.io.File;
import java.text.SimpleDateFormat;
public class File_get {
public static void main(String[] args) {
File file = new File("C:\\Project\\Java_study\\src\\文件\\test.txt");
System.out.println(file.canRead());
System.out.println(file.canWrite());
System.out.println(file.canExecute());
System.out.println(file.length());
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(file.lastModified()));
System.out.println(file.isDirectory());
System.out.println(file.isFile());
File result [] = (new File("C:\\Project\\Java_study\\src").listFiles());
for (int x = 0; x<result.length;x++) {
System.out.println(result[x]);
}
}
}
这些信息获得的都是文件或目录本身的操作,都是不涉及到文件内容处理的。
综合案例:列出指定目录中全部文件
任意设置一个目录路径,将该目录中所有文件信息全部列出,包括子目录中所有文件,再这样的处理情况下,可利用递归形式完成。
import java.io.File;
public class Example_ls {
public static void main(String[] args) {
File file = new File("C:\\Project\\Java_study\\src"); //是一个目录
listDir(file);
}
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]); //继续依次判断
}
}
System.out.println(file);
}
}
}
综合案例:文件批量改名
编写程序,程序运行时输入目录名称,并且吧该目录下所有文件名后缀改为.txt,对于这类操作必须设置一些假设的约定,能够重命名的文件都是有后缀的,如果没有后缀为其追加后缀,如有后缀的路径,必须以最后一个后缀进行截取。
import java.io.File;
public class Example_rename {
public static void main(String[] args) {
File file = new File("C:\\Project\\Java_study\\src\\文件");
long start = System.currentTimeMillis();
renameDir(file);
long end = System.currentTimeMillis();
System.out.println("Time:"+ (end-start));
}
public static void renameDir(File file) {
if(file.isDirectory()) { //is a Dir
File result [] = file.listFiles();
if(result != null) {
for(int x =0;x<result.length;x++) {
renameDir(result[x]);
}
}
} else {
if(file.isFile()) { //is a File
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);
}
}
}
}
面试过程中经常出现给一个路径而后让你进行名称或文件的批量修改操作,就采用以上结构即可。