day16_IO

news2024/11/19 4:44:29

今日内容

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中进⾏数据传输的技术就是“流”.

image-20230227145557596

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1150142.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从 Hash索引、二叉树、B-Tree 与 B+Tree 对比看索引结构选择

从 Hash索引、二叉树、B-Tree 与 BTree 对比看索引结构选择 1、Hash 结构1.1、关于 Hash 数据结构1.2、InnoDB索引为啥不选 Hash 结构1.3、关于InnoDB 提供自适应 Hash 索引 (Adaptive Hash Index) 2、二叉搜索树3、平衡二叉树(AVL树 &#x…

EMQX内置Web管理控制台-Dashboard

一、Dashboard概述 EMQX Dashboard官网文档:https://docs.emqx.com/zh/enterprise/v5.1/dashboard/introduction.html 1、简介 EMQX 为用户提供了一个功能强大的内置管理控制台,即 EMQX Dashboard。通过这个控制台的 Web 界面,用户可以轻松监…

基于STM32闭环步进电机控制系统设计

**单片机设计介绍,1654基于STM32闭环步进电机控制系统设计(仿真,程序,说明) 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序文档 六、 文章目录 一 概要 基于STM32的闭环步进电机控制系统设计是…

劳动安全无小事,劳保安全鞋为您的足部安全保驾护航

安全生产责任重于泰山。日常说到劳动防护,人们往往先想到的是安全帽、工作服、安全带等身体与头部的防护,从而足部的伤害是较容易被人们所忽视的。其实脚部的防护至关重要,我们在日常工作中常见的足部伤害有:冲击、撞击伤害&#…

CSS中的栅格布局

CSS中的栅格布局 在写前端项目的时候,我之前一直习惯使用flex布局,flex布局写起来比较随心,几乎可以实现任意形式的页面布局。不过自从B占看到某位大佬的grid布局后,发现布局居然还可以这么玩,正好自己在写一个vue3的…

中兴再推爆款,双2.5G网口的巡天AX3000Pro+仅需299元

10月30日消息,中兴新款路由器中兴巡天AX3000Pro将于10月31日20:00正式开售,当前可在天猫、京东及红魔商城进行预约,首发价格299元。 据了解,中兴巡天AX3000Pro是中兴智慧家庭推出的巡天系列新品,也是当前市场上唯一一款300元价位内配备双2.5G网口的路由器。 中兴巡天AX3000Pro…

客户端与服务端实时通讯(轮询、websocket、SSE)

客户端与服务端实时通讯 背景 在某些项目中,某些数据需要展示最新的,实时的,这时候就需要和服务端进行长时间通讯 方案 对于数据实时获取,我们一般会有4种方案: 1.短轮询:使用浏览器的定时器发起http请…

三叠云督察督办解决方案:助力企业高效决策与执行

信息时代的到来,企业面临着日益增长的管理挑战。高竞争的商业环境中,如何实现高效的决策和执行成为了企业迫切需要解决的问题。在现代企业管理中,督察督办工作的重要性也日益凸显。 然而,传统的督察督办模式存在诸多问题&#xff…

JavaScript组合模式

JavaScript组合模式 1 什么是组合模式2 宏命令3 示例:扫描文件夹4 引用父对象 1 什么是组合模式 组合模式是一种结构型设计模式,用于将对象组合成树形结构,并使客户端能够统一处理单个对象和组合对象。它通过使用继承和组合两个概念&#xf…

题目描述:输入数字,第一行为数组的大小,第二行为数组的值。求其中相邻两个数字相差不大于8的最大片段的长度。

题目描述: 输入数字,第一行为数组的大小,第二行为数组的值。求其中相邻两个数字相差不大于8的最大片段的长度。 示例1: 输入:91 2 4 6 12 2 8 6 4 输出:5示例2: 输入:101 4 5 6 2…

数据清洗(1)--数据查缺补漏

前言 之前使用scikit 进行一些基础模型的选择(SVM支持向量机,LR算法,KNN,SGD,Bays贝叶斯,决策树,随机森林),创建,训练(测试集验证集)…

Redis测试新手入门教程

在测试过程中,我们或多或少会接触到Redis,今天就把在小破站看到的三丰老师课程,把笔记整理了下,用来备忘,也希望能给大家带来亿点点收获。 主要分为两个部分: 一、缓存技术在后端架构中是如何应用的&#…

C语言实现求某班学生的平均成绩和均方差

完整代码: /* 已知求成绩的平均值和均方差公式为:𝑎𝑣𝑒 ∑𝑠𝑖/n , 𝑑𝑒𝑣 √(∑ (𝑠𝑖−𝑎𝑣&#x1d45…

Android开发知识学习——HTTPS

文章目录 定义HTTPS连接HTTPS 连接建立的过程课后题 定义 HTTP Secure / HTTP over SSL / HTTP over TLS SSL:Secure Socket Layer -> TLS Transport Layer Security 定义:在HTTP之下增加的一个安全层,用于保障HTTP的加密传输 本质&…

Python 自动化测试全攻略:五种自动化测试模型实战详解!

随着移动互联网的发展,软件研发模型逐步完善,软件交付质量越来越受到软件公司的重视,软件测试技术特别是自动化测试技术开始在软件系统研发过程中发挥着越来越重要的作用。 与传统的手工测试技术相比,自动化测试具备了良好的可操…

Mysql进阶-索引篇(下)

SQL性能分析 SQL执行频率 MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次,通过sql语句的访问频次,我们可…

技术视角下的跑腿小程序开发:关键挑战和解决方案

跑腿小程序作为连接服务提供者和用户的桥梁,面临着诸多技术挑战。本文将聚焦于技术层面的关键挑战,并提供解决方案,以帮助开发者应对技术上的复杂问题。 1. 实时性与性能挑战 挑战: 跑腿小程序需要实时地匹配订单、更新状态和提…

【java学习—十】操作集合的工具类Collections(8)

文章目录 1. 操作集合的工具类: Collections2. 应用3. 查找、替换3.1. max 与 min3.2. 根据Comparator返回max(min) 3.3. frequency 与 replaceAll4. 同步控制 1. 操作集合的工具类: Collections Collections 是一个操作 Set 、List 和 Map 等集合的工具…

从LLM到AIGC,开启AI时代寻宝之旅!

引言 还记得《头号玩家》中男主人公赢得游戏的方式吗——在游戏中漫无目的地闲逛,然后发现彩蛋,获得胜利。 在人工智能领域,有一种新奇性搜索原则的实验,使得机器研究的成功之路恰似寻找彩蛋的道路。比如在不设定“出门”目标的情…