API基础02

File类
File类的每一个实例可以表示硬盘(文件系统)中的一个文件或目录(实际上表示的是一个抽象路径)
使用File可以做到:

- 1:访问其表示的文件或目录的属性信息,例如:名字,大小,修改时间等等
- 2:创建和删除文件或目录
- 3:访问一个目录中的子项

但是File不能访问文件数据.

public class FileDemo {
    public static void main(String[] args) {
        //使用File访问当前项目目录下的demo.txt文件
        /*
            创建File时要指定路径,而路径通常使用相对路径。
            相对路径的好处在于有良好的跨平台性。
            "./"是相对路径中使用最多的,表示"当前目录",而当前目录是哪里
            取决于程序运行环境而定,在idea中运行java程序时,这里指定的
            当前目录就是当前程序所在的项目目录。
         */
         /*
          实际开发中我们不会使用绝对路径。虽然清晰明了,但是不利于跨平台。

            相对路径有更好的跨平台性,但是具体位置要看程序运行环境而定。
            例如:
            "./":当前目录,对于IDEA而言,该目录是当前程序所在的项目目录。
         */
//        File file = new File("c:/xxx/xxx/xx/xxx.txt");
        File file = new File("./demo.txt");
        //获取名字
        String name = file.getName();
        System.out.println(name);
        //获取文件大小(单位是字节)
        //字母是一个字节,汉字是四个字节
        long len = file.length();
        System.out.println(len+"字节");
        //是否可读可写
        boolean cr = file.canRead();
        boolean cw = file.canWrite();
        System.out.println("是否可读:"+cr);
        System.out.println("是否可写:"+cw);
        //是否隐藏
        boolean ih = file.isHidden();
        System.out.println("是否隐藏:"+ih);

    }

}

#####  创建一个新文件

createNewFile()方法,可以创建一个新文件

package file;

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

/**
 * 使用File创建一个新文件
   创建文件的前提是该文件所在的目录必须存在,如果目录不存在则创建时会抛出异常:
   java.io.IOException: 系统找不到指定的路径。
 */
public class CreateNewFileDemo {
    public static void main(String[] args) throws IOException {
        //在当前目录下新建一个文件:test.txt
        File file = new File("./test.txt");
        //File file = new File("./mydir/test.txt");
        //boolean exists()判断当前File表示的位置是否已经实际存在该文件或目录
        if(file.exists()){
            System.out.println("该文件已存在!");
        }else{
            file.createNewFile();//将File表示的文件创建出来
            System.out.println("文件已创建!");
        }

    }
}

#####  删除一个文件

delete()方法可以将File表示的文件删除

package file;

import java.io.File;

/**
 * 使用File删除一个文件
 */
public class DeleteFileDemo {
    public static void main(String[] args) {
        //将当前目录下的test.txt文件删除
        /*
            相对路径中"./"可以忽略不写,默认就是从当前目录开始的。
         */
        File file = new File("test.txt");
        if(file.exists()){
            file.delete();
            System.out.println("文件已删除!");
        }else{
            System.out.println("文件不存在!");
        }
    }
}

#####  创建目录


mkDir():创建当前File表示的目录

mkDirs():创建当前File表示的目录,同时将所有不存在的父目录一同创建

/**
 * directory:目录
 * make:做
 * 注:mkdir是linux中的一条命令。就是make directory的简写,意思是创建目录
 *
 * 使用File创建一个目录
 */
public class MkDirDemo {
    public static void main(String[] args) throws IOException {
        //在当前目录下新建一个目录:demo
//        File dir = new File("./demo");
        File dir = new File("demo");

//        File dir = new File("./a/b/c/d/e/f/demo");

        if(dir.exists()){
            System.out.println("该目录已存在!");
        }else{
//            dir.mkdir();//创建目录时要求所在的目录必须存在,否则创建失败
            dir.mkdirs();//会一同将不存在的父目录全部创建出来(推荐使用该方法)
            System.out.println("该目录已创建!");
        }
    }
}

##### 删除目录

delete()方法可以删除一个目录,但是只能删除空目录

package file;

import java.io.File;

/**
 * 删除一个目录
 */
public class DeleteDirDemo {
    public static void main(String[] args) {
        //将当前目录下的demo目录删除
        File dir = new File("demo");
//        File dir = new File("a");
        if(dir.exists()){
            dir.delete();//delete方法删除目录时只能删除空目录
            System.out.println("目录已删除!");
        }else{
            System.out.println("目录不存在!");
        }
    }
}

