菜鸟之路Day17一一IO流(三)

菜鸟之路Day17一一IO流(三)

作者:blue

时间:2025.2.20

文章目录

  • 菜鸟之路Day17一一IO流(三)
    • 0.概述
    • 1.打印流
      • 1.1字节打印流
      • 1.2字符打印流
    • 2.解压缩流/压缩流
      • 2.1解压缩流
      • 2.2压缩流
    • 3.Commons-io工具包
    • 4.HuTool工具包

0.概述

文章内容学习自黑马程序员BV1yW4y1Y7Ms

1.打印流

分类:打印流一般是指:PrintStream,PrintWriter两个类

特点1:打印流只操作文件目的地,不操作数据源

特点2:特有的写出方法可以实现,数据原样写出

​ 例如:打印:97,文件中:97

特点3:特有的写出方法,可以自动刷新,自动换行

​ 打印一次数据 = 写出 + 换行 + 刷新(字节流底层没有缓冲区,开不开自动刷新都一样)

1.1字节打印流

public class myPrintStreamDemo1 {
    public static void main(String[] args) throws FileNotFoundException {
        /*
        * 字节打印流:
        *  构造方法
        *       public PrintStream(OutputStream/File/String)
        *       public PrintStream(String fileName,Charset charset)
        *       public PrintStream(OutputStream,boolean autoFlush) 自动刷新
        *	    public PrintStream(OutputStream,boolean autoFlush,String encoding)
        *  成员方法:
        *       public void write(int b)
        *       public void println() 打印任意数据,自动刷新,自动换行
        *       public void print()   不换行
        *       public void printf(String format,Object args) 带占位符打印语句,不换行
        * */
        PrintStream ps = new PrintStream(new FileOutputStream("src\\a.txt"),true, Charset.forName("UTF-8"));
        ps.println(666);
        ps.printf("%d",999);
    }
}

1.2字符打印流

字符流底层有缓冲区,想要自动刷新需要开启

public class myPrintStreamDemo2 {
    public static void main(String[] args) throws IOException {
        /*
         * 字符打印流:
         *  构造方法
         *       public PrintWriter(OutputStream/File/String)
         *       public PrintWriter(String fileName,Charset charset)
         *       public PrintWriter(OutputStream,boolean autoFlush) 自动刷新
         *       public PrintWriter(OutputStream,boolean autoFlush,String encoding)
         *  成员方法:
         *       public void write(int b)
         *       public void println() 打印任意数据,自动刷新,自动换行
         *       public void print()   不换行
         *       public void printf(String format,Object args) 带占位符打印语句,不换行
         * */
        PrintWriter pw = new PrintWriter(new FileWriter("src\\a.txt"),true);
        pw.println("mwnwzdhxhn");
        pw.print("aaa");
        pw.close();
    }
}

我们平时用的System.out.println();其实就是打印流的一个应用

public class myPrintStreamDemo3 {
    public static void main(String[] args) {
        //获取打印流的对象,此打印流在虚拟机启动的时候,由虚拟机创建,默认指向控制台
        //特殊的打印流,系统中的标准输出流,是不能关闭的,在系统中是唯一的。
        PrintStream ps = System.out;
        ps.println("123");
    }
}

2.解压缩流/压缩流

2.1解压缩流

压缩包里面的每一个文件都是ZipEntry对象,解压的本质,就是把每一个ZipEntry按照层级拷贝到本地另一个文件夹中

public class ZipStreamDemo1 {
    public static void main(String[] args) throws IOException {
        File src = new File("源文件位置");
        File dest = new File("目标文件位置");

        unzip(src, dest);
    }

    private static void unzip(File src, File dest) throws IOException {
        //解压的本质就是将压缩包中每一个文件读取出来,按层级复制到目的位置
        //创建一个解压缩流来读取压缩包中的数据
        ZipInputStream zis = new ZipInputStream(new FileInputStream(src));
        ZipEntry entry;
        while((entry=zis.getNextEntry())!=null){ //getNextEntry方法用来获取下一个entry对象
            if(entry.isDirectory()) {
                //如果entry是文件夹,则要在当前位置创建一个文件
                File file = new File(dest,entry.toString());
                file.mkdirs();
            }
            else {
                //如果是文件的话就要做一个文件拷贝
                FileOutputStream fos = new FileOutputStream(new File(dest,entry.toString()));
                int ch;
                while((ch=zis.read())!=-1){
                    fos.write(ch);
                }
                fos.close();
                //表示压缩包中一个文件处理完毕了
                zis.closeEntry();
            }
        }
        zis.close();
    }
}

