继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

File类中list和listfile用法及匿名内部类(2)

_慎独i
关注TA
已关注
手记 13
粉丝 12
获赞 641

————————下面是整个演示源代码-------------------------------------------------

[java] view plain copy
package com.lj95801.iosystem;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.regex.Pattern;

import org.junit.Test;

public class tFile1 {
/*

  • File类的构造函数有以下几种:
  • 1)、File(File parent, String child);
  • 2)、File(String pathname)
  • 3)、File(String parent, String child)
  • 4)、File(URI uri)
    */
    @Test
    public void test1(){
    //1、new File(".")构建的是当前目录的路径
    File path = new File(".");
    String[] list = path.list();
    for(String itemName : list){
    System.out.println(itemName);
    }
    //2、new File("E:\Java")利用绝对路径构建E盘下的Java目录路径
    System.out.println("--------->");
    path = new File("E:\Java");
    list = path.list();
    for(String itemName : list){
    System.out.println(itemName);
    }
    //3、new File(new File("."),"bin")表示当前目录下的bin目录
    System.out.println("--------->");
    path = new File(new File("."),"bin");
    list = path.list();//列出bin目录下的所有文件或者是文件夹
    for(String itemName : list){
    System.out.println(itemName);
    }
    }

    /*

  • list()方法 : 会返回一个字符数组,将制定路径下的文件或文件夹名(仅仅是个名字而已)存储到String数组中。有以下几种:
  • 1)、list()
  • 2)、list(FilenameFilter filter)
  • FilenameFilter filter是一个目录过滤器。list(FilenameFilter filter)方法会选择
  • 符合条件的文件或文件夹。为了能理解这个函数的工作原理,下面列出了其源码:
  • public String[] list(FilenameFilter filter) {
    String names[] = list();
    if ((names == null) || (filter == null)) {
    return names;
    }
    ArrayList v = new ArrayList();
    for (int i = 0 ; i < names.length ; i++) {
    if (filter.accept(this, names[i])) {
    v.add(names[i]);
    }
    }
    return (String[])(v.toArray(new String[v.size()]));
    }

    *我们再往前追踪一下,看看FilenameFilter到底是怎样的,同时其accept()方法又有什么作用:

  • interface FilenameFilter {

    • Tests if a specified file should be included in a file list.
    • @param dir the directory in which the file was found.
    • @param name the name of the file.
    • @return <code>true</code> if and only if the name should be
    • included in the file list; <code>false</code> otherwise.

       boolean accept(File dir, String name); 

      }

  • 我们可以看到,FilenameFilter只是一个接口,所以如果要用list(FilenameFilter filter)方法
    我们必须要实现这样的一个接口。accept()方法会返回一个boolean类型的值,list()方法会根据这个返回值
    *来决定是不是要将某个名字添加到返回列表中。所以,我们要在accept()方法中定义好挑选条件,这会用到正则表达式。

  • */

    //一、采用实现接口的方式
    class FileNameFilter1 implements FilenameFilter{
    private Pattern pattern;

    public FileNameFilter1(String regex) {  
        pattern = Pattern.compile(regex);  
    }  
    
    @Override  
    public boolean accept(File dir, String name) {  
        boolean result = pattern.matcher(name).matches();  
        return result;  
    }  

    }

    /*

  • 二、采用匿名内部类的方式。
  • 不用implements的方式来实现接口,但是定义一个静态方法,此静态方法返回一个FilenameFilter对象,
  • 本来正常的语句是return new FilenameFilter();但是在语句结束之前我说“等一下,我要在这里定义
  • 一个类,类的具体实现我用一个大括号括起来”。
    */
    static class FileNameFilter2{
    public static FilenameFilter filter(final String regex){
    return new FilenameFilter(){
    private Pattern pattern = Pattern.compile(regex);

            @Override  
            public boolean accept(File dir, String name) {  
                return pattern.matcher(name).matches();  
            }  
        };  
    }  

    }

    @Test
    public void test2(){
    System.out.println("------挑选当前目录下以.开头的文件或文件夹-------");
    //1、挑选当前目录下以.开头的文件或文件夹,并且打印出来(创建一个类来实现FilenameFilter接口)
    File path = new File(".");
    String[] nameList = path.list(new FileNameFilter1("\..*"));
    for(String itemName : nameList){
    System.out.println(itemName);
    }

    System.out.println("------挑选当前目录下以b开头的文件或文件夹-------");  
    //2、挑选当前目录下以b开头的文件或文件夹,并且打印出来(使用匿名内部类的方式来实现)  
    File path2 = new File(".");  
    String[] nameList2 = path2.list(FileNameFilter2.filter("b.*"));  
    for(String itemName : nameList2){  
        System.out.println(itemName);  
    }  
    
    System.out.println("------挑选当前目录下以s开头的文件或文件夹-------");  
    //3、将匿名内部类利用到极致  
    File path3 = new File(".");  
    String[] nameList3 = path3.list(new FilenameFilter(){//其实是在第二种方式的基础上精简过来的。  
        private Pattern pattern = Pattern.compile("s.*");  
        @Override  
        public boolean accept(File dir, String name) {  
            return pattern.matcher(name).matches();  
        }  
    });  
    for(String itemName : nameList3){  
        System.out.println(itemName);  
    }  

    }

