IO流学习

Java IO流

流介绍

在Java中所有的数据都是使用流读写的,流是一组有顺序的,由起点和终点的字节集合,是对数据传输的总称或者抽象;
流本质是数据的传输,根据数据传输的特性将流抽象为各种类,方便更直观的进行数据操作;
作用:在数据源和程序之间建立通道。

IO流体系结构

在这里插入图片描述
流的实现类
在这里插入图片描述

Java中流的划分

按照方向划分:
输入流:输入就是将数据从各种输入设备(文件、键盘等)中读取到内存中
输出流:将数据写入到各种输出设备(比如:文件、显示器、磁盘等)

在这里插入图片描述
按照数据传输单元划分:
字节流:以字节为单位传输数据的流 InputStream,OutputStream
字符流:以字符为单位传输数据的流 Reader、writer

按照功能划分:
节点流:用于直接操作目标设备的流,低级流 例如:FileInputStream(D:\text.txt)
过滤流:对一个已存在流进行包装,以提供更强大和灵活的读写功能,高级流/处理流
例如:BufferedInputStream(new FileInputStream(D:\text.txt) )
在这里插入图片描述

Java中IO流的超类

字节流顶层抽象类
InputStream:字节输入流超类
OutputStream:字节流输出超类

字节流传输的单位是字节(8bit)
InputStream和OutputStream都属于字节流的超类,他们是抽象类,不能直接使用,需要用他们相应的子类来实例化,在Java API中所有以这两个类为后缀的类均属于字节流
例如:FileInputStream、FieldOutputStream分别属于文件字节输入流和文件字节输出流

字符流顶层抽象类
Reader:字符输入流超类
Writer:字符输出流超类

字符流传输单位是字符(16bit)
Reader和Writer都属于字节流的超类,也是抽象类,需要子类来实现实例化,Java API中所有以这两个类为后缀名的类都属于字符流
例如:FileReader、FileWriter:分别为文件字符输入流和文件字符输出流

常见的源设备和目的设备

源设备: 1、硬盘(文件)
2、内存(字节数组、字符串)
3、网络(socket)
4、键盘(System.in)
目的设备:1、硬盘(文件)
2、内存(字节数据、字符串)
3、网络(socket)
4、显示器

File类介绍

File类主要是对文件或者目录的抽象表示;
文件可以简单的理解为,在硬盘设备上保存数据的一种形式;
文件一共可以分为两部分组成:属性(文件大小,文件名、文件类型)和内容(文件中存放内容)

File类提供了对文件的 创建、删除、查找等操作,主要特点如下:
1、文件和目录在Java中抽象为File类
2、对于File而言,封装的并不是真正的文件,封装非仅仅是一个路径名,磁盘文件本身是可以存在的,也可以不存在
3、文件的内容不能用File读取,而是通过流来读取,File对象可以作为流的来源地和目的地

File类的构造函数

File(String pathname) //将路径字符串抽象为File实例,路径字符串可以是相对路径,也可以是绝对路径
File(File parent, String child)  //给定一个父路径File实例和子路径名来构建file实例
File(String  parent, String child) //给定一个父路径名和子路径名来构建file实例
public File(URI uri)    //通过uri来创建一个file实例
 //File(String pathname) //将路径字符串抽象为File实例,路径字符串可以是相对路径,也可以是绝对路径
        String pathName = "C:/Users/lyy0721/Desktop/IO/test.txt";
       File file =  new File(pathName);
       //获取绝对路径
        System.out.println(file.getAbsolutePath());

        //File(File parent, String child)  //给定一个父路径File实例和子路径名来构建file实例
        String parentName = "C:/Users/lyy0721/Desktop/IO";
        String child = "test1.txt";
        //目录
        File file1 = new File(parentName);
        File file2 = new File(file1,child);
        System.out.println(file2.getAbsolutePath());

        //File(String  parent, String child) //给定一个父路径名和子路径名来构建file实例
        File file3 = new File(parentName,child);
        System.out.println(file3.getAbsolutePath());

相对路径和绝对路径

绝对路径:从盘符开始的路径,表示一个完整的路径。 Windows:c盘,d盘,比如:c:\java\test\test.txt
Linux:‘/’ 盘符 根路径
相对路径:不带盘符的路径即是相对路径 '.'表示当前路径 '…'表示父路径
例如:./test/test1.txt …/test/test1.txt

//绝对路径
        String path = "C:/Users/lyy0721/Desktop/IO";
       File file =  new File(path);
       //获取绝对路径
        System.out.println(file.getAbsolutePath());
        //相对路径使用
        File file1 = new File("./Lesson1-5");
        System.out.println(file1.getAbsolutePath());

路径分隔符:
1、Windows下分隔符:
2、Linux下分隔符:/
使用Java中File提供了常量separator表示路径分隔符,根据当前系统自动生成对应分隔符

public static final String separator = "" + separatorChar;

File类的基本操作

