JavaSE01_Day03(上)-File类、RandomAccessFile

一、File类

1.1递归删除目录

递归定义:递归是算法其中之一,使用递归是程序自己调用自己的技巧逻辑

使用场景:一个程序,如果一个业务需要自己调用自己才能解决特定的业务逻辑,那么就可以使用递归进行完成。

优点:程序中重复的计算逻辑,可以通过递归进行减少代码的编写量,从而提高编程效率。

缺点:如果程序中使用递归算法,那么会影响程序执行的性能,需要注意在使用递归时,需要添加相应的终止条件,防止程序在执行的过程中反复的去执行一个业务逻辑,没有终止条件。

 package cn.tedu.file;
 import java.io.File;
 /**
  * 递归案例演示
  *
  * 递归就是自己调用自己的操作,
  * 主要就是一个方法在方法体中还会调用自己这个方法逻辑,
  *
  * 因为delete方法只能删除一个空目录,
  * 不能进行删除一个非空目录,所以在这里
  * 需要使用到递归算法进行删除非空目录。
  *
  * @author cjn
  *
  */
 public class FileDeleteDirsDemo08 {
  public static void main(String[] args) {
  File file = new File("./baojq");//指定文件路径
  deleteDir(file);
  }
 
  /**
  * 删除非空目录文件夹
  * 自定方法中,删除对应的文件夹内容需要从外界传递
  */
  public static void deleteDir (File file) {
  if (file.isDirectory()) {//是目录(文件夹)
  //获取文件夹中所有的子项
  File[] files = file.listFiles();
  //遍历子项内容
  for (int i = 0; i < files.length; i++) {
  File f = files[i];
  deleteDir(f);//递归调用:循环判断是文件还是目录,并执行相应的删除工作
  }
  }
  //无论是空文件夹或者文件都需要调用delete方法进行删除
  file.delete();
  }
 }

 