    /*

  • list()和listFiles()方法的区别在于:list()返回的是一个String类型数组,它只是一个数组;
  • 而listFiles()方法返回的是一个File类的引用,它具有类的所有属性和方法。
  • 下面的前三个方法返回File[]类型,第四个返回static File[]类型。
  • 返回类型 : 该路径下所有文件或文件夹的绝对路径(pathname,注意File类型指的是路径,而不是文件)
  • listFiles()
  • listFiles(FileFilter filter)
  • listFiles(FilenameFilter filter)
  • listRoots()
  • */
    @Test
    public void test3(){
    System.out.println("-----判别当前目录下的文件是否为文件夹----");
    //1、列出当前目录下的所有文件和文件夹,保存为File类对象的数组,判别其是否为文件夹
    File path = new File(".");
    File[] files = path.listFiles();
    for(File f : files){
    System.out.println(f + " ---> is a Directory? " + f.isDirectory());
    }

    System.out.println("-----挑选出当前目录下的所有文件夹----");  
    //2、挑选出当前目录下的所有文件夹  
    File path2 = new File(".");  
    File[] files2 = path2.listFiles(new FileFilter(){  
        @Override  
        public boolean accept(File pathname) {  
            return pathname.isDirectory();  
        }  
    });  
    for(File f : files2){  
        System.out.println(f);  
    }  
    
    System.out.println("-----挑选出当前目录下的所有以s开头的文件夹----");  
    //2、挑选出当前目录下的所有以s开头的文件夹  
    File path3 = new File(".");  
    File[] files3 = path3.listFiles(new FileFilter(){  
        @Override  
        public boolean accept(File pathname) {  
            Pattern pattern = Pattern.compile("s.*");  
            return pathname.isDirectory()&&pattern.matcher(pathname.getName()).matches();  
        }  
    });  
    for(File f : files3){  
        System.out.println(f);  
    }  
    
    System.out.println("-----挑选出当前目录下的所有以.开头的文件夹,并且标明文件属性----");  
    //3、挑选出当前目录下以.开头的文件或文件夹,并且在其后部标明f/d标明其为文件或文件夹  
    File path4 = new File(".");  
    File[] files4 = path4.listFiles(new FilenameFilter(){  
        Pattern pattern = Pattern.compile("\\..*");  
        @Override  
        public boolean accept(File dir, String name) {  
            return pattern.matcher(name).matches();  
        }  
    });  
    for(File f : files4){  
         String sfd = (f.isFile()) ? "f" : "d";  
        System.out.println(f.getName() + "---->" + sfd);  
    }  

    }
    }

补充:
java.io.File用于表示文件(目录)<br>
File类只用于表示文件(目录)的信息(名称、大小等),不能用于文件内容的访问

file.getName()返回文件名<br>
file.getAbsolutePath()返回文件路径<br>
file.isDirectory()返回是否是目录
file.isFile()返回时否是文件
file.mkdir()创建目录<br>
file.mkdirs()创建多层子目录<br>
file.exist()返回是否文件是否存在<br>
file.delete()删除文件

文件导入一定用双斜杠//
构建file对象时对于文件的路径分隔符有三种方式 / \ file的静态变量(这个最好,适用于多种操作系系统)
package com.imooc;

import java.io.File;
import java.io.IOException;

public class FlieDemo {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    //了解构造函数的几种情况
    File file=new File("D:\\迅雷下载\\imooc");
    //System.out.println(file.exists());

    if(!file.exists())
        file.mkdir();
    //else
        //file.delete();
    //是否是一个目录,如果不是目录或目录不存在,返回false 
    System.out.println(file.isDirectory());
    //是不是一个文件
    System.out.println(file.isFile());

    //File file2=new File("D:\\迅雷下载\\imooc\\1.txt");
    File file2=new File("D:\\迅雷下载\\imooc","1.txt");
    if(!file2.exists()){
        try {
            file2.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }else
        file2.delete();

}

}

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP