当前位置: 首页 > article >正文

day21_IO

今日内容

零、 复习昨日
一、作业
二、File
三、IO流
四、字节输入&输出流

零、 复习昨日

复习

一、作业

见代码

二、File

2.1 介绍

文件和目录(文件夹) 路径名的抽象表示形式。

即使用路径来表示一个文件或者一个文件夹对象

路径:

  • 相对路径,相对于当前项目的项目名下
  • 绝对路径,按照磁盘来确定

2.2 构造方法

  • File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
  • File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
  • File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
   public static void main(String[] args) throws IOException {

        // 以子父级路径来创建文件对象
        File file = new File("E:\\A", "a.txt");
        System.out.println(file.exists() );

        // 先创建父文件对象
        File parent = new File("E:\\A");
        File file1 = new File(parent, "a.txt");

    }

    private static void show1() throws IOException {
        // 以路径创建文件对象
        File file1 = new File("a.txt");// 相对
        File file2 = new File("E:\\a.txt");// 绝对路径

        // 判断是否存在
        System.out.println(file1.exists( ));
        System.out.println(file2.exists( ));

        // 创建文件
        file1.createNewFile();
        file2.createNewFile();

        System.out.println("-- over --" );
    }

2.3方法

创建功能

  • boolean createNewFile() 当且仅当不存在此路径名表示的文件时,创建一个新的空文件。
  • boolean mkdir() 创建此抽象路径名指定的目录/文件夹
  • boolean mkdirs() 创建多层级的文件夹
private static void show3() throws IOException {
        File file = new File("b.txt");
        // 创建文件对象
        boolean newFile = file.createNewFile( );
        System.out.println(newFile );

        File file2 = new File("cDir");
        // 创建文件夹对象
        boolean mkdir = file2.mkdir( );
        System.out.println(mkdir);

        File file3 = new File("dDir\\d2Dir\\d3Dir");
        // 创建多层文件夹对象
        boolean mkdir2 = file3.mkdirs( );
        System.out.println(mkdir2);

    }

获取功能

  • File getAbsoluteFile() 返回以绝对路径代表文件对象
  • **String getAbsolutePath() **返回以绝对路径代表文件路径字符串
  • String getName() 返回文件或目录的名称。
  • String getPath()返回构造方法中的文件名
  • String[] list()返回一个字符串数组,数组内是文件夹里面的文件或文件夹的名字
    场景: 列出A文件夹下的所有记事本文件 (判断字符串后缀)
  • File[] listFiles()返回一个文件对象数组,数组内是文件夹里面的每个文件对象
  • long lastModified() 返回此文件/文件夹最后一次被修改的时间,返回的毫秒值
  • long length() 返回由此文件的字节长度。
private static void show4() throws IOException {
    // File file = new File("E:\\A\\a.txt");
    File file = new File("a.txt");
    // - File getAbsoluteFile()返回此抽象路径名的绝对路径名形式。
    File file1 = file.getAbsoluteFile( );
    System.out.println(file1);

    // - String getAbsolutePath()返回此抽象路径名的绝对路径名字符串。
    String absolutePath = file.getAbsolutePath( );
    System.out.println(absolutePath );

    // - String getName()返回由此抽象路径名表示的文件或目录的名称。
    String name = file.getName( );
    System.out.println(name );

    // - String getPath() 返回的构造方法中的路径
    System.out.println(file.getPath());

    // ---- list(),listFiles() 主要是针对文件夹对象操作的 ------
    // 使用文件对象,调用这两个方法,返回的是null
    File file2 = new File("E:\\A");

    // - String[] list()返回一个字符串数组,这些字符串是文件夹内文件或文件夹名字
    String[] list = file2.list( );
    System.out.println(Arrays.toString(list ) );
    // 场景: 列出A文件夹下的所有记事本文件 (判断字符串后缀)

    // - File[] listFiles()返回一个文件对象数组,数组内是文件夹内文件或文件夹对象
    File[] files = file2.listFiles( );
    System.out.println(Arrays.toString(files ) );
    // 场景: 删除文件内的所有文件


    File file3 = new File("E:\\A\\a.txt");
    // - long lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。
    long l = file3.lastModified( );
    System.out.println("毫秒值:" + l );
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
    String format = sdf.format(new Date(l));
    System.out.println(format );

    // - long length() 返回由此抽象路径名表示的文件的长度。
    System.out.println(file3.length() );
}

