[19/03/29-星期五] IO技术_File(文件)类(可操作文件,不能操作其里边内容,位于Java.io 包中)&递归遍历

一、概念

        java.io.File类:代表文件和目录。 在开发中,读取文件、生成文件、删除文件、修改文件的属性时经常会用到本类。

        以pathname为路径创建File对象,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。

        在eclipse项目开发中,user.dir就是本项目的目录。因此,执行完毕后,在本项目和D盘下都生成了新的文件(如果是eclipse下,一定按F5刷新目录结构才能看到新文件)。如图所示为:本项目目录中新增文件效果

              图8-22 本项目目录中新增文件效果.png

 【常用方法】

【代码示例】

 【代码1】

 1 /**
 2  * 测试文件类1
 3  *
 4  */
 5 package cn.sxt.test;
 6 
 7 import java.io.File;
 8 import java.math.BigDecimal;
 9 
10 public class Test_0328_FileClass {
11     public static void main(String[] args) {
12         //1、路径的表示形式   "\"、"/"就是名称分隔符   separator(:分离、分割) 建议使用"/"
13         String path="F:\\MyEclipse\\WorkSpace\\IO技术\\SongYi.jpg";
14         //  1-1:"/"的使用,推荐使用
15         String path1="F:/MyEclipse/WorkSpace/IO技术/SongYi.jpg";
16         //  1-2:用常量的拼接
17         String path2="F:"+File.separator+"MyEclipse"+File.separator+"WorkSpace" +File.separator+"IO技术"+File.separator+"SongYi.jpg";
18         
19         //System.out.println(File.separatorChar);//查看所在平台的分隔符 windows是"\"("\\"的本质是"\") linux是"/"
20         //System.out.println(path);
21         //System.out.println(path1);
22         //System.out.println(path2);
23         
24         //2、构造File对象,表示对硬盘F目录下的SongYi.jpg依托于对象file进行操作
25         
26         File file=new File(path1);//构造方法之一:里面放置个字符串路径,名称
27         File file2=new File("F:/MyEclipse/WorkSpace/IO技术/SongYi.jpg");//构造方法之二,构建File对象
28         File file3=new File("F:/MyEclipse/WorkSpace/IO技术","SongYi.jpg");//前边是父路径(F:/MyEclipse等也算父路径,逗号位置不固定),后边是文件
29         File file4=new File(new File("F:/MyEclipse/WorkSpace/IO技术"),"SongYi.jpg");//构造方法三:父对象,子路径
30         
31         System.out.println("文件大小:"+file.length()+"B");//文件的大小(大小是以字节(B)为单位返回的数字,1KB(千字节)=1024B(字节),
32         // 1B(字节)=8位(bit),  1MB(兆字节)=1024KB(千字节)
33         //扩展:BigDecimal:大小数操作类,进行四舍五入运算 Decimal:十进制的
34         BigDecimal big=new BigDecimal( (double)file.length()/1024 );
35         //参数:(!)被除数(不知道为啥又new一个对象且传入参数1,即让big对象除以1),2:表示小数点保留2位;
36         //      ROUND_HALF_UP:向(距离)最近的一边舍入,向上舍入 
37         System.out.println(big.divide(new BigDecimal(1), 2, BigDecimal.ROUND_HALF_UP)+"KB");
38         
39         
40         //3、相对路径:不存在盘符(D盘F盘等),相对于当前目录(如我在北京,默认说的是地球上中国的北京) 
41         //   绝对路径:存在盘符(详细描述自己的位置,地球中国的北京)
42         // getPath():获得当前路径(给绝对返回绝对,给相对返回相对) getAbsolutePath():都返回绝对路径
43         // getParent():将文件前的文件分隔符前边的所有路径返回去
44         String path4="F:\\MyEclipse\\WorkSpace\\IO技术\\SongYi.jpg"; //绝对路径
45         File file5=new File(path4);
46         System.out.println(file5.getAbsolutePath());//绝对路径
47         System.out.println(file5.getPath());
48         System.out.println(file5.getParent());
49         System.out.println(file5.getName());//获取文件名称
50         System.out.println(file5.getParentFile().getName());//获取上一级目录的名称
51         
52         File file6=new File("SongYi.jpg");//相对路径:没有盘符,也会默认的完整输出此图片的路径,因为它相对于当前工程去找图片
53         System.out.println(file6.getAbsolutePath());
54         System.out.println(file6.getPath());
55         System.out.println(file6.getParent());//返回为null,因为分隔符前面没有内容
56         
57         File file7=new File("SongYi2.jpg");//若是文件不存在,也会输出完整路径,但其实并没有此文件.从而说明File对象可构建对象也可构建路径
58         System.out.println(file7.getAbsolutePath());     
63     }
64 
65 }

 【代码2】

 1 /*
 2  *测试File(文件)类基本用法
 3  * 
 4  */
 5 package cn.sxt.test;
 6 import java.io.*;
 7 import java.util.Date;
 8 
 9 public class Test_0319_FileClass {
10     public static void main(String[] args) throws IOException {
11         //1、路径分隔符 windows系统 用的是"\\" Linux 是"/" 但是Java跨平台. File.separator路径分隔符常量
12         File f= new File("d:\\a.txt"); //首先手工新建一个名字为a.txt的文件,表示对硬盘d目录下的a.txt文件依托于对象f进行操作
13         System.out.println(f);
14         File f2= new File("d:\\c.txt");
15         //System.out.println("File文件改名:"+f.renameTo(f2));//借助于新对象f2把原来的a.txt文件改名为c.txt 如果目录下没有a.txt则会返回false
16         //System.out.println(f2);
17         
18         System.out.println("File是否存在:"+f.exists());//exists 存在
19         System.out.println("File是否是目录:"+f.isDirectory());//directory:号码簿,目录
20         System.out.println("File是否是文件:"+f.isFile());
21         System.out.println("File最后修改时间:"+new Date(f.lastModified()));//Modified改良的,修正的
22         System.out.println("File的大小:"+f.length());
23         System.out.println("File的文件名:"+f.getName());//获得文件名称
24         System.out.println("File的目录路径:"+f.getPath());//path:路径
25         
26         //2、Property:属性  user.dir:用户的当前工作目录(当前这个主类所在的目录) user.home:用户的主目录
27         System.out.println(System.getProperty("user.dir"));
28         File f3=new File("cc.txt");//电脑自动创建1个新文件,没有指定目录,则默认在当前主类所在目录下边,刷新后在屏幕左侧"常用类"目录下即可看到
29         f3.createNewFile();//创建新文件
30         //f3.delete(); //删除新建的cc.txt文件
31         
32         //3、创建新的目录  makedirectory:创建目录
33         File f4=new File("d:/电影/华语/大陆");
34         boolean flag=f3.mkdir();// mkdir() 若中间任何目录缺失,则创建失败 返回false
35         System.out.println(flag);
36         File f5=new File("d:/游戏/手游/王者荣耀");
37         boolean flag1=f5.mkdirs();//mkdirs() 可以允许目录缺失,电脑自动帮助创建缺失的目录
38         System.out.println(flag1);
41     }
43 }

 

 