#####  访问一个目录中的所有子项

listFiles方法可以访问一个目录中的所有子项

package file;

import java.io.File;

/**
 * 访问一个目录中的所有子项
 */
public class ListFilesDemo1 {
    public static void main(String[] args) {
        //获取当前目录中的所有子项
        File dir = new File(".");//表示当前目录
        /*
            boolean isFile()
            判断当前File表示的是否为一个文件
            boolean isDirectory()
            判断当前File表示的是否为一个目录
         */
        if(dir.isDirectory()){
            /*
                File[] listFiles()
                将当前目录中的所有子项返回。返回的数组中每个File实例表示其中的一个子项
             */
            File[] subs = dir.listFiles();
            System.out.println("当前目录包含"+subs.length+"个子项");
            for(int i=0;i<subs.length;i++){
                File sub = subs[i];
                System.out.println(sub.getName());
            }
        }
    }
}

#####  获取目录中符合特定条件的子项

重载的listFiles方法:File[] listFiles(FileFilter)

该方法要求传入一个文件过滤器,并仅将满足该过滤器要求的子项返回。

/**
 *
 * filter:过滤器
 * accept:接受
 * contains:包含
 *
 * 有条件的获取一个目录中的子项
 *
 * File有一个重载的listFiles方法,允许我们传入一个文件过滤器,并在该过滤器上定义过滤
 * 条件,之后listFiles执行完毕会将目录中所有满足过滤器要求的子项进行返回
 */
public class ListFilesDemo2 {
    public static void main(String[] args) {
        //获取当前目录中名字里含有字母"o"的子项
        File dir = new File(".");
        if(dir.isDirectory()){
            /*
                File listFiles(FileFilter filter)
             */
            FileFilter filter = new FileFilter() {
                public boolean accept(File file) {
                    System.out.println("正在过滤:"+file.getName());
                    return file.getName().contains("o");
                }
            };
            /*
                File[] listFiles(FileFilter filter)
                该方法会将该目录中每一个子项都作为参数先传给filter的accept方法,
                只有accept方法返回为true的子项最终才会被包含在返回的File[]数组
                中进行返回。
             */
            File[] subs = dir.listFiles(filter);
            System.out.println("共:"+subs.length+"个子项");
            for(int i=0;i<subs.length;i++){
                File sub = subs[i];
                System.out.println(sub.getName());
            }
        }
    }
}

class MyFilter implements FileFilter{
    @Override
    public boolean accept(File file) {
        //过滤条件是名字中含有"o"的
        String name = file.getName();//获取该file表示的文件或目录的名字

//        String regex = ".*o.*";//正则表达式写法
//        boolean match = name.matches(regex);

//        name.indexOf("o")>=0;

        return name.contains("o");
    }
}

### Lambda表达式

JDK8之后,java支持了lambda表达式这个特性.

- lambda可以用更精简的代码创建匿名内部类.但是该匿名内部类实现的接口只能有一个抽象方法,否则无法使用!
- lambda表达式是编译器认可的,最终会将其改为内部类编译到class文件中

package lambda;

import java.io.File;
import java.io.FileFilter;

/**
 * JDK8之后java支持了lambda表达式这个特性
 * lambda表达式可以用更精简的语法创建匿名内部类,但是实现的接口只能有一个抽象
 * 方法,否则无法使用。
 * lambda表达式是编译器认可的,最终会被改为内部类形式编译到class文件中。
 *
 * 语法:
 * (参数列表)->{
 *     方法体
 * }
 */
public class LambdaDemo {
    public static void main(String[] args) {
        //匿名内部类形式创建FileFilter
        FileFilter filter = new FileFilter() {
            public boolean accept(File file) {
                return file.getName().startsWith(".");
            }
        };

        FileFilter filter2 = (File file)->{
            return file.getName().startsWith(".");
        };

        //lambda表达式中参数的类型可以忽略不写
        FileFilter filter3 = (file)->{
            return file.getName().startsWith(".");
        };

        /*
            lambda表达式方法体中若只有一句代码,则{}可以省略
            如果这句话有return关键字,那么return也要一并省略!
         */
        FileFilter filter4 = (file)->file.getName().startsWith(".");
    }
}

精简程序的步骤