2.2压缩流

压缩本质:把每一个(文件/文件夹)看成ZipEntry对象放到压缩包中

压缩单个文件

public class ZipStreamDemo2 {
    public static void main(String[] args) throws IOException {
        File src = new File("源文件");
        File dest = new File("目的地址");
        ToZip(src,dest);
    }

    private static void ToZip(File src, File dest) throws IOException {
        //创建一个压缩流对象关联压缩包
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(new File(dest,"a.zip")));
        //用ZipEntry对象来代表压缩包中的文件
        ZipEntry entry = new ZipEntry("a.txt");
        //把ZipEntry对象放到压缩包中
        zos.putNextEntry(entry);
        FileInputStream fis = new FileInputStream(src);
        int b;
        while((b=fis.read())!=-1){
            zos.write(b);
        }
        zos.closeEntry();//表示压缩包中一个文件处理完毕了
        fis.close();
        zos.close();
    }
}

压缩整个文件夹

public class ZipStreamDemo3 {
    //需求:压缩一整个文件夹
    public static void main(String[] args) throws IOException {
        //1.创建一个File对象表示要压缩的文件夹
        File src = new File("源文件");
        //2.获取其父级路径,也就是其存放的位置
        File destparent = src.getParentFile();
        //3.创建目的File对象,也就是压缩包
        File dest = new File(destparent,src.getName()+".zip");
        //4.创建压缩流,来管理压缩包
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(dest));
        //5.对文件进行压缩
        ToZipFunction(src,zos,src.getName());
        //6.释放资源
        zos.close();
    }
    /*
    * 作用:对文件进行压缩
    * 参数一:数据源
    * 参数二:管理压缩包的压缩流
    * 参数三:压缩包内部路径
    * */
    private static void ToZipFunction(File src, ZipOutputStream zos, String name) throws IOException {
        //获取数据源中的每一个文件
        File[] files = src.listFiles();
        //遍历每一个文件
        for (File file : files) {
            if(file.isFile()) {
                //首先要在压缩包中创建这个文件
                ZipEntry entry = new ZipEntry(name+"\\"+file.getName());
                zos.putNextEntry(entry);
                //如果是文件则copy
                FileInputStream fis = new FileInputStream(file);
                int b;
                while((b=fis.read())!=-1){
                    zos.write(b);
                }
                fis.close();
                //关闭当前的entry对象
                zos.closeEntry();
            }
            else {
                //如果是文件夹则递归
                ToZipFunction(file,zos,name+"\\"+file.getName());
            }
        }
    }

}

3.Commons-io工具包

Commons-io是apache开源基金组织提供的一组有关IO操作的开源工具包

作用:提高IO流的开发效率

Commons-io使用步骤

​ ①在项目中创建一个文件夹:lib

​ ②将jar包复制粘贴到lib文件夹

​ ③右键点击jar包,选择Add as Library -> 点击ok

​ ④在类中导包使用

常用方法

	   /*
        * FileUtils类
        *   static void copyFile(File srcFile,File destFile)    复制文件
        *   static void copyDirectory(File srcDir,File destDir) 复制文件夹(直接拷贝数据源中的内容)
        *   static void copyDirectoryToDirectory(File srcDir,File destDir) 复制文件夹(直接将srcDir塞到destDir中)
        *   static void deleteDirectory(File directory) 删除文件夹
        *   static void cleanDirectory(File directory) 清空文件夹(清空里面的内容)
        *   static String readFileToString(File file,Charset encoding) 读取文件中的数据变成字符串
        *   static void write(File file,CharSequence data,String encoding) 写出数据
        *
        * IOUtils类
        *   public static int copy(InputStream input,OutputStream output) 复制文件
        *   public static int copyLarge(Reader input,Writer output) 复制大文件
        *   public static String readLines(Reader input) 读取数据
        *   public static void write(String data,OutputStream output) 写出数据
        * */

4.HuTool工具包

难得糊涂,无所谓失,无所谓得

简介 | Hutool

Hutool🍬一个功能丰富且易用的Java工具库,涵盖了字符串、数字、集合、编码、日期、文件、IO、加密、数据库JDBC、JSON、HTTP客户端等功能。

