文件操作(1)File 常用方法、lambda表达式
2024-04-10 11:30:40  阅读数 182

1、什么是I/O流

I代表输入流 InputStream,O代表输出流OutputStream

在 Java 中,“ 流 ” 是一个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象。 “ 流 ” 屏蔽了实际的输入 / 输出设备中处理数据的细节。一个程序可以打开一个数据源上的流,然后按顺序读取这个流中的数据到程序中,这样的流称为输入流。一个程序也可以打开一个目的地的流,然后按顺序的把程序中的数据写入到这个目地中,这样的流称为输出流。

2、什么是文件

文件是具有符号名的,在逻辑上具有完整意义的一组相关信息项的有序序列,可认为是相关记录或放在一起的数据的集合。

计算机文件属于文件的一种,与普通文件载体不同,计算机文件是以计算机硬盘为载体存储在计算机上的信息集合。文件可以是文本文档、图片、程序等等。文件通常具有文件扩展名,用于指示文件类型,比如文本文件.txt

3、File类:

java中主要是通过java.io包下面的File类来访问文件
File类是io包中唯一代表磁盘文件本身的对象。

File 类表示处理文件和文件系统的相关信息。也就是说,File 类不具有从文件读取信息和向文件写入信息的功能,它仅描述文件本身的属性。

4、使用File类访问文件属性

语法:File file = new File(路径);
// 路径两种写法,c:\test.txt或者c:/test.txt
这个就是创建了一个文件的对象,可以是物理文件或目录,然后再进行操作或者查看目录的属性-路径,权限,日期等

5、File类的常用方法

boolean exists()       判断文件或目录是否存在
boolean isFile()       判断是否是文件
canRead():File表示的文件或目录是否可读
canWrite():File表示的文件或目录是否可写
boolean isDirectory()  判断是否是目录
String getPath()       返回此对象表示的文件的相对路径名
String getAbsolutePath()返回此对象表示的文件的绝对路径名
String getName( )      返回此对象表示的文件或目录的名称
boolean delete( )      删除此对象指定的文件或目录
boolean createNewFile()创建名称的空文件,不创建文件夹
long  length()         返回文件的长度,单位为字节, 如果文件不存在,则返回 0L
File[] subs = dir.listFiles() 可以访问一个目录中的所有子项

创建目录:mkdir()和mkdirs(),两者区别是前者创建单个目录,后者是创建多层目录,返回布尔型数据

6、流的分类:流是相对于计算机的内存来说

Java中是使用流来进行文件的读写,而流是指一连串的流动的字符,是以先进先出的方式发送消息的一个通道。

按照数据流向区分
1、 输入流-InputStream(字节输入流)和Reader(字符输入流)作为基类,只能从中读取数据,而不能向其写入数据。
2、 输出流-outputStream(字节输出流)和Writer(字符输出流)作为基类 只能向其写入数据,而不能向其读取数据。

按照数据处理单元区分
1、 字节流-输入InputStream为基类和输出OutputStream为基类,一次读入或读出是8位二进制,即一个字节。
2、 字符流-输入Reader和输出Writer 一次读入或读出16位的二进制,即一个字符。
3、 字节流和字符流的原理是相同的,只不过处理的单位不同而已。简单理解:后缀是Stream是字节流,而后缀是Reader,Writer是字符流。

7、示例

创建一个新文件

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

package file;
import java.io.File;
import java.io.IOException;

/**
 * 使用File创建一个新文件
 */
public class CreateNewFileDemo {
    public static void main(String[] args) throws IOException {
        //在当前目录下新建一个文件:test.txt
        File file = new File("./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表示的目录,同时将所有不存在的父目录一同创建

package file;

import java.io.File;

/**
 * 使用File创建目录
 */
public class MkDirDemo {
    public static void main(String[] args) {
        //在当前目录下新建一个目录:demo
//        File dir = new File("demo");
        File dir = new File("./a/b/c/d/e/f");

        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)
该方法要求传入一个文件过滤器,并仅将满足该过滤器要求的子项返回。

package file;

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

/**
 * 重载的listFiles方法,允许我们传入一个文件过滤器从而可以有条件的获取一个目录
 * 中的子项。
 */
public class ListFilesDemo2 {
    public static void main(String[] args) {
        /*
            需求:获取当前目录中所有名字以"."开始的子项
         */
        File dir = new File(".");
        if(dir.isDirectory()){
//            FileFilter filter = new FileFilter(){//匿名内部类创建过滤器
//                public boolean accept(File file) {
//                    String name = file.getName();
//                    boolean starts = name.startsWith(".");//名字是否以"."开始
//                    System.out.println("过滤器过滤:"+name+",是否符合要求:"+starts);
//                    return starts;
//                }
//            };
//            File[] subs = dir.listFiles(filter);//方法内部会调用accept方法

            
            File[] subs = dir.listFiles(new FileFilter(){
                public boolean accept(File file) {
                    return file.getName().startsWith(".");
                }
            });
            System.out.println(subs.length);
        }
    }
}

8、Lambda表达式

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

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

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

/**
 * 语法:
 * (参数列表)->{
 *     方法体
 * }
 */
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(".");
    }
}