Java I/O流系统之File类整理

Java I/O流系统之File类整理

  I/O指的就是程序的输入和输出,只不过这个输入和输出的对象是文件,完整的说应该是:内存输出数据到文件,文件输入数据到内存。
  I/O说白了就是持久化数据技术,让数据能够长期保存起来,以便以后再获取文件当中的数据来使用,这在程序当中是非常常见,所以学好I/O流是非常有必要的。

1.File类

File类可以用来表达一个文件夹或者文件,只需要给File类一个文件目录,File类就可以把这个文件目录对应的文件和文件夹当作成对象来进行处理,这个文件目录对应的是文件夹还是文件,需要File类当中的方法进行验证,但是还有一种特殊的情况,就是如果给File类的文件目录是不存在的,那么又怎么处理呢?其实File类也可以用来创建文件或者文件夹,如果你给它一个根本不存在文件或者文件夹的文件目录,File类可以通过某个方法来创建文件夹和文件,这对程序来说是非常重要的。

2.File类的构造方法

File(String pathname):根据一个路径得到File对象
File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象

代码示例:

    // File(String pathname):根据一个路径得到File对象
    // 把e:\\demo\\a.txt封装成一个File对象
    File file = new File("E:\\demo\\a.txt");

    // File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
    File file2 = new File("E:\\demo", "a.txt");

    // File(File parent, String child):根据一个父File对象和一个子文件目录得到File对象
    File file3 = new File("e:\\demo");
    File file4 = new File(file3, "a.txt");

    // 以上三种方式其实效果一样

    //默认当前项目的文件路径的方式:文件对象的文件路径和当前项目的文件路径是一致的
    File file5 = new File("文件1.txt");   

有关Java当中的文件路径的格式:
由于Java当中存在转义字符,类似:\r,\n,\t等
所以在表示文件路径的时候为了不与这些转义字符互相难以分辨,Java当中支持两种文件路径的表示格式

第1种:使用’/’来分隔上下级文件目录
比如:
如何表示H盘当中的”文件夹1”当中的格式为txt的文件”文件1.txt”:H:/文件夹1/文件1.txt
第2种:使用”\\”来分隔上下级文件目录
比如:
如何表示H盘当中的”文件夹1”当中的格式为txt的文件”文件1.txt”:H:\\文件夹1\\文件1.txt,这个必须掌握

3.File类的创建功能

在学习文件或者文件夹的创建功能之前,必须理解一下绝对路径和相对路径
绝对路径与相对路径的定义:
绝对路径:是指文件的详细路径,通常称之为”全路径”
相对路径:是相对于某个目标目录的路径

比如:
File file1 = new File(“H:\\aaa\\bbb\\ccc\\文件1.txt”);//绝对路径的方式创建File类对象

File file2 = new File(“文件2.txt”);//相对路径的方式创建File类对象,这个里面使用的就是相对路径,它相对的就是当前项目的文件路径

其实很简单的区别出来,带盘符的文件路径肯定是绝对路径,不带盘符的是相对路径

I.创建文件夹

调用File对象的mkdir()方法即可创建一个文件夹,mkdir()方法有个返回值,创建成功就返回true,否则返回false。
其文件夹路径就是你通过File类构造函数传入的文件路径,如果文件夹已经存在,就不创建了,返回false
如果文件夹不存在就创建,返回true。

File file = new File(“H:\\文件夹1”);
file.mkdir();

如果H盘的”文件夹1”不存在,那么就在H盘创建一个”文件夹1”,如果H盘的”文件夹1”存在,那么就不在H盘去创建”文件夹1”了

II.创建文件

每个文件都是带格式的,所以文件的重名不光只是文件名作为参照,而且格式也是算入其中的
比如:”文件1.txt”和”文件1.mkv”是同一个文件吗?答案肯定是No,所以文件的重名是指文件名和格式都一样的文件叫重名的文件

调用File对象的creatNewFile()方法即可创建一个文件,creatNewFile()方法有个返回值,创建成功就返回true,否则返回false。
其文件路径就是你通过File类构造函数传入的文件路径,如果文件已经存在,就不创建了,返回false
如果文件不存在就创建,返回true。

File file = new File(“H:\\文件夹1\\文件1.txt”);
file.creatNewFile();//此处会抛出异常,需要处理一下,try一下,或者throws都可以

如果H盘的”文件夹1”下不存在”文件1.txt”,那么就在H盘的”文件夹1”下创建”文件1.txt”,
如果H盘的”文件夹1”下存在”文件1.txt”,那么就不在H盘下的”文件夹1”下创建”文件1.txt”了

III.创建多级文件夹目录

注意:
mkdir()方法的调用和creatNewFile()方法的调用有一个值得注意的地方,就是在生成File对象的时候传入的文件路径的每一级文件夹都必须存在,
除了最后一级。

比如:
File file = new File(“H:\\文件夹1\\文件夹2\\文件1.txt”)
此File类对象传入的文件路径的级数如下:
第1级文件路径:H:\\文件夹1
第2级文件路径:H:\\文件夹1\\文件夹2
第3级文件路径:H:\\文件夹1\\文件夹2\\文件1.txt

如果此时调用creatNewFile()方法,那么第1级文件和第2级文件必须存在,否则,第1级文件不存在或者第2级文件不存在,就会出现非运行时异常
mkdir()方法也是如此,但是mkdir()方法是不会产生异常的。

所以Java的IO引入了多级目录文件的创建方式,通过mkdirs()方法调用,这种方式是不用管中间哪一级文件的存在与否,都会最终创建出指定的文件出来

比如:
File file = new File(“H:\\文件夹1\\文件夹2\\文件夹3\\文件夹4\\文件夹5\\文件1.txt”)
file.mkdirs();

第1级文件路径:H:\\文件夹1
第2级文件路径:H:\\文件夹1\\文件夹2
第3级文件路径:H:\\文件夹1\\文件夹2\\文件夹3
第4级文件路径:H:\\文件夹1\\文件夹2\\文件夹3\\文件夹4
第5级文件路径:H:\\文件夹1\\文件夹2\\文件夹3\\文件夹4\\文件夹5
第6级文件路径:H:\\文件夹1\\文件夹2\\文件夹3\\文件夹4\\文件夹5\\文件1.txt

如果中间1~5哪一级文件不存在,就会被创建出来,直到第6级文件创建出来
注意!注意!注意!通过mkdirs()方法只能创建多级的文件夹,不能创建带格式的文件,创建带格式的文件必须通过creatNewFile()来完成