二、递归遍历目录

【代码1】list()、listFile()  、listRoots()方法的应用

 1 /**
 2  * 使用递归算法打印文件目录
 3  *
 4  */
 5 package cn.sxt.test;
 6 import java.io.File;
 7 import java.util.*;
 8 
 9 import javax.naming.directory.DirContext;
10 
11 public class Test_0319_PrintFileTree {
12     public static void main(String[] args) {
13         File file=new File("D:/游戏");//打印 d盘"游戏"目录下边的所有目录及文件
14         //printFile(file,0);
15         countLength(file);
16         System.out.println(length);
17 
18         //1、list() 列出下一级File对象的名称 ,(仅输出此目录的下一级的名称,不往里深究)
19         String  subName[] =file.list();//把"游戏目录下"下的文件和文件夹的名称存在subName数组中
20         for (String temp : subName) {
21             System.out.println(temp);
22         }
23         System.out.println("-------");
24 
25         //2、listFile() 列出下一级File对象,不往里深究,输出绝对路径
26         File  subFiles[] =file.listFiles();//把"游戏目录下"下的文件和文件夹的对象存在subFiles数组中去
27         for (File temp : subFiles) {
28             System.out.println(temp);//遍历输出
29         }
30         System.out.println("-------");
31 
32         //3、listRoots() 列出所在电脑的所有盘符(仅列出盘符,不管里面的具体文件)
33         File  roots[] =file.listRoots();
34         for (File temp : roots) {
35             System.out.println(temp);
36         }
37 
38     }
39     //4、列出文件夹下各个文件
40     public static void printFile(File file,int level) {
41         for (int i=0; i<level; i++) { //控制层数,显的有层次感 初始值为0 不满足条件不会输出"-"
42             System.out.print("-");
43 
44         }
45         System.out.println(file.getName());
46         if (file.isDirectory()) { //首先判断是不是目录
47             File files[]=file.listFiles();//如果是返回输出该目录下的所有文件,把他们放在一个数组中去
48             for (File temp:files) { //循环遍历数组
49                 printFile(temp,level+1);//递归输出 结束条件:判断一个文件不是目录则循环结束,即已经到了叶子节点
50             }
51         }
52 
53     }
54 
55      //5、统计文件夹的大小,而它由一个一个文件构成,所以循环遍历每个文件。
56     private static long length=0;
57     public static void countLength(File file) {
58         
59         if (file!=null && file.exists()) {
60             if (file.isFile()) {//看看传进来的是否是单个文件,若是则计算其大小。 递归头
61                 length=length+file.length();//累加文件的大小
62                 
63             } else {//若不是单个文件,肯定是文件夹,则继续遍历。 递归体
64                 for (File temp : file.listFiles()) {
65                     countLength(temp);
66                 }
67             }    
68             
69         }else {
70             System.out.println("文件不存在,无法统计!");
71         }
72     }
73 
74 }

