文件操作File类
File类的使用
java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关
File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。 如果需要访问文件内容本身,则需要使用输入/输出流
想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对 象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录
File对象可以作为参数传递给流的构造器
在使用File操作文件的时候需要先创建File对象, File的创建需要使用File的构造器
创建File的三种方式;(调用其构造器) File = new File(pathname:"文件名"); 文件名可以使用相对路径或者绝对路径 相对路径:相较于当前目录或者某一个指定的目录下的文件路径 绝对路径: 包含盘符在内的文件或文件目录的路径
使用Idea中;
如果大家开发中使用Juint中的单元测试方法测试,相对路径即为当前Module下
如果大家使用main()方法测试,相对路径即为当前Project下
使用Eclipse中
不管使用Juint还是main()方法测试,相对路径都是当前Project下
File创建的三种方式
方式一: File file = new File(文件名); // 相对路径 File file = new File("路径+名称”) // 绝对路径 方式二: File file = new File(String Parent, String Child); 以parent为父路径,child为子路径创建File对象 File file = new File("D:\\FileOne", "IO"); // 创建一个D盘下的FileOne目录下的 IO文件,其中FileOne是Parent父路径 方式 三: File file = new File(File parent, String child); 根据一个父File对象和子文件路径创建File对象 File fileOne = new File(文件1); File fileTwo = new File(fileOne, 文件2);
eg:
// 方式一 //创建一个存在的目录下的文件(绝对路径) File fileOne = new File("E:\\Tool\\Java\\BasiceCodes\\basiceCodeMay\\src\\June\\JuneNine\\JuneNineAfternoon\\TestOne.txt"); //创建一个不存在的目录下的文件,(相对路径) File fileTwo = new File("fake.txt"); //方式二 // 绝对路径创建文件 File fileThree = new File("E:\\Tool\\Java\\BasiceCodes\\basiceCodeMay\\src\\June\\JuneNine\\JuneNineAfternoon","TestTwo.txt"); // 方式三 File fileFour = new File(fileThree,"textThree.txt"); // 创建一个file3下的textThree.txt文件
// 此时还未涉及到文件真实的内容可以暂时理解为仅仅是创建了两个File对象 对象的内容是给定的文件名
// 现在只是界面的展示 还没有涉及文件内容的操纵所以 没有真实存在的文件也可以
路径分隔符
路径中的每级目录之间用一个路径分隔符隔开。 路径分隔符和系统有关: windows和DOS系统默认使用“\”来表示 UNIX和URL使用“/”来表示
Java程序支持跨平台运行,因此路径分隔符要慎用
File类的操作方法
当我们创建完File之后要操作创建的文件或者目录的话提供的有专用的方法
File类的获取功能 public String getAbsolutePath():获取绝对路径 public String getPath() :获取创建时设置的路径,如果创建时时按照相对路径,仅仅获取的时是文件名,如果创建时是按照绝对路径设置的,获取的就是绝对路径+文件名 public String getName() :获取名称 public String getParent():获取上层文件目录路径。若无,返回null public long length() :获取文件长度(即:字节数)。不能获取目录的长度。 public long lastModified() :获取最后一次的修改时间,毫秒值 如下的两个方法适用于文件目录: public String[] list() :获取指定目录下的所有文件或者文件目录的名称数组 public File[] listFiles() :获取指定目录下的所有文件或者文件目录的File数组
File类的重命名功能 public boolean renameTo(File dest):把文件重命名为指定的文件路径 File类的判断功能 public boolean isDirectory():判断是否是文件目录 public boolean isFile() :判断是否是文件 public boolean exists() :判断是否存在 public boolean canRead() :判断是否可读 public boolean canWrite() :判断是否可写 public boolean isHidden() :判断是否隐藏 File类的创建功能 public boolean createNewFile() :创建文件。若文件存在,则不创建,返回false public boolean mkdir() :创建文件目录。如果此文件目录存在,就不创建了。 如果此文件目录的上层目录不存在,也不创建。 public boolean mkdirs() :创建文件目录。如果上层文件目录不存在,一并创建 注意事项:如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目 路径下。 File类的删除功能 public boolean delete():删除文件或者文件夹 删除注意事项: Java中的删除不走回收站。 要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录
getPath()
File file = new File("E:\\Tool\\Java\\TestIo","testOne.txt"); File fileOne = new File("testTwo.txt"); System.out.println(file.getPath()); // 因为创建时按照绝对路径创建的,所以获取文件的路径也是绝对路径 , E:\Tool\Java\TestIo\testOne.txt System.out.println(fileOne.getPath()); //创建时时相对路径获取时也是相对路径 testTwo.txt
getParent()获取文件的上一级
当文件不存在时也可以获取到其父级,因为现在只是对象的创建可以理解为只是一堆字符串
当创建的文件不存在也可以获取到上一级的目录,因为当前创建仅仅是停留在界面显示,并不是操作文件内的内容 System.out.println(file.getParent()); // 获取上一级目录名称 E:\Tool\Java\TestIo File fileThree = new File("E:\\To","fake.txt"); // 创建一个不存在目录下的文件 System.out.println(fileThree.getParent()); // E:\To
length() 获取文件的长度
File fileFour = new File("File.txt"); File fileFive = new File("E:\\Tool\\Java\\TestIo","FileIo.txt"); System.out.println(fileFour.length()); // 文件不存在长度为0 System.out.println(fileFour.getPath()); // File.txt System.out.println(fileFive.length()); // 因为已经创建了文件并写入了内容所以长度为10
eg:
File file = new File("E:\\Tool\\Java\\TestIo","testOne.txt"); File fileOne = new File("testTwo.txt"); System.out.println(file.getAbsolutePath()); //获取文件的绝对路径 System.out.println(file.getPath()); // 获取文件的路径 , E:\Tool\Java\TestIo\testOne.txt System.out.println(fileOne.getPath()); // testTwo.txt System.out.println(file.getName()); // 获取文件名 System.out.println(file.getParent()); // 获取上一级目录名称 E:\Tool\Java\TestIo File fileThree = new File("E:\\To","fake.txt"); // 创建一个不存在目录下的文件 System.out.println(fileThree.getParent()); // E:\To File fileFour = new File("File.txt"); File fileFive = new File("E:\\Tool\\Java\\TestIo","FileIo.txt"); System.out.println(fileFour.length()); // 文件不存在长度为0 System.out.println(fileFour.getPath()); // File.txt System.out.println(fileFive.length()); // 因为已经创建了文件并写入了内容所以长度为10 System.out.println(fileFive.lastModified()); // 获取文件的最后操作时间 1591698031582
list()与listFiles()
两者都是查看目录下的所有的所有的文件
list() : 返回的是String[]类型 并且是只返回目录下的文件名
listFiles() : 返回的是File[] 类型,并且返回的文件名带上绝对路径
@Test public void TestFour(){ // 因为时获取的目录下的所有文件,所以当目录不存在的时候会报错空指针异常 :java.lang.NullPointerException File fileOne = new File("E:\\Tool\\Java\\TestIo"); File fileTwo = new File("JuneEightAfternoon"); // 不存在的文件 String [] strings = fileOne.list(); for (String str:strings ) { System.out.println(str.toString()); // FileIo.txt } String [] strings1 = fileTwo.list(); // 因为文件目录不存在报错 :java.lang.NullPointerException for (String s:strings1 ) { System.out.println(s.toString()); } // listFiles() 获取目录下的所有的文件只不过返回的时File[] 类型的,结果时以绝对路径的方式返回 File [] files = fileOne.listFiles(); for (File f: files ) { System.out.println(f.toString()); // E:\Tool\Java\TestIo\FileIo.txt } }
文件重命名renameTo()
renameTo(file) 把文件重名为指定的文件路径
eg : fileOne.renameTo(fileTwo);
要想保证返回为True,需要fileOne在硬盘中实际存在,而fileTwo不能实际存在
如果fileTwo存在就是会报错
/* renameTo(file) 把文件重名为指定的文件路径 eg : fileOne.renameTo(fileTwo); 要想保证返回为True,需要fileOne在硬盘中实际存在,而fileTwo不能实际存在 如果fileTwo存在就是会报错 */ @Test public void TestFive(){ File fileOne = new File("E:\\Tool\\Java\\TestIo\\File.txt"); File fileTwo = new File("E:\\Tool\\Java\\TestIo\\io.txt"); // 需要时一个假文件,如果真实存在就会报错 boolean renameTo = fileOne.renameTo(fileTwo); System.out.println(renameTo); }
File类的判断功能
@Test public void TestSix(){ File fileOne = new File("E:\\Tool\\Java\\TestIo"); System.out.println(fileOne.isDirectory()); // 判断是否时目录(文件夹) System.out.println(fileOne.isFile()); // 判断是否时文件 System.out.println(fileOne.exists()); // 判断是否存在 System.out.println(fileOne.canRead()); // 是否可读 System.out.println(fileOne.canWrite()); // 是否可写 System.out.println(fileOne.isHidden()); // 是否是隐藏 }
File文件的创建功能
createNewFile() 文件不存在的时候就创建 返回Boolean
@Test public void TestSeven() throws IOException { File fileOne = new File("E:\\Tool\\Java\\TestIo\\io.txt"); System.out.println(fileOne.createNewFile()); // 文件存在则不创建 不存在就创建 使用方法必须继承 throws IOException }
创建目录: mkdir(), mkdirs();
@Test public void TestEight(){ File fileOne = new File("E:\\Tool\\Java\\TestIo\\TestOne"); System.out.println(fileOne.mkdir()); // 创建目录 fileOne.mkdirs(); // 创建目录当此目录,如果他的上级目录也不存在也可以创建 }
delete() 删除目录或者文件
@Test public void TestNine(){ File fileOne = new File("E:\\Tool\\Java\\TestIo\\TestOne"); System.out.println(fileOne.delete()); // 删除此目录 }
File dir1 = new File("D:/IOTest/dir1"); if (!dir1.exists()) { // 如果D:/IOTest/dir1不存在,就创建为目录 dir1.mkdir(); } // 创建以dir1为父目录,名为"dir2"的File对象 File dir2 = new File(dir1, "dir2"); if (!dir2.exists()) { // 如果还不存在,就创建为目录 dir2.mkdirs(); } File dir4 = new File(dir1, "dir3/dir4"); if (!dir4.exists()) { dir4.mkdirs(); } // 创建以dir2为父目录,名为"test.txt"的File对象 File file = new File(dir2, "test.txt"); if (!file.exists()) { // 如果还不存在,就创建为文件 file.createNewFile(); }
eg:
@Test public void TestTwn() throws IOException { File fileOne = new File("E:\\Tool\\Java\\TestIo\\TestIoTest"); if(!fileOne.exists()){ // 如果不存在 fileOne.mkdirs(); System.out.println("创建成功"); }else { fileOne.delete(); System.out.println("删除成功"); } File fileTwo = new File("E:\\Tool\\Java\\TestIo","TestFile.txt"); if(!fileTwo.exists()){ // 如果不存在就创建此文件 fileTwo.createNewFile(); } }
Practices:
1: 创建一个与a.txt文件同目录下的另外一个文件b.txt
@Test public void TestEleven() throws IOException { File fileOne = new File("E:\\Tool\\Java\\BasiceCodes\\basiceCodeMay\\src\\June\\JuneNine\\JuneNineAfternoon\\a"); System.out.println(fileOne.getPath()); File fileTwo = new File(fileOne.getParent(),"b.txt"); fileTwo.createNewFile(); if(fileTwo.exists()){ System.out.println("创建成功"); } System.out.println(fileTwo.getPath()); }
2: 利用File构造器,new 一个文件目录file
1)在其中创建多个文件和目录
2)编写方法,实现删除file中指定文件的操
@Test public void TestTwelve(){ File fileOne = new File("E:\\Tool\\Java\\BasiceCodes\\basiceCodeMay\\src\\June\\JuneTen"); fileOne.mkdirs(); System.out.println("创建成功"); } @Test public void TestThirteen(){ File fileOne = new File("E:\\Tool\\Java\\BasiceCodes\\basiceCodeMay\\src\\June\\JuneTen"); System.out.println(fileOne.delete()); System.out.println("删除成功"); }
3:判断指定目录下是否有后缀名为.png的文件,如果有,就输出该文件名称
@Test public void TestFourteen(){ File fileOne = new File("E:\\Tool\\Java\\BasiceCodes\\basiceCodeMay\\src\\June\\JuneTen"); String [] str = fileOne.list(); for (String s:str ) { if(s.endsWith(".png")){ System.out.println(s); } } }
4: 遍历指定目录所有文件名称,包括子文件目录中的文件。
拓展1:并计算指定目录占用空间的大小
拓展2:删除指定文件目录及其下的所有文件
public class JuneNineAfternoonFileTestPracticeOne { public static void main(String[] args) { File fileOne = new File("E:\\Tool\\Java\\BasiceCodes\\basiceCodeMay\\src\\June\\JuneTen"); // printSubFile(fileOne); System.out.println(printSubDirectory(fileOne)); } // 递归:文件目录 /** 打印出指定目录所有文件名称,包括子文件目录中的文件 */ // 遍历指定目录所有文件名称,包括子文件目录中的文件。 public static void printSubFile(File fileOne){ File[] file = fileOne.listFiles(); for (File f:file ) { if(f.isDirectory()){ printSubFile(f); // 递归遍历 }else{ System.out.println(f.getAbsolutePath()); } } } //拓展1:并计算指定目录占用空间的大小 // file是文件,那么直接返回file.length() // file是目录,把它的下一级的所有大小加起来就是它的总大小 public static long printSubDirectory(File file){ long size = 0; if(file.isFile()){ return file.length(); }else { File [] files = file.listFiles(); for (File f: files ) { if(f.isFile()){ size += f.length(); } else { printSubDirectory(f); } } } return size; } @Test public static void printDeDirectory(File file){ if(file.isDirectory()){ File [] files = file.listFiles(); for (File f:files ) { if(f.isDirectory()){ printDeDirectory(f); } } } // 删除自己 file.delete(); } }
.