判断功能

  • boolean exists() 测试此抽象路径名表示的文件或目录是否存在。
  • boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录。
  • boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。
  • boolean isHidden() 测试此抽象路径名指定的文件是否是一个隐藏文件。
    private static void show5() throws IOException {
        File file = new File("E:\\A\\e.txt");
        // - boolean exists() 测试此抽象路径名表示的文件或目录是否存在。
        System.out.println(file.exists() );
        if (!file.exists()) {
            file.createNewFile();
        }
        // - boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录。
        System.out.println("是否是文件夹? "+file.isDirectory() );

        // - boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。
        System.out.println("是否是文件? "+file.isFile() );

        // - boolean isHidden() 测试此抽象路径名指定的文件是否是一个隐藏文件。
        System.out.println("是否是隐藏文件? "+file.isHidden() );

    }

删除&重命名

  • boolean renameTo(File dest) 移动并重命名
  • boolean delete() 删除此抽象路径名表示的文件或目录。
    private static void show6() throws IOException {
        // - boolean renameTo(File dest)  移动并重命名
        File file = new File("E:\\A\\a.txt");

        // File file2 = new File("E:\\A\\A.txt");
        File file2 = new File("E:\\AA.txt");
        file.renameTo(file2);

        // - boolean delete()  删除此抽象路径名表示的文件或空目录。
        // 删除不走回收站
        File file1 = new File("E:\\A\\b.jpg");
        boolean delete = file1.delete( );
        System.out.println(delete );

        File file3 = new File("E:\\A");
        boolean delete3 = file3.delete( );
        System.out.println(delete3 );
    }

以上是这些方法,最重要是

  • 构造方法
  • 判断是否存在 exists
  • 创建文件 createNewFIile,创建文件夹mkdir
  • 获得绝对路径 getAbsolutePath
  • 删除 delete()

2.4 练习

1 设计方法,传入文件路径.列出该文件夹下的所有记事本文件 (单层文件夹)

 // 传入文件路径.列出该文件夹下的所有记事本文件 (单层文件夹)
    public static void printTxt(String path) {
        // 创建文件对象
        File file = new File(path);
        // 获得每个文件名字符串 list()
        String[] list = file.list( );
        // 通过String类endsWith()
        for (String s : list) {
            if (s.endsWith("txt")) {
                // 输出txt文件
                System.out.println(s );
            }
        }
    }

2 设计方法,传入文件路径.删除该文件夹下的所有文件(只是删文件,不删文件夹)

// 传入文件路径.删除该文件夹下的所有文件(只是删文件,不删文件夹)
    public static void deleteFile(String path) {
        File file = new File(path);
        File[] files = file.listFiles( ); // 查到文件夹下所有的文件对象
        for (File f : files) {
            if (f.isFile()){// 是文件就删除
                f.delete();
            }
        }
    }

ps: 该题可以扩展,给定路径删除该文件夹

三、IO流

流的概念:

在程序中,数据需要传输(移动),⽐如磁盘上的数据需要出现在显⽰器上,就需要进⾏数据传输。 在Java中进⾏数据传输的技术就是“流”.

image-20230227145557596

IO - Input & Output - 输入 & 输出

image-20230227145922695

IO按操作文件的类型分类

  • 字节流
    • 字节输入流
    • 字节输出流
  • 字符流
    • 字符输入流
    • 字符输出流

IO按方向分类

  • 输入流
  • 输出流

四、字节输入&输出流

字节输入流和字节输出流顶层设计是抽象类

  • InputStream 输入字节流
    • 一般使用其子类FileInputStream
  • OutputStream 输出字节流
    • 一般使用其子类FileOutputStream

4.1 FileInputStream

FileInputStream 用于读取诸如图像数据之类的原始字节流(二进制文件,例如图片,音频,视频等)

构造方法

  • FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。

  • FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。

方法

  • int read() 一次读取一个字节
  • void close() 关流
    public static void main(String[] args) throws IOException {

        // FileInputStream fis = new FileInputStream("a.txt");
        FileInputStream fis = new FileInputStream(new File("a.txt"));

        // read(),一次读取一个字节
        // int a1 = fis.read();
        // System.out.println(a1 );
        //
        // int a2 = fis.read();
        // System.out.println(a2 );
        //
        // int a3 = fis.read();
        // System.out.println(a3 );
        //
        // // 读完返回-1,即结束
        // int a4 = fis.read();
        // System.out.println(a4 );

        int n  = -1;
        while ( (n = fis.read()) != -1) {
            System.out.println( (char)n );
        }

        // 关流
        fis.close();
    }

read() 一次读一个,有点"慢"
read(byte[] ) 一次读取一个数组大小的数据,比较快