【代码2】代码1封装下,复习下对私有属性进行操作的set()和get()方法 

 1 /**
 2  * 
 3  */
 4 package cn.sxt.test;
 5 
 6 import java.io.File;
 7 
 8 public class Test_0328_PrintFile {
 9     private long length;
10     private String path; //文件夹路径
11     private File file;//源文件
12     
13     private int countFile=0;//统计下文件的个数
14     private int countDir=-1;//统计下文件夹的个数 ,要统计的是子孙文件夹的个数,但调用方法时会把父文件也给统计进去,所以初值为-1
15     
16     public Test_0328_PrintFile (String  path) {//构造方法 ,对象的初始化,this表示创建好的对象
17         this.path = path; //表示把传进来的path值赋值给全局变量的path(外边的String path)
18         this.file = new File(path); //把路径path传到对象文件file进行操作
19         countLength(this.file);//传对象文件进去到countLength()方法
20         
21     }
22     
23 
24     public static void main(String[] args) {//主方法
25         
26         Test_0328_PrintFile printFile=new Test_0328_PrintFile("D:/游戏");
27         System.out.println("文件夹大小:"+printFile.getLength()+"B \t含有文件的个数:"+printFile.getCountFile()
28                 +"\t含有文件夹的个数:"+printFile.getCountDir());
29         
30         Test_0328_PrintFile printFile2=new Test_0328_PrintFile("D:/游戏/手游");
31         System.out.println("文件夹大小:"+printFile2.getLength()+"B \t含有文件的个数:"+printFile2.getCountFile()
32                 +"\t含有文件夹的个数:"+printFile2.getCountDir());
33         
34     }
35     
36     
37     //统计文件夹的大小
38     private  void countLength(File file) {    
39         if (file!=null && file.exists()) {
40             if (file.isFile()) {//看看传进来的是否是单个文件,若是则计算其大小。 递归头
41                 length=length+file.length();//累加文件的大小
42                 this.countFile++;
43             } else {//若不是单个文件,肯定是文件夹,则继续遍历。 递归体
44                 this.countDir++;
45                 for (File temp : file.listFiles()) {
46                     countLength(temp);
47                 }
48             }        
49         }else {
50             System.out.println("文件不存在,无法统计!");
51         }
52     }
53     
54      //java中 当定义了一个私有的成员变量的时候,如果需要访问或者获取这个变量的时候,就可以编写set或者get方法去调用。
55      //set()是给属性赋值的,get()是取得属性值的 ;被设置和存取的属性一般是私有 
56      //主要是起到封装的作用,不允许直接对属性操作。  set()和get()不一定同时存在,看程序需求
57 
58     public long getLength() {
59         return length;
60     }
61 
62     public int getCountFile() {
63         return countFile;
64     }
65 
66     public int getCountDir() {
67         return countDir;
68     }
69 
70 
71 }

 

posted @ 2019-03-27 21:34  ID长安忆  阅读(238)  评论(0编辑  收藏  举报