在Java.io包之中,File类是唯一一个与文件本身操作(创建、删除、取得信息..)有关的程序类。
File类的基本使用
java.io.File类是一个普通的类,直接产生实例化对象即可。如果要实例化对象则需要使用到两个构造方法:
public File(String pathname) ;
public File(String parent, String child);//设置父路径和子路径。
如果要想进行文件的基本操作,可以使用File类的如下方法:
创建一个新文件 :
public boolean createNewFile() throws IOException
例:在指定路径下创建新文件
public class Test {
public static void main(String[] args) {
//定义要操作的文件路径
File file = new File("C:\\Users\\贵军\\Desktop\\testIO.java");
try {
file.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
File类只是创建文件本身,但是对于其内容并不做处理。
其他一些常用方法
判断文件是否存在:
public boolean exists()
删除文件:
public boolean delete()
例:编写文件的基本操作(如果文件不存在则进行创建;存在则删除)
public class Test {
public static void main(String[] args) {
//定义要操作的文件路径
File file = new File("C:\\Users\\贵军\\Desktop\\testIO.java");
if(file.exists()) { //如果文件存在
file.delete(); //则删除
} else { //文件不存在
try {
file.createNewFile(); //则进行创建
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
以上实现了最简化的文件处理操作,但是代码存在两个问题:
实际项目部署环境可能与开发环境不同。那么这个时候路径的问题就很麻烦了。windows下使用的是”\”,而Unix系统下使用的是”/”。所以在使用路径分隔符时都会采用File类的一个常量”public static final String separator “来描述。
separator由不同操作系统下的JVM来决定到底是哪个杠杠!
因此以上指定文件路径的语句就可以改写为
//定义要操作的文件路径
File file = new File(
"C:"+File.separator+"Users"+File.separator+"贵军"+
File.separator+"Desktop"+File.separator+"testIO.java");
注意:在Java中要进行文件的处理操作是要通过本地操作系统支持的,在这之中如果操作的是同名文件,就可能出现延迟的问题。(开发之中尽可能避免文件重名问题)
目录操作
File类中关于目录有如下方法:
取得父路径或父File对象:
public String getParent()
public File getParentFile()
若想创建父路径,此时最好取得父路径的File类对象。
创建目录(无论有多少级父目录,都会创建)
public boolean mkdirs()
例:Java文件目录操作
public class Test {
public static void main(String[] args) {
//separator由不同的操作系统下的JVM来决定到底是哪个杠杠!!!
File file = new File("C:"+File.separator+"Users"+File.separator+"贵军"+
File.separator+"Desktop"
+File.separator+"JavaIO"+File.separator+"bit"+File.separator+"testIO.java");
if(!file.getParentFile().exists()) { //如果文件testIO.java的父目录不存在
file.getParentFile().mkdirs(); //则有多少级父目录就创建多少级父目录
}
if(file.exists()) { //如果文件存在
file.delete(); //则进行删除
} else { //否则
try {
file.createNewFile(); //进行创建文件
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
取得文件信息
在File类里面提供有一系列取得文件信息的操作:
判断路径是否是文件: public boolean isFile();
判断路径是否是目录: public boolean isDirectory();
取得文件大小(字节): public long length();
最后一次修改日期 : public long lastModified();
例:取得文件信息
public class Test {
public static void main(String[] args) {
//要操作的文件
File file = new File("C:"+File.separator+"Users"+File.separator+"贵军"+
File.separator+"Desktop"+File.separator+"test.png");
//上面给定的父目录都存在,如果不存在则需要先创建父路径
if(file.exists() && file.isFile()) { //如果文件存在再进行操作
System.out.println("文件大小: " + file.length());
System.out.println("最后一次修改文件的日期: " + new Date(file.lastModified()));
} else { //如果文件不存在时
try {
System.out.println("文件不存在则先进行创建");
file.createNewFile(); //先进行文件创建
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(file.exists() && file.isFile()) { //再一次确定文件存在了再进行操作
System.out.println("文件大小: " + file.length());
System.out.println("最后一次修改文件的日期: " + new Date(file.lastModified()));
}
}
}
}
运行结果
以上操作都是针对文件进行信息取得,Java里也提供有如下方法列出一个目录的全部组成:
public File[] listFiles();
例:列出目录中的全部组成
public class Test {
public static void main(String[] args) {
//要操作的文件
File file = new File("C:"+File.separator+"Users"+File.separator+"贵军"+
File.separator+"Desktop");
if(file.exists() && file.isDirectory()) {
//列出目录中的全部内容
File[] files = file.listFiles();
for(File i : files) {
System.out.println(i);
}
}
}
}
综合案例(目录列表)
虽然File提供有listFiles()方法,但是这个方法本身只能够列出本目录中的第一级信息。如果要求列出目录中所有级的信息,必须自己来处理。这种操作就必须通过递归的模式来完成。
例:递归打印当前目录下所有层级的文件信息
public class Test {
public static void main(String[] args) {
//指定路径
File file = new File("C:"+File.separator+"Users"+File.separator+"贵军"+
File.separator+"Desktop"+File.separator+"JavaIO");
listAllFiles(file);
}
public static void listAllFiles(File file) {
if(file.isDirectory()) { //判断是目录就继续进入
File[] files = file.listFiles(); //继续列出子目录
for(int i = 0; i < files.length; i++) { //对每个子目录都进行递归
listAllFiles(files[i]);
}
} else { //是文件就直接打印
System.out.println(file);
}
}
}
线程阻塞问题:
现在所有代码都是在main线程下完成的,如果listAllFiles()方法没有完成,那么对于main后续的执行将无法完成。这种耗时的操作让主线程出现了阻塞,而导致后续代码无法正常执行完毕。如果不想让阻塞产生,最好再产生一个新的线程进行处理。
例:新增子线程进行耗时操作
public class Test {
public static void main(String[] args) {
//开启子线程进行处理
new Thread(()-> {
File file = new File("C:"+File.separator+"Users"+File.separator+"贵军"+
File.separator+"Desktop"+File.separator+"JavaIO");
listAllFiles(file);
}).start();
System.out.println("开始进行文件输出");
}
public static void listAllFiles(File file) {
if(file.isDirectory()) { //判断是目录就继续进入
File[] files = file.listFiles(); //继续列出子目录
for(int i = 0; i < files.length; i++) { //对每个子目录都进行递归
listAllFiles(files[i]);
}
} else { //是文件就直接打印
System.out.println(file);
}
}
}