package lambda;
/*
    lambda表达式
    lambda可以使程序员面向函数编程
    可以使更精简的语法创建匿名内部类
    但是lambda创建匿名内部类是要求所实现的接口只能有一个抽象方法
    语法:
    (参数列表)->{
      方法体
     }
     */
     //改进前的匿名内部类:
     /*
     FileFilter filter = new FileFilter() {
                @Override
                public boolean accept(File file) {
                    return file.getName().contains("o");
                }
            };
      */
      //改进后的匿名内部类:
      /*
      FileFilter filter = (File file)-> {
                    return file.getName().contains("o");
            };
       */
      //参数类型可以忽略不写
      /*
      FileFilter filter = (file)-> {
                    return file.getName().contains("o");
            };
       */
      //参数如果只有一个,()可以进一步省略
      /*
      FileFilter filter = file-> {
                    return file.getName().contains("o");
            };
       */
       //如果方法体内只有一条语句,则进一步省略{};和return
       /*
      FileFilter filter = file-> file.getName().contains("o");
       */

import java.io.File;
import java.io.FileFilter;

public class LambdaDemo {
    public static void main(String[] args) {
        //获取当前目录中名字里面含有字母"o"的子项
        File dir = new File(".");
        if(dir.isDirectory()){
            FileFilter filter = (File file)-> {
                String name = file.getName();
                System.out.println("正在过滤:"+name);
                    return file.getName().contains("o");
            };
            File[] subs = dir.listFiles(filter); //回调
            System.out.println("共多少子项"+subs.length);
            for(int i=0;i< subs.length;i++){
                File sub = subs[i];
                System.out.println(sub.getName());
            }
        }

    }
}
package file;
//有条件的获取一个目录中的子项

import java.io.File;
import java.io.FileFilter;

/**
 *
 * f
 * 有条件的获取一个目录中的子项
 *
 * File有一个重载的ListFiles方法 允许我们传入一个文件过滤器,并在该过滤器上定义过滤条件
 * 之后ListFiles执行完毕会将目录中的所有满足条件的过滤器要求的子项进行返回
 */
public class ListFilesDemo2 {
    public static void main(String[] args) {
        //获取当前目录中名字里面含有字母"o"的子项
        /*
        File dir = new File(".");
        if(dir.isDirectory()){
            FileFilter filter = new FileFilter() {
                @Override
                public boolean accept(File file) {
                    return file.getName().contains("o");
                }
            };
            File[] subs = dir.listFiles(filter); //回调
            System.out.println("共多少子项"+subs.length);
            for(int i=0;i< subs.length;i++){
                File sub = subs[i];
                System.out.println(sub.getName());
            }
        }

         */
        File dir = new File(".");
        if(dir.isDirectory()){
            File[] subs = new File(".").listFiles(file -> file.getName().contains("o")); //回调
            System.out.println("共多少子项"+subs.length);
            for(int i=0;i< subs.length;i++){
                File sub = subs[i];
                System.out.println(sub.getName());
            }
        }

    }
}
package file;

import java.io.File;
import java.io.FileFilter;

//获取
public class Test {
    public static void main(String[] args) {
        File file = new File("./src/file");//定义目录
        if(file.isDirectory()){
            FileFilter filter = new FileFilter() {
                @Override
                public boolean accept(File pathname) { //这里参数进去的是每一个文件
                    String name = pathname.getName();
                    System.out.println("正在过滤:"+name);
                    return pathname.getName().startsWith("D");
                }
            };
            File[] subs = file.listFiles(filter);//listFiles拿到每个子项,将每个子项都通过filter过滤一遍。
            System.out.println("多少子项:"+subs.length);
            for(int i=0;i<subs.length;i++){
                File sub = subs[i];
                System.out.println(sub.getName());
            }
        }
    }
}
/**
 * 获取./src/file目录下所有名字以"D"开头的子项
 */
public class Test {
    public static void main(String[] args) {
        File dir = new File("./src/file");
        if(dir.isDirectory()){
            FileFilter filter = new FF(){}; //多态
           
            File[] subs = dir.listFiles(filter); //回调
            for(int i=0;i<subs.length;i++){
                System.out.println(subs[i].getName());
            }

        }
    }
}
piblic class FF implements FileFilter(){ //实现FileFilter借口,重写其中的抽象方法
          public boolean accept(File file) {
           String name = file.getName();
           System.out.println("正在过滤:"+name);
           return name.startsWith("D");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值