//当该名称的文件不存时,创建空的文件并返回true,当文件存在时,返回false
file.createNewFile();
//boolean delete() 立即删除文件或目录
file.delete();
//void deleteOnExit() 在程序退出时删除文件或目录 (tmp临时文件)
file.deleteOnExit();
//boolean exists() false:路径不存在 true:文件或者目录存在
file.exists();
//boolean isDirectory() true:当前是目录
file.isDirectory();
//boolean isFile() true:当前是文件
file.isFile();
//boolean isHidden() true:是隐藏文件
file.isHidden();
//boolean mkdir() 创建一个空目录 true:创建成功
file.mkdir();
//boolean mkdirs() 创建多级目录
file.mkdirs();
// String getParent() 获取父目录
file.getParent();
//File getParentFile() 获取父目录file实例
file.getParentFile();

创建目录需要注意问题:
创建多级目录,mkdir创建失败,返回false,mkdirs创建成功,返回true
删除目录时,目录内不为空时,删除会失败,返回去false,删除只能删除文件后者空目录
//String getAbsolutePath() 获取file对象的绝对路径名称
file.getAbsolutePath();
//String getPath( 获取路径名称
file.getPath();
//String getName() 获取文件名称或者目录名称
file.getName();
//long length()返回file表示的文件的字节数
file.length();

//String[] list() 返回目录中的文件和目录的名称的字符串数组
file.list();
//File[] listFiles() 返回目录中的文件和目录的名称的file实例数组
file.listFiles();

FilenameFilter filter = new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
        //返回非隐藏文件
        boolean hidden = new File(dir, name).isHidden();

        //只获取文件
        boolean file1 = new File(dir, name).isFile();

        //只获取目录
        boolean directory = new File(dir, name).isDirectory();

        //只获取含有"t"开头的文件或目录
        boolean startsWitht = name.startsWith("t");
        return startsWitht;
    }
};

//File[] listFiles(FilenameFilter filter) 返回过滤后需要的文件和目录的名称的file实例数组数组
file.listFiles(filter);
//String[] list(FilenameFilter filter) 返回过滤后需要的文件和目录的名称的字符串数组
file.list(filter);

返回目录下指定内容时,需要实现FilenameFilter类

public interface FilenameFilter {
    //需要实现accept方法 根据当前的文件或者目录name以及dir作出处理
    满足为true时返回,否则过滤
       参数:dir表示父目录file实例 name:表示当前文件或者目录的名称
    boolean accept(File dir, String name);
}
 * 1、指定起始路径下包含指定词的所有文件(非隐藏文件)
       * 2、打印出全路径
       * 列如:
       * 目录结构如下:
       * /user/a/a1.java
       * /user/a/a2.java
       * /user/java/j1.java
       * /user/java/a.txt
       * /user/java/b.mp4
       * /user/file/java11.txt
       * /user/file/.java34.txt
       *
       * 打印/user目录下含Java的文件,搜索结果如下
       * /user/a/a1.java
       * /user/a/a2.java
       * /user/java/j1.java
       * /user/file/java11.txt
       *
       * @param path:指定路径
       * @param filter:过滤关键词
       */
      public static void searchFile(String path, String filter) {
  
      }


public static void main(String[] args) {
        String path = "C:/Users/lyy0721/Desktop/IO";
        String filter = "test";
        searchFile(path,filter);
    }
    public static void searchFile(String path, String filter) {
        /**
         * 1、判断给定的路径合法性,是否存在,必须是目录,是文件(直接是否是满足要求)
         * 2、在当前路径下可能包含有目录和文件,文件直接判断,目录需要继续深入,
         * 继续第二步判断(递归处理)
         * 3、文件自通过过滤关键字匹配是否满足要求
         */

        File file = new File(path);
        if (!file.exists()){
            System.out.println("路径不合法");
            return;
        }

        //是文件
        if (file.isFile()) {
            //是文件需要判断是否满足要求
            String fileName = file.getName();
            if (fileName.contains(filter)){
                System.out.println(file.getAbsolutePath());
            }
            return;
        }

        //是目录
        filterFile(file,filter);

    }

    //递归方法,处理目录
    public static void filterFile(File file,String filter) {

        //是目录,获取其二级目录中所有非隐藏文件
        File[] files = file.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return true;
//                return !(new File(dir, name).isHidden());
            }
        });
        for (File f:files) {
            if (f.isFile()) {
                //文件
                String fileName = f.getName();
                if (fileName.contains(filter)){
                    System.out.println(f.getAbsolutePath());
                }
            } else {
                //目录
                filterFile(f,filter);
            }
        }
    }

2、指定目录,将该目录下的文件按照树形结构打印
dos:tree

/*
     * 树形结构打印
     * @param filePath
     */
    public static void printTree(String filePath) {
        /**
         * 1、路径的合法性
         * 2、需要表示出当前文件的层级关系,每一层前加一个"-"
         * 在不同层级中需要考虑当前层级,利用递归,参数需要包含层级
         */

        File file = new File(filePath);
        if (!file.exists()) {
            System.out.println("指定路径不存在");
            return;
        }

        String level ="|";

        System.out.println(level+file.getName());
        if (file.isDirectory()) {
            //目录
            printTreeLevel(file,level+"-");
        }

    }

    //递归打印层级关系
    public static void printTreeLevel(File file,String level) {

        File[] files = file.listFiles();
        for (File f:files) {
            System.out.println(level+f.getName());
            if (f.isDirectory()) {
                printTreeLevel(f,level+"-");
            }
        }

    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值