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

菜鸟之路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);
    }
}

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

相关文章:

  • Linux系统编程之高级信号处理
  • 文字识别软件cnocr学习笔记
  • VisionMaster4.4 python脚本 图像处理 转换函数 爱之初体验
  • 七星棋牌顶级运营产品全开源修复版源码教程:6端支持,200+子游戏玩法,完整搭建指南(含代码解析)
  • 功能开关聚合对象实践:提升金融领域的高可用性
  • 最新 :服务器的cuda版本太老旧怎么办--cuda安装指南
  • 钉钉多维表:数据管理与协作的新篇章
  • WEB安全--SQL注入--bypass技巧
  • 【SpringBoot整合系列】HttpClient远程访问的示例
  • ”将一维数组a中的n个数逆序存放到原数组“的算法时间和空间复杂度
  • UNIAPP开发之利用阿里RTC服务实现音视频通话后端THINKPHP5
  • 利用爬虫精准获取商品销量详情:实战案例指南
  • luci界面开发中的MVC架构——LuCI介绍(二)
  • ubuntu22.04桥接模式开代理
  • Mac M3/M4 本地部署Deepseek并集成vscode
  • 氧传感器芯片cj125驱动
  • XTOM-TRANSFORM自动化三维测量系统用于汽车零部件质量控制
  • Unity shader glsl着色器特效之 模拟海面海浪效果
  • Redis 存在线程安全问题吗?为什么?
  • 快速入门——Vue框架快速上手