1、File文件类
File类(描述具体文件或文件夹的类):是唯一一个与文件本身操作有关的程序类,可完成文件的创建、删除、取得文件信息等操作。但不能对文件的内容进行修改。
(1)File类的基本使用
File类只用于创建文件文身并不对其内容做任何处理。
Java.Io.File是一个普通的类,直接产生实例化对象,要想得到实例化对象则需用到其提供的构造方法。
A. File类中提供的构造方法
public File(String pathname):其中pathname位要传入对象的绝对路径。
public File(String parent, String child):设置父路径和子路径。
B. File类中的普通方法
判断文件是否存在:public boolean exists()
创建文件:public boolean createNewFile()
删除文件:public boolean delete()
package myIO; import java.io.File; import java.io.IOException; public class Test { public static void main(String[] args) { //定义要操作文件的路径 File file = new File("C:\\Users\\lenovo\\Desktop\\TestIo.java"); //查找指定文件是否存在(不存在返回false,反之亦然) System.out.println(file.exists()); try { //若指定文件不存在,则创建新文件 file.createNewFile(); //创建文件后打印文件是否存在 System.out.println(file.exists()); } catch (IOException e) { e.printStackTrace(); } //对文件进行删除 file.delete(); //进行删除操作后打印文件是否存在 System.out.println("执行删除操作后文件存在与否?"); System.out.println(file.exists()); } }
/* * 实现程序:文件不存在则创建,存在则删除 * */ public class Test{ public static void main(String[] args) throws IOException { File file = new File("C:\\\\Users\\\\lenovo\\\\Desktop\\\\TestIo.java"); if(!file.exists()) { file.createNewFile(); }else { file.delete(); } } }
上述方法应该是最简化的文件处理操作了,但是仍然存在问题:如Linux下文件路径的分隔符用“/”,而在windows下则用的是“\”;但是即便这样也不影响跨平台性,我们可以引入File类的一个常量"public static final String separator "来对其描述。
public class Test{ public static void main(String[] args) throws IOException { //利用File类的常量来设置不同操作系统下的分隔符 //separator由不同操作系统下的JVM来决定到底是"/"还是"\" String singal = File.separator; File file = new File("C"+singal+"Users"+singal+"lenovo" +singal+"Desktop"+singal+"TestIO.java"); System.out.println(file.exists()); if(file.exists()) { file.createNewFile(); }else { file.delete(); } } }
在Java中要进行文件的处理操作是要通过本地操作系统支持的,在这之中如果操作的是同名文件,就可能出现延迟的问题。(开发之中尽可能避免文件重名问题)
(2)目录操作
取得父路径:public String getParent() 返回当前的父路径
取得父File对象:public File getParentFile() 返回当前的父File对象
创建父目录: public boolean mkdirs() 有多少级就创建多少级
public class Test{ public static void main(String[] args) throws IOException { String singal = File.separator; File file = new File("G:"+singal+"lemon"+singal+"javaIO" +singal+"TestIO.java"); if(!file.getParentFile().exists()) { file.mkdirs(); } } }
若使用file.mkdirs()创建,则创建的为文件夹。而若使用file。getParentFile.mkdirs()创建时则为目录。
public class Test{ public static void main(String[] args) throws IOException { String singal = File.separator; File file = new File("G:"+singal+"lemon"+singal+"javaIO" +singal+"TestIO.java"); //判断父目录是否存在 if(!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } } }
public class Test{ public static void main(String[] args) throws IOException { String singal = File.separator; File file = new File("G:"+singal+"lemon"+singal+"javaIO" +singal+"TestIO.java"); //返回当前的父路径 System.out.println("返回当前的父路径"); System.out.println(file.getParent()); //返回当前父File对象 System.out.println("返回当前父File"); System.out.println(file.getParentFile()); //判断父目录是否存在 if(!file.getParentFile().exists()) { //创建多级目录 file.getParentFile().mkdirs(); } //若文件存在则删除 if(file.exists()) { file.delete(); }else { //文件不存在,则创建新文件 file.createNewFile(); } }
()取得文件信息
判断路径是否是文件: public boolean isFile()
判断路径是否是目录: public boolean isDirectory()
取得文件大小(字节): public long length()
最后一次修改日期 : public long lastModified()
/* * 取得文件信息 * */ public class Test{ public static void main(String[] args) { String singal = File.separator; File file = new File("G:"+singal+"lemon"+singal+"javaIO" +singal+"TestIO.java"); //判断上级目录是否为文件 System.out.println("上级目录是否为文件?"); System.out.println(file.getParentFile().isFile()); //判断当前目录是否为文件 System.out.println("该目录下是否为文件?"); System.out.println(file.isFile()); //查看当前对象是否为路径 System.out.println("当前对象为路径?"); System.out.println(file.isDirectory()); //取得文件的大小 System.out.println("当前文件的大小为:"); long length = file.length(); System.out.println(length); //取得文件的最后修改日期 System.out.println("当前文件的最后修改日期为:"); long date = file.lastModified(); System.out.println(date); } }
取得本地文件的相关信息:
/* * 列出当前目录下所有的文件 * */ public class Test{ public static void main(String[] args) { String singal = File.separator; //要操作的文件 File file = new File("C:"+singal+"Users"+singal+"lenovo"); //保证是目录且存在 if(file.exists()&&file.isDirectory()) { File[] result = file.listFiles(); for (File file2 : result) { System.out.println(file2); } } } }
我们不难发现根据File类提供的listFiles可以取得本地文件的信息,但是这样只能取得第一级目录下的相关信息。若我们想要取得所有级的信息,则需要我们自己进行递归操作处理。
/* * 打印当前目录下所有层级的文件信息 * */ public class Test{ public static void main(String[] args) { String singal = File.separator; //要操作的文件 File file = new File("D:"+singal+"Users"+singal+"lenovo"); listAllFileInfor(file); } public static void listAllFileInfor(File file) { if(file.isDirectory()) { //file对象是目录,列出子目录的信息 File[] files = file.listFiles(); for (File file2 : files) { //进行递归, listAllFileInfor(file2); } }else { //当前操作的不是目录 System.out.println(file); } } }
现在所有的代码都在main线程中执行,可以发现只有当listAllFileInfor没有执行完,main的后续操作也无法完成。正是因为这种耗时操作使得主线程出现了阻塞,而导致后续代码无法直接正常执行完毕。若不想让其别阻塞,我们需要重新起一个线程来对其进行操作。
/* * 解决阻塞main线程,另起线程 * */ public class Test{ public static void main(String[] args) { new Thread(()->{ String singal = File.separator; //要操作的文件 File file = new File("G:"+singal+"lenmon"); listAllFileInfor(file); },"输出线程").start(); System.out.println("main执行完毕"); } public static void listAllFileInfor(File file) { if(file.isDirectory()) { //file对象是目录,列出子目录的信息 File[] files = file.listFiles(); for (File file2 : files) { //进行递归, listAllFileInfor(file2); } }else { //当前操作的不是目录 System.out.println(file); } } }