欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【JavaIO流】JavaIO流基础知识

程序员文章站 2022-07-12 20:58:03
...

JavaIO流基础知识

流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。实际上,流的源端和目的端可简单地看成是字节的生产者和消费者,对输入流,可不必关心它的源端是什么,只要简单地从流中读数据,而对输出流,也可不知道它的目的端,只是简单地往流中写数据。

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

参考链接:Java IO流


JavaIO流的结构图

【JavaIO流】JavaIO流基础知识


JavaIO流的分类

根据处理数据类型的不同分为:字符流和字节流

  • 字节流:字节输入流基类:InputStream、字节输出流基类: OutputStream
  • 字符流:字符输入流基类:Reader、字符输出流基类:Writer
  • tips:字节流是通用8位字节流,字符流是16位 Unicode 字符流,亦或者其他字符流。

根据数据流向不同分为:输入流和输出流

  • 输入流:InputStreamReader作为基类。
  • 输出流:OutputStreamWriter作为基类。
  • tips:输入和输出是相对计算机内存而言,而不是源和目标。

根据功能不同分为:节点流和处理流

  • 节点流:可以直接从数据源或目的地读写数据。
  • 处理流(包装流):不直接连接到数据源或目的地,是其他流进行封装。目的是简化操作,提升性能。
  • tips:节点流和处理流的关系:节点流处于I/O操作的第一线,所有操作b必须通过它执行;处理流可以对其他流进行处理(提高效率或保证操作灵活性)。

File类

java中我们通过java.io.File类实现对文件的基本属性进行操作,包括文件属性读取,文件创建,文件删除,文件添加等等。File是一个类,那么在使用的时候就需要创建对象,但是File类的实例是不可变的,也就是说,一旦创建,由File对象表示的抽象路径名将永远不会改变,也就是说利用构造方法,指定路径名、文件名等来构造File类的对象,之后调用该对象的createNewFile()方法就可以创建出相应的文件。

File类的基本方法

方法名 用法说明
public String getName() 返回由此抽象路径名表示的文件或目录的名称。
public String getParent() 返回此抽象路径名的父路径名的路径名字符串,如果此路径名没有指定父目录,则返回null。
public File getParentFile() 返回此抽象路径名的父路径名的抽象路径名,如果此路径名没有指定父目录,则返回null。
public String getPath() 将此抽象路径名转换为一个路径名字符串。
public boolean isAbsolute() 判断此抽象路径名是否为绝对路径名。
public String getAbsolutePath() 返回抽象路径名的绝对路径名字符串。
public boolean canRead() 判断应用程序是否可以读取此抽象路径名表示的文件。
public boolean canWrite() 判断应用程序是否可以修改此抽象路径名表示的文件。
public boolean exists() 判断此抽象路径名表示的文件或目录是否存在。
public boolean isDirectory() 判断此抽象路径名表示的文件是否是一个目录。
public boolean isFile() 判断此抽象路径名表示的文件是否是一个标准文件。
public long lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。
public long length() 返回由此抽象路径名表示的文件的长度。
public boolean createNewFile() throws IOException 当且仅当不存在具有此抽象路径名指定的名称的文件时,原子地创建由此抽象路径名指定的一个新的空文件。
public boolean delete() 删除此抽象路径名表示的文件或目录。
public void deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。
public String[] list() 返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组。
public String[] list(FilenameFilter filter) 返回由包含在目录中的文件和目录的名称所组成的字符串数组,这一目录是通过满足指定过滤器的抽象路径名来表示的。
public File[] listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名所表示目录中的文件。
public File[] listFiles(FileFilter filter) 返回表示此抽象路径名所表示目录中的文件和目录的抽象路径名数组,这些路径名满足特定过滤器。
public boolean mkdir() 创建此抽象路径名指定的目录。
public boolean mkdirs() 创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。
public boolean renameTo(File dest) 重新命名此抽象路径名表示的文件。
public boolean setLastModified(long time) 设置由此抽象路径名所指定的文件或目录的最后一次修改时间。
public boolean setReadOnly() 标记此抽象路径名指定的文件或目录,以便只可对其进行读操作。
public static File createTempFile(String prefix, String suffix, File directory) throws IOException 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。
public static File createTempFile(String prefix, String suffix) throws IOException 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
public int compareTo(File pathname) 按字母顺序比较两个抽象路径名。
public int compareTo(Object o) 按字母顺序比较抽象路径名与给定对象。
public boolean equals(Object obj) 测试此抽象路径名与给定对象是否相等。
public String toString() 返回此抽象路径名的路径名字符串。
public class FileTest {
    /**
     * 判断文件类型
     * @param file
     */
    public static void judgeFile(File file){
        //表示当前路径是否存在
        boolean exists = file.exists();
        if(exists) {
            System.out.println("当前路径存在");
        }else {
            System.out.println("当前路径不存在");
        }
        //判断当前路径是否是文件
        boolean isFile = file.isFile();
        if(isFile){
            System.out.println("当前路径是文件");
        }else {
            System.out.println("当前路径不是文件");
        }
        //判断当前是否为目录
        boolean isDirectory = file.isDirectory();
        if(isDirectory){
            System.out.println("当前路径是目录");
        }else {
            System.out.println("当前路径不是目录");
        }
        //判断是否是隐藏文件
        boolean isHidden = file.isHidden();
        if(isHidden){
            System.out.println("当前路径是隐藏文件");
        }else {
            System.out.println("当前路径不是隐藏文件");
        }
        System.out.println();
    }