什么时候文件夹和文件的重名:
当文件夹的名字和文件的全名一样的时候,就重复了,Java的IO文件系统会认为这是同一个文件,比如:
名字为”文件1.txt”的文件夹,和名字为”文件1.txt”的文件。
所以下列这段代码是永远也创建不出一个格式为”txt”,文件名为”文件1”的文件出来的,只会创建一个文件名为”文件1.txt”的文件夹出来

    File file = new File("H:\\文件夹1\\文件夹2\\文件夹3\\文件夹4\\文件夹5\\文件1.txt");
    file.mkdirs();
    try {
        file.createNewFile();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

4.文件夹或者文件的删除

Java当中的删除和手动删除是不同的,因为Java当中的删除不走回收站的
文件夹或者文件的删除功能都是通过File类对象调用delete()方法来实现的,删除成功,delete()就返回true,否则,返回false。


注意!注意!注意!注意!
在学习文件的删除功能的时候,操作一定要谨慎,运行代码的时候,要谨慎又谨慎,
Java删除文件不走回收站的,建议你自己定义几个实验用的文件,安全,妥当,
该说的都说了,强调的我也强调了,出现严重后果概不负责,运行需谨慎!


I.删除文件夹

注意:
要删除一个文件夹,请注意该文件夹内不能包含文件或者子文件夹,否则,就会删除失败。

比如:
File file = new File(“H:\\aaa\\bbb\\ccc”);
file.delete();

如果H盘的aaa文件夹下的bbb文件夹下的ccc文件夹里面不存在任何其他文件或者文件夹,那么ccc文件就会删除成功,返回true,
否则,如果H盘的aaa文件夹下的bbb文件夹下的ccc文件夹里面存在任何其他文件或者文件夹,那么ccc文件就会删除失败,返回false。

II.删除文件

注意:
如果你创建文件或者文件夹忘了写盘符路径,那么,默认在项目路径下。

File file = new File(“a.txt”);
file.delete();

File file1 = new File(“H:\\aaa\\a.txt”);
file1.delete();

5.文件夹或者文件的重命名

Java对文件夹或者文件可以重命名操作

I.如何将文件重命名呢?

调用File类对象的renameTo(File file)方法可以对指定的文件重命名,执行此操作必须保证重命名的文件一定存在,如果不存在,肯定是重命名失败的,返回false,如果存在,就会返回true。

情况1:
如果要重命名的File对象和这个File对象要改成的File对象的路径是一致的,那么就是简单的重命名功能

情况2:
如果要重命名的File对象和这个File对象要改成的File对象的路径不是一致的,那么就是剪切后重命名功能

情况1示例代码:
把项目下存在的图片文件”马云.jpg”重命名为”马云儿.jpg”

File file1 = new File("马云.jpg");  
File file2 = new File("马云儿.jpg");  
file1.renameTo(file2);  
//此段代码把项目下的图片文件"马云.jpg"重命名为"马云儿.jpg"

情况2示例代码:
把项目下的存在的图片文件”马云儿.jpg”剪切到H盘,并且重命名为”马云.jpg”

File file3 = new File("马云儿.jpg");  
File file4 = new File("H:\\马云.jpg");  
file3.renameTo(file4);    
//此段代码把项目下的图片文件"马云儿.jpg"剪切到H盘下,然后重命名为"马云.jpg"

6.File类的判断功能

判断肯定是返回的boolean值

I.文件的判断功能

public boolean isDirectory():判断是否是目录(文件夹)
public boolean isFile():判断是否是文件
public boolean exists():判断是否存在
public boolean canRead():判断是否可读
public boolean canWrite():判断是否可写
public boolean isHidden():判断是否隐藏

示例代码:

public class FileDemo {


public static void main(String[] args) {
    File file = new File("H:\\aaa\\bbb\\ccc\\文件1.txt");
    file.mkdirs();

    System.out.println("File对象的目录路径是否为文件夹路径:"+file.isDirectory());
    System.out.println("File对象的目录路径是否为文件路径:"+file.isFile());
    System.out.println("File对象的文件是否存在:"+file.exists());
    System.out.println("File对象的文件是否可读:"+file.canRead());
    System.out.println("File对象的文件是否可写:"+file.canWrite());
    System.out.println("File对象的文件是否隐藏:"+file.isHidden());


}

}

7.文件信息的获取

文件的信息有很多,比如:文件的大小,文件的创建日期,文件的路径等

I.文件信息的获取

public String getAbsolutePath():获取绝对路径
public String getPath():获取相对路径
public String getName():获取名称
public long length():获取长度。字节数
public long lastModified():获取最后一次的修改时间,毫秒值

示例代码:

public class FileDemo {


public static void main(String[] args) {
    File file = new File("H:\\aaa\\bbb\\ccc\\文件1.txt");

    System.out.println("获取File对象文件的绝对路径:" + file.getAbsolutePath());
    System.out.println("获取File对象文件的相对路径:" + file.getPath());
    System.out.println("获取File对象文件的文件名:" + file.getName());
    System.out.println("获取File对象文件的文件大小:" + file.length());
    System.out.println("获取File对象文件的最后一次修改时间(毫秒值):" + file.lastModified());

    Date date = new Date(file.lastModified());
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    System.out.println("获取File对象文件的最后一次修改日期:"+sdf.format(date));


}

}

运行结果:
获取File对象文件的绝对路径:H:\aaa\bbb\ccc\文件1.txt
获取File对象文件的相对路径:H:\aaa\bbb\ccc\文件1.txt
获取File对象文件的文件名:文件1.txt
获取File对象文件的文件大小:0
获取File对象文件的最后一次修改时间(毫秒值):1476003200603
获取File对象文件的最后一次修改日期:2016-10-09 16:53:20

II.File类的高级获取功能

public String[] list():获取指定目录下的所有文件或者文件夹的名称数组
public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组

注意:这个知识点可以用来遍历本地所有的文件,必须得掌握

如何获取H盘下的所有文件或者文件夹的名字?
方式1:通过list()方法获取

    File file = new File("H:\\");

    String[] allName = file.list();

    for(String s:allName){
        System.out.println(s);
    }

方式2:通过listFiles()方法获取

    File file = new File("H:\\");

    File[] allFile = file.listFiles();

    for(File f:allFile){
        System.out.println(f.getName());
    }

第一种方式只能获取H盘的所有的文件名,而第二种方式可以遍历H盘所有的文件并输出H盘所有文件的名字,单单只获取文件名当然第一种是可行的,但是如果
要对文件进行某些操作,比如:判断文件是否符合某个要求,然后对符合要求的文件进行某些操作,那么肯定选第二种方式

如何遍历D盘的所有文件,获取txt格式的文件呢?输出符合要求的文件的绝对路径
后面会讲到如何遍历电脑的所有可访问的文件

8.文件过滤器

如何获取符合某个要求的某个文件夹下面的所有文件?使用之前的知识是可以办到的。

比如:如何获取D盘根目录下所有格式为txt的文件呢?
思路:
步骤一:创建文件路径为D盘根目录的File类对象
步骤二:获取根目录下的所有文件对象,将其装入到一个File类数组当中
步骤三:遍历File类数组,判断如果是文件夹,则不搭理,如果为文件,则进一步判断是否格式为txt,如果为txt格式,输出即可

示例代码:

    //步骤一:创建文件路径为D盘根目录的File类对象
    File file = new File("D:\\");
    //步骤二:获取根目录下的所有文件对象,将其装入到一个File类数组当中
    File[] allFile = file.listFiles();
    //步骤三:遍历File类数组,判断如果是文件夹,则不搭理,如果为文件,则进一步判断是否格式为txt,如果为txt格式,输出即可
    for(File f:allFile){
        if(!f.isDirectory()){
            if(f.getName().endsWith(".txt")){
                System.out.println(f.getAbsolutePath());
            }
        }
    }

还有一种更加合适的方式,那就是文件过滤器的方式,
首先了解一下文件对象过滤器FileFilter的接口和文件名过滤器FilenameFilter,
文件过滤器可以筛选出符合某些条件的文件对象

如何使用文件过滤器来获取D盘根目录下所有格式为txt的文件呢?
步骤一:创建文件路径为D盘根目录的File类对象
步骤二:实现文件过滤器接口,生成实现文件过滤器接口的对象
步骤三:把生成实现文件过滤器接口的对象传给list()方法或者listFiles()方法,并且获得一个String[]数组或者File[]数组
步骤四:遍历数组,输出结果

调用list()方法的文件过滤器方式:

    //步骤一:创建文件路径为D盘根目录的File类对象
    File file = new File("D:\\");
    //步骤二:实现文件过滤器接口,生成实现文件过滤器接口的对象
    //步骤三:把生成实现文件过滤器接口的对象传给list()方法,并且获得一个String[]数组
    String[] all = file.list(new FilenameFilter() {

        @Override
        public boolean accept(File dir, String name) {
        return  !new File(dir.getAbsolutePath()+"\\"+name).isDirectory()&&
                name.endsWith(".txt");
        }

    }); 

    //步骤四:遍历数组,输出结果
    for(String s:all){
        System.out.println(s);
    }

调用listFile()方法的文件过滤器方式:

    //步骤一:创建文件路径为D盘根目录的File类对象
    File file = new File("D:\\");
    //步骤二:实现文件过滤器接口,生成实现文件过滤器接口的对象
    //步骤三:把生成实现文件过滤器接口的对象传给listFiles()方法,并且获得一个File[]数组
    File[] allFile = file.listFiles(new FileFilter() {

        @Override
        public boolean accept(File pathname) {

         return !pathname.isDirectory()&&pathname.getName().endsWith(".txt");

        }
    });

    //步骤四:遍历数组,输出结果
    for(File f:allFile){
        System.out.println(f.getAbsolutePath());
    }

9.使用递归遍历整个目录下的所有文件

用过管家的都知道,如何去获取电脑或者移动设备的所有文件信息呢,判断哪些是文件夹,视频文件,音频文件,文档文件等。

I.什么是递归?

学过C语言的都知道递归是个很好的解决多循环的一系列问题,说得简单点就是方法调用它自身的一种现象,
比如:
1.解决任意的区间累加问题,比如1到100的相加,并输出最后的结果,代码实现如下:

public class DiGui {

    public static int add(int a,int b){
        if(a<b)
        a = (a++)+add(a,b);

        return a;   

    }



    public static void main(String[] args) {
        System.out.println(add(1,100));
    }

}

2.解决任意区间的累积问题,比如1到100的相乘,并输出最后的结果,代码实现如下:

public class DiGui {

    public static int cheng(int a,int b){
        int result = 1;
        if(a<=b)
        result =  a*cheng(++a,b);

        return result;  

    }

    public static int jieCheng(int num){
        return cheng(1,num);
    }

    public static void main(String[] args) {
        System.out.println(cheng(1,100));//区间求累积
        System.out.println(jieCheng(100));//求100的阶乘 
    }

}

3.解决不死神兔的问题
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?
列出各个月的兔子数:
第1个月:1
第2个月:1
第3个月:2
第4个月:3
第5个月:5
第6个月:8
第7个月:13
第8个月:21
……
发现规律:当前月的总兔子对数等于前两个月的兔子对数之和
而第1个月和第2个月是特殊的两个月,因为,第一对兔子还生崽儿

public static int birthNum(int mon){   

    if(mon == 0||mon == 1){
        return 1;//头两个月兔子对数为1
    }
    else{
        return birthNum(mon-2)+birthNum(mon-1);//后面的几个月的兔子总对数等于前两个月的总对数之和
    }

}

看看不使用递归的代码,当然不使用递归的方法有很多种,我的这种不是唯一最好的设计方法,凑合凑合:

public static int birthNum(int mon){
   int result = 1;//记录当前月兔子的总对数
   int bNum   = 0;//记录当前月可以出生的兔子对手

  if(mon == 1||mon == 2){
      result = 1;
  }else{
    bNum = 1;//第3月能出生的兔子对数的更新
    for(int i = 3;i<=mon;i++){

        if((i-3)/2>0){//第5,7,9.......月对出生的兔子的对数的更新
            bNum = result - bNum;//当月能出生的兔子数 = 上个月兔子的总对数 - 上个月兔子的出生的对数
        }

        result = bNum + result;//当月的兔子总对数等于本月出生的兔子对数加上上个月的兔子总对数
    }

  }
    return result;
}

从以上三个例子提取递归的设计思想:
合并法和分解法

就是由多个简单的问题合并成复杂的问题
比如从1加到100,可以看作是:
1 + 2 + 3 + 4 + 5 + 6 + 7 +……+100

(0+1)+(1+1)+(2+1)+(3+1)+(4+1)+(5+1)+(6+1)+……+(99+1)
可以发现
1.每个括号里面的第一个加数是前面一个相加的结果
2.每个括号的第二个加数都是1

那么可以这么用变量算式去代替当前的结果
上一个的计算结果 + 1 = 当前的计算结果

累和可以这么表示:
上一个累和的结果+ 当前的计算结果 = 当前累和的结果

分析一下列代码:

public static int add(int a,int b){
    if(a<b)
    a = (a++)+add(a,b);

    return a;   

}

a++:先执行,后再加1,可以看作是先拿到上一个的结果a,然后a再加1,成为下一个的第一个加数

a的初值为1
第1次执行:a = 1 + add(2,100);
第2次执行:a = 1 + 2 + add(3,100);
第3次执行:a = 1 + 2 + 3 + add(4,100);
……
第100次执行:a = 1 + 2 + 3 + 4 + 5 + 6 + 7 + …… + 100 + add(101+100);
第101次执行:return a = 1 + 2 + 3 + 4 + 5 + 6 + 7 + …… + 100;
由此可见,该代码可以算出1到100的累加
代码的设计可以有很多种,并不是唯一的,但是分析的过程是类似的,比如我使用的其他从1到100的累加方式:

方式2:

public static int add(int a,int b){
    if(a<b)
    a = a+add(++a,b);

    return a;   

}

方式3:

public static int add(int a,int b){
    int result = 0;
    if(a<=b)
    result = a+add(++a,b);

    return result;  

}

方式有很多,所以自己分析分析,慢慢调试调试就可以写出来了

II.使用递归遍历指定目录下的所有文件

[1]遍历某个指定目录的所有文件,并输出目录下每个文件的绝对路径
步骤:
1.生成对应的指定目录File对象,判断是否存在,不存在,就输出不能获取该目录下的所有文件,因为目录本身为空
2.判断File对象的文件路径对应的文件是否为文件夹,如果是,输出这个文件夹的绝对路径继续后面的步骤,如果不是,则输出这个文件的绝对路径
3.使用listsFile()方法获取指定目录下所有的文件,然后遍历这个File[]数组,如果是文件夹File对象,输出这个文件夹对象的绝对路径,然后递归调用方法本身,把该文件夹的绝对路径传给递归的方法,如果是文件,那么输出这个文件的绝对路径即可

public static void allFile(String pathName){
    //步骤1
    File file = new File(pathName);
    if(!file.exists()){System.out.println("不能获取该目录下的所有文件,因为目录本身为空!");return ;}

    //步骤2
    if(!file.isDirectory()){System.out.println(file.getAbsolutePath());}
    else{
        System.out.println(file.getAbsolutePath());

    //步骤3   
    File[] ff = file.listFiles();

      for(File f:ff){
        if(f.isDirectory()){allFile(f.getAbsolutePath());}
        else{System.out.println(f.getAbsolutePath());}
      }
    }   
}

public static void main(String[] args) {
    allFile("H:\\我的文档工作架");
}

[2]遍历某个指定目录的所有文件,并把该目录下的所有txt格式删除掉,并输出被删除掉的文件的绝对路径
步骤:
1.生成对应的指定目录File对象,判断是否存在,不存在,就输出不能获取该目录下的所有文件,因为目录本身为空
2.判断File对象的文件路径对应的文件是否为文件夹,如果是,继续后面的步骤,如果不是,判断这个文件是否为txt格式的,如果是就删除,然后输出该文件的绝对路径
3.使用listsFile()方法获取指定目录下所有的文件,然后遍历这个File[]数组,如果是文件夹File对象,然后递归调用方法本身,把该文件夹的绝对路径传给递归的方法 如果是文件,那么就判断这个文件是否为txt格式的,如果是就删除,然后输出该文件的绝对路径

public static void allFile(String pathName){
    //步骤1
    File file = new File(pathName);
    if(!file.exists()){System.out.println("不能删除该目录下的所有的txt格式文件,因为目录本身为空!");return ;}

    //步骤2
    if(!file.isDirectory()){
        if(file.getName().endsWith(".txt")){
        System.out.println(file.getAbsolutePath());
        file.delete();
        }
    }
    else{
    //步骤3   
    File[] ff = file.listFiles();

      for(File f:ff){
        if(f.isDirectory()){allFile(f.getAbsolutePath());}
        else{
            if(f.getName().endsWith(".txt")){
            System.out.println(f.getAbsolutePath());
            f.delete();
            }}
      }
    }   
}

public static void main(String[] args) {
    allFile("H:\\aaa");
}

[3]删除指定目录下的所有文件,包括指定的目录本身,并输出所有文件的绝对路径,绝对路径后面加上”已删除”,由于文件夹的删除要考虑情况,如果文件夹里面存在文件,那么肯定的是delete()方法是删除不掉的,只有文件夹为空的时候才能删除掉,这样程序设计就会有些难度了,如何解决呢?看下面步骤:
1.生成对应的指定目录File对象,判断是否存在,不存在,就输出不能获取该目录下的所有文件,因为目录本身为空
2.判断File对象的文件路径对应的文件是否为文件夹,如果是,继续后面的步骤,如果不是就删除,然后输出该文件的绝对路径+”[已经删除]”,等后面的步骤执行完,回头在把这个文件夹删除,并输出这个文件夹的绝对路径+”[文件夹已经删除]”
3.使用listsFile()方法获取指定目录下所有的文件,然后遍历这个File[]数组,如果是文件夹File对象,然后递归调用方法本身,把该文件夹的绝对路径传给递归的方法,如果是文件就删除,然后输出该文件的绝对路径+”[文件夹已经删除]”

public static void allFile(String pathName){
    //步骤1
    File file = new File(pathName);
    if(!file.exists()){System.out.println("不能删除该目录下的所有文件及该目录本身,因为目录本身为空!");return ;}

    //步骤2
    if(!file.isDirectory()){
        file.delete();
        System.out.println(file.getAbsolutePath()+"[已经删除]");

    }
    else{
    //步骤3   
    File[] ff = file.listFiles();

      for(File f:ff){
        if(f.isDirectory()){allFile(f.getAbsolutePath());}
        else{
            f.delete();//此处删除文件
            System.out.println(f.getAbsolutePath()+"[文件已经删除]");}
      }
    }   
    file.delete();//此处删除文件夹
    System.out.println(file.getAbsolutePath()+"[文件夹已经删除]");
}

public static void main(String[] args) {
    allFile("H:\\aaa");
}

某些文件是没有访问的权限,当你遍历一个文件目录下的所有文件的时候,如果遍历到一个没有访问权限的文件或者文件夹,那么就会出现运行时异常,程序就会在异常的位置停止!


注意!注意!注意!不要拿盘根目录去做测试,后果自己负责的,删除是不走回收站的,操作需谨慎,运行需谨慎!
注意!注意!注意!不要拿盘根目录去做测试,后果自己负责的,删除是不走回收站的,操作需谨慎,运行需谨慎!
注意!注意!注意!不要拿盘根目录去做测试,后果自己负责的,删除是不走回收站的,操作需谨慎,运行需谨慎!
注意!注意!注意!不要拿盘根目录去做测试,后果自己负责的,删除是不走回收站的,操作需谨慎,运行需谨慎!
注意!注意!注意!不要拿盘根目录去做测试,后果自己负责的,删除是不走回收站的,操作需谨慎,运行需谨慎!
其实拿盘根目录做删除处理,也不能把全部的文件删除掉,只能删除部分,什么原因,上面说了,自己研究研究吧!不过,还是建议操作需谨慎,运行需谨慎!


猜你喜欢

转载自blog.csdn.net/ClAndEllen/article/details/71106998