1.2 文件过滤器

 package cn.tedu.file;
 
 import java.io.File;
 import java.io.FileFilter;
 
 /**
  * 文件过滤器案例
  * FileFilter接口是不能进行实例化的,需要派生类(匿名内部类)实现,
  * 在使用文件夹中子项时,进行过滤筛选,返回满足筛选条件的子项
  * @author cjn
  *
  */
 public class FileFilterDemo09 {
  public static void main(String[] args) {
  //获取当前项目文件夹资源,找到当前项目的根路径
  File file = new File(".");
  if (file.isDirectory()) {//是目录
  //通过文件过滤器进行删选符合要求的子项
  //通过匿名内部类方式创建父接口为FileFilter的子类实例
  FileFilter filter = new FileFilter() {//使用匿名内部类创建过滤器
  /*
  * 创建FileFilter子类实例以后,必须要实现接口的accept()方法,
  * 在该方法中定义需要满足的条件逻辑,
  * 也就意味着可以将满足要求的文件或者文件夹进行筛选,
  * 如果说对应的File文件满足过滤要求则返回true,
  * 反之则返回false。
  */
  @Override
  public boolean accept(File pathname) {
  //查找所有需要进行过滤的文件名称
  String fileName = pathname.getName();
  //筛选出以点.开头的文件或者文件夹
  boolean b = fileName.startsWith(".");
  return b;
  }
  };
 
  File[] files = file.listFiles(filter//方法内部会调用accept方法
  for (int i = 0; i < files.length; i++) {
  System.out.println(files[i].getName());
  }
                                           
    //简化1:优化方法体
             /*FileFilter filter = new FileFilter() {
                 public boolean accept(File file) {
                     return file.getName().startsWith(".");
                 }
             };
             File[] subs = dir.listFiles(filter);//方法内部会调用accept方法
             for (int i = 0; i < subs.length; i++) {
                 File f = subs[i];
                 System.out.println(f.getName());
             }*/
 
             //简化2:优化方法体后,直接作为过滤器使用
            /* File[] subs = dir.listFiles(new FileFilter() {//匿名内部类创建过滤器
                 public boolean accept(File file) {
                     return file.getName().startsWith(".");
                 }
             });
             System.out.println(subs.length);
             for (int i = 0; i < subs.length; i++) {
                 File f = subs[i];
                 System.out.println(f.getName());
             }*/
 
             //简化3:利用lambda表达式进行最简优化
             /*File[] subs = dir.listFiles(file->file.getName().startsWith("."));
             for (int i = 0; i < subs.length; i++) {
                 File f = subs[i];
                 System.out.println(f.getName());
             }*/
  }
  }
 }

测试结果:

 .classpath
 .project
 .settings

 

二、RandomAccessFile

RandomAccessFile这个类是java.io包下的类,之前File类所提供的API方法不能对文件中的内容进行操作,所以需要学习技术点RandomAccessFile进行对文件中的内容读写操作。

工作原理:这个类是基于指针的方法随机访问文件中的内容,当进行读写操作时,是指通过指针的方式,根据指针当前的位置进行读写操作,每当读写到对应的字节以后,指针就会自动的移动到下一个字节。

应用场景:主要用于对硬盘中的文件进行操作 。

2.1 write()写出方法

 package cn.tedu;
 
 import java.io.IOException;
 import java.io.RandomAccessFile;
 
 /**
  * 使用RAF在文件中写出内容案例
  * @author cjn
  *
  */
 public class RAFDemo01 {
  public static void main(String[] args) throws IOException {
  /*
  * 创建RandomAccessFile对象需要传递两个参数
  * 第一个参数:可以填写文件对象,也可以添加文件的路径
  * 第二个参数:需要填写文件的访问模式
  *
  * 访问模式:
  * - 可读模式"r"
  * - 可读写模式"rw"
  *
  */
  RandomAccessFile raf = new RandomAccessFile("work.dat", "rw");//指定写出文件路径
  /*
  * write(int d)方法,可以向work.dat文件中写出内容,
  * 实际上是向文件中写出一个字节,参数传递的是一个整数类型,
  * 最终就会将这个整数转换为二进制的数据进行写出操作,
  * 实际上就是将当前需要写出的数据二进制的低八位进行写出。
  *
  *                           vvvvvvvv
  * 00000000 00000000 00000000 00000001 -》10进制的数字1
  * 00000000 00000000 00000000 01100001 -》10进制的数字97
  * 00000000 00000000 00000000 11111111 -》       255
  * 00000000 00000000 00000001 00000000 -》       256
  * 00000000 00000000 00000001 00000001 -》       257
  * 有关于二进制会在后面课程讲解
  *
  * 当写出97整数时,因为97对应的二进制数和ASCII编码表中a对象的二进制刚好一样,
  * 所以在写出97时显示的内容是一个a。
  */
  raf.write(97);
  System.out.println("写出完毕");
  //raf对象使用完毕以后必须要关闭,如果不关闭就会文件被其他资源占用
  raf.close();
  }
 }

2.2 read()读取方法

 package cn.tedu;
 
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.RandomAccessFile;
 
 /**
  * 使用RAF在文件中读取内容案例
  * @author cjn
  *
  */
 public class RAFDemo02 {
  public static void main(String[] args) throws IOException {
  File file = new File("work.dat");//指定读取文件路径
  RandomAccessFile raf = new RandomAccessFile(file, "r");
  /*
  * read()方法是从work.dat文件中读取一个字节,
  * 并且把读取的内容以整数int类型返回,
  * 这个返回得到的内容就是读取的字节低八位,
  * 最终如果遇见返回的值为-1,那么表示读到了文件的末尾。
  */
  int i = raf.read();
  System.out.println(i);
  int i1 = raf.read();
  System.out.println(i1);
  int i2 = raf.read();
  System.out.println(i2);
  int i3 = raf.read();
  System.out.println(i3);
         //raf对象使用完毕以后必须要关闭,如果不关闭就会文件被其他资源占用
  raf.close();
  }
 }

测试结果:

 97
 -1
 -1
 -1

 

 

posted @ 2021-06-10 23:38  Coder_Cui  阅读(123)  评论(0编辑  收藏  举报