文件(File)小结
1.文件
文件是计算机中一种基本的数据存储形式。存储在文件中的数据和内存中的数据不同。内存用于存放当前正在执行的数据和程序,但所保存的数据和程序却是暂时性的,断电则释放。之前,我们有做过简单的画图板,因为变量一般是存储在内存中的,所以程序一旦结束,这些数据就会释放。所以,我们不能直接将我们所画的图形保起来。而存储在文件中的数据是一种“持久存储”,也就是当程序退出或计算机关机以后,数据还是存在的。所以通过文件我们可以将画好的图形保存在我们的硬盘上。
File类位于java.io包中,可以通过File对象的创建文件,删除文件等操作。每个文件以一个文件路径和文件名称进行表示,在需要访问该文件的时候,只需要知道该文件的路径以及文件的全名即可。
文件(File)是最常见的数据源之一,在程序中经常需要将数据存储到文件中,例如图片文件、声音文件等数据文件,也经常需要根据需要从指定的文件中进行数据的读取。当然,在实际使用时,文件都包含一个的格式,这个格式需要程序员根据需要进行设计,读取已有的文件时也需要熟悉对应的文件格式,才能把数据从文件中正确的读取出来。
2. 绝对路径和相对路径
绝对路径是指书写文件的完整路径,是以根目录开头的路径。.使用路径可以唯一的找到一个文件,不会产生歧义。因为它是指文件或者文件夹相对于电脑系统所在的位置。独一无二的。
相对路径一般指文件或文件夹所在的位置相对于上一级目录的位置,是指不以路径分隔符开头的文件路径。在Java代码内部书写文件路径时要区分大小写。
3.文件名称
文件名称一般采用“文件名.后缀名”的形式进行命名,其中“文件名”用来表示文件的作用,而使用后缀名来表示文件的类型。其实在文件名称只是一个标示,和实际存储的文件内容没有必然的联系,只是使用这种方式方便文件的使用。和文件路径一样,在Java代码内部书写文件名称时也区分大小写,文件名称的大小写必须和操作系统中的大小写保持一致。
4.File类的属性
在File类中包含了大部分和文件操作的功能方法,该类的对象可以代表一个具体的文件或文件夹。
File类中包含了很多获得文件或文件夹属性的方法,使用起来比较方便,下面介绍一下File类的一些常见的方法。
(1)createNewFile方法
public boolean createNewFile()throws IOException
该方法的作用是创建指定的文件。该方法只能用于创建文件,不能用于创建文件夹,且文件路径中包含的文件夹必须存在。
(2)delect方法
public boolean delete()
该方法的作用是删除当前文件或文件夹。如果删除的是文件夹,则该文件夹必须为空。如果需要删除一个非空的文件夹,则需要首先删除该文件夹内部的每个文件和文件夹,然后在可以删除,这个需要书写一定的逻辑代码实现。
(3) exists方法
public boolean exists()
该方法的作用是判断当前文件或文件夹是否存在。
(4)getAbsolutePath方法
public String getAbsolutePath()
该方法的作用是获得当前文件或文件夹的绝对路径。
(5)getName方法
public String getName()
该方法的作用是获得当前文件或文件夹的名称。
(6) getParent方法
public String getParent()
该方法的作用是获得当前路径中的父路径。
(7) isDirectory方法
public boolean isDirectory()
该方法的作用是判断当前File对象是否是目录。
(8)isFile方法
public boolean isFile()
该方法的作用是判断当前File对象是否是文件。
(9) length方法
public long length()
该方法的作用是返回文件存储时占用的字节数。该数值获得的是文件的实际大小,而不是文件在存储时占用的空间数。
(10) mkdir方法
public boolean mkdir()
该方法的作用是创建当前文件文件夹,而不创建该路径中的其它文件夹。假设d盘下只有一个test文件夹,则创建d:“test“abc文件夹则成功,如果创建d:“a“b文件夹则创建失败,因为该路径中d:“a文件夹不存在。如果创建成功则返回true,否则返回false.
(11)mkdirs方法
public boolean mkdirs()
该方法的作用是创建文件夹,如果当前路径中包含的父目录不存在时,也会自动根据需要创建。
(12) renameTo方法
public boolean renameTo(File dest)
该方法的作用是修改文件名。在修改文件名时不能改变文件路径,如果该路径下已有该文件,则会修改失败。
(13) list方法
public String list()
该方法的作用是返回当前文件夹下所有的文件名和文件夹名称。说明,该名称不是绝对路径。
(14) listFiles方法
public File listFiles()
该方法的作用是返回当前文件夹下所有的文件对象。包括所以目录和真实文件。
以下是部分方法的测试:
package file; import java.io.File; public class fileTest{ //主函数 public static void main(String [] args){ fileTest f=new fileTest(); //创建当前类的对象 String path="F:\\蓝杰\\FiveChess\\src\\sall\\pand.java"; //定义一个文件的路径 File file=new File(path); //创建一个文件对象 String pa="F:\\蓝杰\\FiveChess\\sa"; //定义另外一个文件夹的路径 File file2=new File(pa); file2.mkdir(); f.Test(file); f.TestMkdir(file2); } /** * 测试方法 * @param fe 需要测试的文件对象 */ public void Test(File fe){ //判断指定文件对象指向的文件是否存在 if(fe.exists()){ System.out.println("指向的文件是存在的!"); } else System.out.println("指向的文件是不存在的!"); //输出指定的文件对象指向的文件不带路径的名字 String s=fe.getName(); System.out.println("文件的不带路径的名字为:"+s); //判断指定的文件对象指向的文件夹是否存在 if(fe.isDirectory()){ System.out.println("指向的文件夹是存在的!"); } else System.out.println("指定的文件夹是不存在的!"); //打印出文件对象指向的文件的长度 long lg=fe.length(); System.out.println("对象指向的文件的长度为:"+lg); //判断fe对象指向的文件是否真实存在 if(fe.isFile()){ System.out.println("指向的文件是真实存在的!"); } else System.out.println("指向的文件不是真实存在的!"); //从指定地点将fe指向的文件删除 if(fe.delete()){ System.out.println("从指定地点将fe指向的文件删除!"); } } /** *测试文件夹的方法 * @param file 需要测试的文件夹 */ public void TestMkdir(File file){ if(file.exists()){ file.delete(); System.out.println("小"); } else { try{ boolean b=file.createNewFile(); System.out.println("创建了指向的文件夹"+b); } catch(Exception e){ System.out.println("创建文件夹失败!"); } } } }
测试结果:
5.统计文件并过滤
第一个方法是显示某个指定文件夹下的所有文件和文件夹,原理是输出当前名称,然后判断当前File对象是文件还是文件夹,如果是,则获得该文件夹下的所有子文件和子文件夹,并递归调用该方法实现。第二个方法是过滤这个文件夹下的所有以java结尾的文件,原理是:判断是否是文件夹,如果是,则过滤其中符合要求的文件,然后递归调用该方法处理所有子文件夹,过滤并统计指定文件中的所有java文件。
package file; import java.io.File; import java.io.FilenameFilter; public class TestFile { //主函数 public static void main(String [] args){ TestFile tf=new TestFile(); //创建当前类的对象 String path="D:\\1000"; //定义一个绝对路径 File file=new File(path); //创建一个文件对象 tf.count(file); //当前对象调用count统计方法 int count=tf.reseach(path); //当前对象调用reseach过滤方法 System.out.println(path+"中java文件总共有:"+count+"个"); } /** * 统计指定的文件中的文件个数 * @param file 需要统计的文件夹 * @return 返回统计的结果 */ public int count(File file){ int counts=0; //定义一个统计文件的计数器 if(!file.exists()){ //判断文件是否是真实存在 System.out.println("文件不存在!"); return 0; } if(file.isDirectory()){ //判断文件是否是目录 System.out.println("这是一个文件目录:"+file.getAbsolutePath()); File[] subfile=file.listFiles(); //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 if(null==subfile||subfile.length==0){ //判断数组中的文件是否是目录 return 0; } for(int i=0;i<subfile.length;i++){ //遍历当前文件 if(subfile[i].isDirectory()){ //判断当前目录中的文件是否是子目录 String subdir=subfile[i].getAbsolutePath();//返回此抽象路径名的绝对路径名字符串。 System.out.println("目录:"+subdir); File fe=new File(subdir); counts+=count(fe); //递归调用,并且累计文件的个数 } if(subfile[i].isFile()){ //判断文件是否是标准文件 counts++; String fileName=subfile[i].getAbsolutePath();//返回此抽象路径名的绝对路径名字符串。 System.out.println("文件"+counts+"是:"+fileName); } } } System.out.println(file+"中总共有:"+counts+"个文件"); return counts; } /** * 统计过滤后的java文件 * @param directoryName要过滤的绝对路径 * @return 返回统计的结果 */ public int reseach(String directoryName) { int count=0;//定义一个统计过滤后文件的计数器 File dir = new File(directoryName); //创建一个指定路径的文件对象 // 确定该路径指向一个目录 if (dir.exists() && dir.isDirectory()) { // 列出所有结尾的文件 File[] subfile=dir.listFiles();//返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 File[] files = dir.listFiles(new FilenameFilter() {//过滤当前目录中的文件,得到符合要求的java文件 public boolean accept(File dir, String name) { return name.endsWith("java"); //过滤得到java结尾的文件 } }); System.out.println(); System.out.println(dir+"目录中过滤后的文件有:"); for(int j=0;j<files.length;j++){ //遍历过滤后的文件 System.out.println(files[j]); count++; } for(int i=0;i<subfile.length;i++){ //遍历当前目录中的所有文件 if(subfile[i].isDirectory()){ //判断当前目录中的文件是否是目录 String subdir=subfile[i].getAbsolutePath(); //返回此抽象路径名的绝对路径名字符串。 count+=reseach(subdir);//递归调用过滤的方法,并且累计过滤后的文件个数 } } } return count;//返回过滤后统计的文件个数 } }
测试结果: