IO流、File

本文详细介绍了Java中的File类、IO流(包括字节流和字符流)、Hutool工具包在文件操作中的应用,以及如何在Idea中导入jar包。内容涵盖了创建、判断、操作文件,流的读写,以及Hutool的便捷功能和jar包的作用。
摘要由CSDN通过智能技术生成

今日内容

1.复习
2.IO
3.Hutool
4.Idea会导jar包

一、File[熟悉]

1.1 介绍

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

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

路径:

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

1.2 构造方法

  • File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
  • File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
          // 通过路径创建文件对象
        File f1 = new File("a.txt");// 相对路径,相对于当前项目
        System.out.println(f1 );
        File f2 = new File("E:\\a.txt");// 绝对路径
        File f3 = new File("E:/b.txt");// 绝对路径

1.3方法

  • boolean createNewFile() 当且仅当不存在此路径名表示的文件时,创建一个新的空文件。
  • boolean mkdir() 创建此抽象路径名指定的目录/文件夹
  • boolean mkdirs() 创建多层级的文件夹
  • boolean exists() 判断文件或目录是否存在。
  • boolean delete() 删除文件或者空文件夹
  • **String getAbsolutePath() **返回以绝对路径代表文件路径字符串
  public static void main(String[] args) throws IOException {

        // 通过路径创建文件对象
        File f1 = new File("a.txt");// 相对路径,相对于当前项目
        System.out.println(f1 );
        File f2 = new File("E:\\a.txt");// 绝对路径
        File f3 = new File("E:/b.txt");// 绝对路径

        // 判断文件对象是否存在
        // boolean exists = f2.exists( );
        // System.out.println(exists );

        if (!f3.exists( )){
            // 如果文件不存在,就创建文件
            boolean newFile = f3.createNewFile( );
            System.out.println("创建文件"+newFile );
        }


        File f4 = new File("a");
        // 创建单层文件夹
        boolean mkdir = f4.mkdir( );// make directory
        System.out.println("创建文件夹:" + mkdir );


        // 创建多层文件夹
        File f5 = new File("b/c/d");
        boolean mkdirs = f5.mkdirs( );
        System.out.println("创建多层文件夹:" + mkdirs );

        // 删除文件
        File f6 = new File("a.txt");
        boolean delete = f6.delete( );
        System.out.println("删除是否成功:" + delete );

        // 只能删除空文件夹
        File f7 = new File("a");
        boolean delete1 = f7.delete( );
        System.out.println("删除单层文件夹:" + delete1 );

        // 只能删除空文件夹
        File f8 = new File("b");
        boolean delete2 = f8.delete( );
        System.out.println("删除多层文件夹:" + delete2 );

        // 获得文件绝对路径
        File f9 = new File("a.txt");
        String path = f9.getAbsolutePath( );
        System.out.println(path );
    }

二、IO流

2.1 介绍

流的概念:

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

在这里插入图片描述

IO - Input & Output - 输入 & 输出

image-20230227145922695

IO按操作文件的类型分类

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

IO按方向分类

  • 输入流
  • 输出流

2.2 字节流

2.2.1FileInputStream

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

构造方法

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

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

方法

  • int read() 一次读取一个字节
  • void close() 关流
    public static void main(String[] args) {
        // 使用try-catch完成 读取a.txt中的数据
        FileInputStream f = null;
        try{
            f = new FileInputStream("a.txt");
            int i = -1;
            while((i = f.read()) != -1){
                System.out.println(i );
            }
        } catch (Exception e){
            System.out.println("出错了" );
            e.printStackTrace();
        } finally {
            try {
                f.close( );
            } catch (IOException e) {
                e.printStackTrace( );
            }
        }
    }

2.2.2 FileOutputStream

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

构造方法

  • FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。

  • FileOutputStream(String name, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流。

方法

  • void write(int b) 将指定字节写入此文件输出流。
  • void close() 关闭此文件输出流并释放与此流有关的所有系统资源。
    public static void main(String[] args) throws IOException {
        /**
         * 跟读取数据不一样,读取数据时没有该文件会报错
         * 但是现在写出数据,没有该文件,它会自动创建出来
         * -----------------------------------------
         * 如果该文件以前有内容,这样直接写,是覆盖直接的内容
         * -----------------------------------------
         * 如果想要对该文件实现追加内容,就需要构造方法中设置第二个参数为true
         */
        // 创建对象
        //FileOutputStream fos = new FileOutputStream("b.txt");
        FileOutputStream fos = new FileOutputStream("b.txt",true);

        // 写入一个字节
        fos.write(65);
        fos.write(67);

        // 关流
        fos.close();
    }

2.3 练习: 拷贝图片

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();
}

2.4 缓冲字节流

通过拷贝大文件,发现读写很慢!

为什么? 是因为读写都是一次读一个字节,写一个字节,文件很多,就需要几百万次读写…

怎么提高速度? 一次读取多个,写多个就会块 —> 缓冲字节流


所谓缓冲字节流,其实对原来的字节流做了包装,内部有个缓冲区,即就是一个数组,长度8192,即使用缓冲区字节流,就相当于一次读8192,写8192

FileInputStream —> 包装成BufferedInputStream
FileOutputStream --> 包装成 BufferedOutputStream

    public static void main(String[] args) throws Exception {
        long begin = System.currentTimeMillis( );

        // 创建字节输入流
        FileInputStream fis = new FileInputStream("D:\\taotie2.png");
        // 将其包装成缓冲流
        BufferedInputStream bis = new BufferedInputStream(fis);

        // 创建字节输出流
        FileOutputStream fos = new FileOutputStream("E:\\taotie.png");
        // 将其包装成缓冲流
        BufferedOutputStream bos = new BufferedOutputStream(fos);


        // 需要缓冲流在读写
        int i = -1;
        while((i = bis.read()) != -1){
            bos.write(i);
        }

        bis.close();
        bos.close();
        long end = System.currentTimeMillis( );
        System.out.println(" 耗时: "+(end - begin) );
    }

2.5 字符流

字节流适合读取二进制文件,读取字符数据可能会乱码!
建议读取字符,采用字符流!

字符流有两个抽象父类

  • Reader (字符输入流 )
  • Writer (字符输出流)

一般使用其子类

  • FileReader 字符输入流
  • FileWriter 字符输出流
    • 默认缓冲区 1024,写出时要关流,如果不关流最后一点数据达不到数组大小就不会写出,此时就需要强制刷新flush

2.5.1 FileReader

构造方法

  • FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader。

方法

  • int read() 读取单个字符。 读完末尾返回-1
  • void close() 关闭该流并释放与之关联的所有资源。
    public static void main(String[] args) throws Exception{

        FileReader fr = new FileReader("a.txt");

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

        fr.close();
    }

2.5.2 FileWriter

FileWriter在创建时,内部默认构造一个缓冲数组,用于一次写出多个,大小是1024字节

构造方法

  • FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象。
  • FileWriter(String fileName, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。

append指定成true,在原文件后面追加,指定成false,覆盖原文件
如果不知道,默认就是false

方法

  • void close() 关闭此流,但要先刷新它。
  • void write(char[] cbuf) 写入字符数组。
  • void write(int c) 写入单个字符。
  • void write(String str) 写入字符串。
    public static void main(String[] args) throws Exception{

        FileWriter fw = new FileWriter("d.txt");
        // 写出一个字符
        fw.write(97);
        // 写出一个字符数组
        fw.write(new char[]{'我','爱','学'});
        // 写出一个字符串
        fw.write("我爱java");
        // 写出字符串中的部分数据
        fw.write("javabigdata",4,3);

        fw.close();
    }

2.6 练习 复制小说

踹凯吃完成

public static void copyText() {
    FileReader fr = null;
    FileWriter fw = null;
    try {
        fr = new FileReader("E:\\三体.txt");
        fw = new FileWriter("E:\\三体copy.txt");
        int a = -1;
        while((a = fr.read()) != -1) {
            fw.write(a);
        }
    } catch(Exception e) {
        System.out.println("出错了" + e.getMessage());
    } finally {
        try{
            fr.close();
            fw.close();    
        }catch(Exception e){
            System.out.println("出错了" + e.getMessage());
        }
    }
}

2.7 缓冲字符流

自学

2.8 总结

IO今天学的这些,以后不会直接这么用的…

学的就是一个思想: 读写的思想,要知道数据如何在程序和磁盘之间传输的

学到一些数据传输的方式: 按字节传输或者按字符串传输,或者使用缓冲区提高传输速度

学到一种代码写法: try-catch-finally

三、Hutool

Hutool 万能工具包
API网站: Overview (hutool - Gitee.com))

文件工具类 - FileUtil

IO工具类 - IoUtil

   public static void main(String[] args) {

        // 删除文件/文件夹
        // boolean del = FileUtil.del("E:\\2311\\第一组");
        // System.out.println(del );

        // 改名
        // File rename = FileUtil.rename(new File("E:\\2333.txt"), "2311.txt", true);
        // System.out.println(rename );

       // 加水印
        ImgUtil.pressText(//
                FileUtil.file("d:/taotie2.png"), //
                FileUtil.file("e:/taotie4.png"), //
                "版权所有", Color.WHITE, //文字
                new Font("黑体", Font.BOLD, 100), //字体
                0, //x坐标修正值。 默认在中间,偏移量相对于中间偏移
                0, //y坐标修正值。 默认在中间,偏移量相对于中间偏移
                0.8f//透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
        );
       
        BufferedInputStream in = FileUtil.getInputStream("E:\\Angel.mp3");
        BufferedOutputStream out = FileUtil.getOutputStream("E:\\ge.mp3");
        long copySize = IoUtil.copy(in, out, IoUtil.DEFAULT_BUFFER_SIZE);
        System.out.println("-- over --" );
    }

四、Idea导入jar包

什么是jar包?

答: 就是java代码打包

为什么要用jar包?

答: 别人写好的一些工具代码,我们项目中需要使用,所以自己的项目就需要加入这些jar包

idea项目中如何加入jar包

image-20230801172934993

image-20230801173015288

image-20230801173110963

image-20230801173209512

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Su sir~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值