    /**
     * 获取文件信息
     * @param file
     */
    public static void getFile(File file){
        //获取文件名
        String name = file.getName();
        System.out.println("文件名:" + name);
        //获取相对路径
        String path = file.getPath();
        System.out.println("相对路径:" + path);
        //获取文件的父路径
        String parent = file.getParent();
        System.out.println("文件的父路径:" + parent);
        //获取文件最后一次修改的时间
        long lastModified = file.lastModified();
        Date date = new Date(lastModified);
        System.out.println("文件最后一次修改的时间:" + date);
        //获取绝对路径
        String absolutePath = file.getAbsolutePath();
        System.out.println("绝对路径:" + absolutePath);
        //获取文件长度
        long length = file.length();
        System.out.println("文件长度:" + length);
        //获取当前目录下所有文件
        String[] list = file.list();
        for(int i = 0;i < list.length;i++){
            System.out.println("当前目录下有文件" + list[i]);
        }
    }

    public static void main(String[] args) {
        //Windows环境下的“\”在代码中不能直接使用,需要使用“\\”转义字符进行转义,也可以直接使用“/”
        File file = new File("D:\\Java文件IO\\Test"); //文件的路径(可以是相对路径也可以是绝对路径)
        try {
            boolean newFile = file.createNewFile(); //创建普通文件的方法
            System.out.println(newFile);
            //判断文件类型
            judgeFile(file);
            //获取文件信息
            getFile(file);
            //在程序退出时删除
            file.deleteOnExit();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
class ListFileTest{
    /**
     * 列出一个文件夹下的所有文件
     */
    public static void listFiles(File file){
        File[] files = file.listFiles();
        for(File f : files){
            if(f.isFile()){
                System.out.println(f);
            }else {
                listFiles(f);
            }
        }
    }
    /**
     * 列出一个文件夹下的所有指定后缀名文件(普通方法实现)
     */
    public static void listFilesForSuffix(File file){
        File[] files = file.listFiles();
        for(File f : files){
            //若文件过多情况下,时间、空间复杂度太高,我们需要对文件提供过滤器
            if(f.isFile() && f.getName().endsWith(".txt")){
                System.out.println(f);
            }else {
                listFilesForSuffix(f);
            }
        }
    }
    /**
     * 列出一个文件夹下的所有指定后缀名文件(使用过滤器实现)
     */
    public static void listFilesForFileFilter(File file){
//        File[] files = file.listFiles(new MyFileFilter());
        File[] files = file.listFiles(new MyFileNameFilter());
        for(File f : files){
            if(f.isFile()){
                System.out.println(f);
            }else {
                listFilesForFileFilter(f);
            }
        }
    }
    public static void main(String[] args) {
        listFilesForFileFilter(new File("D:\\Java文件IO\\Test"));
    }
}

class MyFileFilter implements FileFilter{
    //提供一个过滤规则,将该文件夹下所有指定的后缀名的文件过滤出来
    @Override
    public boolean accept(File pathname) {
        if(pathname.isDirectory() || pathname.isFile() && pathname.getName().endsWith("txt")){
            return true;
        }
        return false;
    }
}

class MyFileNameFilter implements FilenameFilter{
    /**
     * 提供一个过滤规则,将该文件夹下所有指定的后缀名的文件过滤出来
     * @param dir 文件的父目录
     * @param name 文件的子目录
     * @return 符合返回true 否则返回false
     */
    @Override
    public boolean accept(File dir, String name) {
//        File file = new File(dir,name);
//        if(file.isDirectory() || file.isFile() && file.getName().endsWith("txt")){
//            return true;
//        }
//        return false;

        //可以直接根据name进行过滤
        return name.contains(".txt");
    }
}

File类总结

  • 1、File类的直接父类是Object类。一个File类的对象,表示了磁盘上的文件或目录。如果你创建文件或者文件夹忘了写盘符路径,那么,默认在项目路径下。
  • 2、在不同的计算机操作系统中,路径分割符号是不同的。windows系统的路径分隔符【\】与Unix系统的路径分隔符【/】不一样。
  • 3、File类提供了与平台无关的方法来对磁盘上的文件或目录进行操作。因为不同的系统平台对文件路径的描述不尽相同,所以为了做到平台无关,在Java语言中,使用抽象路径等概念。Java自动进行不同系统平台的文件路径描述与抽象文件路径之间的转换。
  • 4、File对象用来获取或处理与磁盘文件相关的信息,例如权限,时间,日期和目录路径。可以直接处理文件和文件系统,同时还可以浏览子目录层次结构。
  • 5、Java中的删除不走回收站。 如果要删除一个文件夹,需要注意该文件夹内不能包含文件或者文件夹。
相关标签: JavaIO流