public static void main(String[] args) throws IOException {
    FileInputStream fis = new FileInputStream("a.txt");

    // byte[] arr = new byte[4];// 长度为4的数组,一次读取4个字节
    // read(byte[]) 一次可以读取数组长度个数的数据,存入数组,返回读取的数据个数
    // int len = fis.read(arr);
    // System.out.println(Arrays.toString(arr ));

    byte[] arr = new byte[4];
    int len = -1;

    while ((len = fis.read(arr)) != -1) {
        String s = new String(arr, 0, len);
        System.out.println(s );
    }

    fis.close();
}

4.2 FileOutputStream

FileOutputStream是文件输出流,用于将数据写入 File
适合用于写入诸如图像数据之类的原始字节的流(二进制)

构造方法

FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。

  • FileOutputStream(File file, boolean append) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
  • FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。
  • FileOutputStream(String name, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流。

方法

  • void write(int b) 将指定字节写入此文件输出流。
  • void close() 关闭此文件输出流并释放与此流有关的所有系统资源。
    public static void main(String[] args) throws IOException {

        // 文件不存在,会先创建,再输出
        // 默认创建的输出流,是不追加,即对原文件覆盖
        // FileOutputStream fos = new FileOutputStream("c.txt");
        FileOutputStream fos = new FileOutputStream("c.txt",true);
        // 写出一个字节
        //fos.write(97);

        // 写出一个数组内全部数据
        byte[] bytes = {65,66,67,68};
        fos.write(bytes);

        fos.close();
    }

4.3 使用捕获异常的方式编程[必须熟练]

    private static void show3_trycatch() {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("a.txt");
            int a = -1;
            while((a = fis.read()) != -1) {
                System.out.println(a );
            }
        } catch (Exception e) {
            System.out.println("读取数据报错啦 - " + e.getMessage() );
        } finally {
            try {
                fis.close( );
            }catch (Exception e) {
                System.out.println("关流异常!" + e.getMessage() );
            }
        }
    }

4.4 练习: 拷贝图片

image-20230423171512534

将D:\justdoit.jpg图片拷贝一份到E:\jiushigan.jpg

思路: 从d盘读取,写到e盘

// 边读边写
public static void copy() throws IOException {
    FileInputStream fis = new FileInputStream("E:\\justdoit.jpg");
    FileOutputStream fos = new FileOututStream("D:\\jiushigan.jpg");
    
    int a = -1;
    while((a = fis.read()) != -1) {
    	fos.write(a);
    }
    fis.close();
    fos.close();
}

改造成trycatch代码再写一遍

五、 总结

重点: 字节输入输出流,标准几行代码
特别熟练: try-catch写代码
理解: IO流

:\jiushigan.jpg

思路: 从d盘读取,写到e盘

// 边读边写
public static void copy() throws IOException {
    FileInputStream fis = new FileInputStream("E:\\justdoit.jpg");
    FileOutputStream fos = new FileOututStream("D:\\jiushigan.jpg");
    
    int a = -1;
    while((a = fis.read()) != -1) {
    	fos.write(a);
    }
    fis.close();
    fos.close();
}

改造成trycatch代码再写一遍

五、 总结

重点: 字节输入输出流,标准几行代码
特别熟练: try-catch写代码
理解: IO流

http://www.kler.cn/a/17321.html

相关文章:

  • ios swift开发--ios远程推送通知配置
  • Vue 项目打包后环境变量丢失问题(清除缓存),区分.env和.env.*文件
  • springboot 之 整合springdoc2.6 (swagger 3)
  • gpu-V100显卡相关知识
  • 使用@react-three/fiber,@mkkellogg/gaussian-splats-3d加载.splat,.ply,.ksplat文件
  • 机器学习——损失函数、代价函数、KL散度
  • 使用 NutUI 搭建「自定义业务风格」的组件库 | 京东云技术团队
  • 【BeautifulSoup下】——05全栈开发——如桃花来
  • LeetCode:21. 合并两个有序链表
  • 1992-2022年31省GDP、第一产业增加值、第二产业增加值 第三产业增加值
  • 【51单片机】DS1302时钟模块
  • Office转换需要用到的SDK(建议)
  • 黑马点评项目导入
  • 操作系统内存管理笔记
  • nginx中使用absolute_redirect解决代理重定向问题
  • 【MySQL】数据库基础操作一:建库与建表
  • P4725 【模板】多项式对数函数(多项式 ln)
  • MobileNet(V1、V2、V3)入门
  • 状态机模式
  • 男子订民宿被毁约5个家庭漂泊街头 房东:住满了,没办法
  • Maven 知识点总结
  • 日撸 Java 三百行day38
  • Springboot +Flowable,任务认领和回退(一)
  • 【JavaEE】应用层自定义协议及UDP协议
  • 【技术选型】Elasticsearch 和Solr那个香?
  • shell脚本 cut工具