public class myhutoolDemo1 {
    public static void main(String[] args) {
        /*
        * FileUtil类:
        *   file:根据参数创建一个file对象
        *   touch:根据参数创建文件
        *
        *   writeLines:把集合中得数据写出到文件中,覆盖模式
        *   appendLines:把集合中得数据写出到文件中,续写模式
        *   readLines:指定字符编码,把文件中得数据,读到集合中
        *   readUtf8Lines:按照UTF-8的形式,把文件中的数据,读到集合中
        *
        *   copy:拷贝文件或者文件夹
        * */

        //hutool这个方法可以接熟可变参数,自动拼接成一条文件路径
        File file = FileUtil.file("D:\\","aaa","bbb","a.txt");
        System.out.println(file);

        File touch = FileUtil.touch(file);//touch根据参数创建文件,它的强大之处在于,即便文件不存在也能创建
                                          //会将其连同父级路径一同创建出来
        System.out.println(touch);

        ArrayList<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");

        File file1 = FileUtil.writeLines(list, file, "UTF-8");
        System.out.println(file1);

        File file2 = FileUtil.appendLines(list, file, "UTF-8");
        System.out.println(file2);

        //读取的时候认为一行为一个元素
        List<String> strings = FileUtil.readLines(file, "UTF-8");
        System.out.println(strings);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3项目,蛋糕商城系统

简单的vue3商城 蛋糕商城系统 下单平台 带用户 登录 注册 首页轮播图 购物车后台管理 商品订单 登录注册 商品详情 纯前端无后台、无数据库 纯Vue3项目作业 vue3 setup语法糖写法 技术实现 本项目主要使用如下技术实现&#xff0c; - 基于vue3vite搭建的项目框架 -…

快速上手gdb/cgdb

Linux调试器-gdb使用 1.背景2.调试原理、技巧命令2.1指令2.2 本质2.3 技巧 1.背景 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 要使用gdb调试&#xff0c;必须在源代码生成二进制程序的时候, 加上 -g…

LLM增强强化学习:开启智能决策的新篇章

标题期刊年份关键词Survey on Large Language Model-Enhanced Reinforcement Learning: Concept, Taxonomy, and MethodsIEEE Transactions on Neural Networks and Learning Systems2024Reinforcement learning (RL), large language models (LLM), vision-language models (V…

ECMAScript6------数组扩展

ECMAScript6------数组扩展 1.扩展运算符1.1 含义1.2 应用(1)复制数组(浅拷贝)(2)合并数组(3)与解构赋值结合(4)字符串(5)实现了Iterator接口的对象(6)Map和Set结构,Generator 函数 2.Array.from和Array.of(1)Array.from(2)Array.of 3.新增的实例方法(1)copyWithin()(2)find(回…

C++,设计模式,【工厂方法模式】

文章目录 如何用汽车生产线理解工厂方法模式?一、传统生产方式的困境二、工厂方法模式解决方案三、模式应用场景四、模式优势分析五、现实应用启示✅C++,设计模式,【目录篇】 如何用汽车生产线理解工厂方法模式? 某个早晨,某车企CEO看着会议室里堆积如面的新车订单皱起眉…

Web入侵实战分析-常见web攻击类应急处置实验2

场景说明 某天运维人员&#xff0c;发现运维的公司站点被黑页&#xff0c;首页标题被篡改&#xff0c;你获得的信息如下&#xff1a; 操作系统&#xff1a;windows server 2008 R2业务&#xff1a;公司官网网站架构&#xff1a;通过phpstudy运行apache mysqlphp开放端口&…

企业内部知识库:安全协作打造企业智慧运营基石

内容概要 作为企业智慧运营的核心载体&#xff0c;企业内部知识库通过结构化的信息聚合与动态化的知识流动&#xff0c;为组织提供了从数据沉淀到价值转化的系统性框架。其底层架构以权限管理为核心&#xff0c;依托数据加密技术构建多层级访问控制机制&#xff0c;确保敏感信…

第十二届先进制造技术与材料工程国际学术会议 (AMTME 2025)

重要信息 大会官网&#xff1a;www.amtme.org&#xff08;了解会议&#xff0c;投稿等&#xff09; 大会时间&#xff1a;2025年3月21-23日 大会地点&#xff1a;中国-广州 简介 2025年第十二届先进制造技术与材料工程 (AMTME 2025) 定于2025年3月21-23日在中国广州隆重举…

[展示]Webrtc NoiseSuppressor降噪模块嵌入式平台移植

最近在尝试把WebRtc的NoiseSuppressor模块移植到嵌入式平台&#xff0c;现在已经移植了&#xff0c;尝试了下效果&#xff0c;降噪效果很显著&#xff0c;噪声带被显著抑制了 降噪前&#xff1a; 降噪后&#xff1a;

禁止WPS强制打开PDF文件

原文网址&#xff1a;禁止WPS强制打开PDF文件_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何避免WPS强制打开PDF文件。 方法 1.删除注册表里.pdf的WPS绑定 WinR&#xff0c;输入&#xff1a;regedit&#xff0c;回车。找到&#xff1a;HKEY_CLASSES_ROOT\.pdf删除KWPS.PDF…

后端Java Stream数据流的使用=>代替for循环

API讲解 对比 示例代码对比 for循环遍历 package cn.ryanfan.platformback.service.impl;import cn.ryanfan.platformback.entity.Algorithm; import cn.ryanfan.platformback.entity.AlgorithmCategory; import cn.ryanfan.platformback.entity.DTO.AlgorithmInfoDTO; im…

JUC并发—8.并发安全集合一

大纲 1.JDK 1.7的HashMap的死循环与数据丢失 2.ConcurrentHashMap的并发安全 3.ConcurrentHashMap的设计介绍 4.ConcurrentHashMap的put操作流程 5.ConcurrentHashMap的Node数组初始化 6.ConcurrentHashMap对Hash冲突的处理 7.ConcurrentHashMap的并发扩容机制 8.Concu…

Java中的常用类 --String

学习目标 掌握String常用方法掌握StringBuilder、StringBuffer了解正则 1.String ● String是JDK中提前定义好的类型 其所在的包是java.lang ,String翻译过来表示字符串类型&#xff0c;也就是说String类中已经提前定义好了很多方法都是用来处理字符串的&#xff0c;所以Str…

wps中的js开发

严格区分大小写 /*** learn_js Macro*/ function test() {Range(D7).Value2Selection.Value2; // Selection.formula "100" }function Workbook_SheetSelectionChange(Sh, Target) {if(Sh.Name Sheet1) {test();}}function test2() {// 把I4单元格及其周边有数的单…

QT事件循环

文章目录 主事件循环事件循环事件调度器事件处理投递事件发送事件 事件循环的嵌套线程的事件循环deleteLater与事件循环QEventLoop类QEventLoop应用等待一段时间同步操作模拟模态对话框 参考 本文主要对QT中的事件循环做简单介绍和使用 Qt作为一个跨平台的UI框架&#xff0c;其…

3-知识图谱-知识图谱的存储与查询

基于关系型数据库的知识图谱存储 基于原生图的知识图谱存储 关系型数据库的局限性 因为关系数据库&#xff0c;不善于处理“关系” 图数据库&#xff1a; Relations Are First-class citizens 在关系数据库中&#xff0c;关系是隐藏表达的。通过外键关联实体&#xff0c;表达…

【HarmonyOS Next】鸿蒙监听手机按键

【HarmonyOS Next】鸿蒙监听手机按键 一、前言 应用开发中我们会遇到监听用户实体按键&#xff0c;或者扩展按键的需求。亦或者是在某些场景下&#xff0c;禁止用户按下某些按键的业务需求。 这两种需求&#xff0c;鸿蒙都提供了对应的监听事件进行处理。 onKeyEvent 默认的…

SpringCloud-Eureka初步使用

什么是REST是一组用于规范资源在网络中转移的表现形式软件架构设计风格.简单来说就是客户端和服务器之间的一种交互形式 什么是RESTful,满足了REST风格的接口或者程序,RESTful API是其中的接口,spring中提供了RestTemplate这个类,他强制执行了REST的规范,包括使用HTTP协议的状…

SpringBoot+uniApp日历备忘录小程序系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.日历渲染代码&#xff1a;2.保存备忘录代码&#xff1a;3.删除备忘录代码&#xff1a; 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBootuniApp框架开…

推荐给 Easysearch 新用户的几个 Elasticsearch 可视化工具

Easysearch 作为国产化的 Elasticsearch&#xff08;ES&#xff09;替代方案&#xff0c;兼容 Elasticsearch 生态系统中的多种工具。本文将介绍几款适合 Easysearch 用户的可视化工具&#xff0c;帮助您更高效地管理和查询数据。 1. Elasticsearch Head 插件 在ES培训经常提…