ZipFile v.s. ZipInputStream in java.util.zip

积木报表v1.6.6.zip不是安装包,而是云原生交付载体 低代码报表平台的核心交付物正从传统WAR/JAR转向容器就绪型ZIP包——这是一种融合配置、运行时、数据库脚本与灾备资源的轻量级服务镜像载体。其原理在于剥离应用服务器依赖,通过Spring Boot可执行JAR+Docker Compose实现环境闭环;技术价值体现在跨平台部署一致性、断点续传友好性及最小权限安全控制;典型应用于金融、政务等强合规场景下的快速交付与灾备重建。积木报表v1.6.6正是这一范式的代表实践,深度适配Docker生态与国产化环境,同时隐含MySQL初始化保护、HikariCP硬编码优 阅读详情

网上的评论摘抄, 可以猛戳网址, 这位仁兄也是翻译的国外网站的相关评论:

类ZipInputStream读出ZIP文件序列(简单地说就是读出这个ZIP文件压缩了多少文件),而类ZipFile使用内嵌的随机文件访问机制读出其中的文件内容,所以不必顺序的读出ZIP压缩文件序列。
ZipInputStream和ZipFile之间另外一个基本的不同点在于高速缓冲的使用方面。当文件使用ZipInputStream和FileInputStream流读出的时候,ZIP条目不使用高速缓冲。然而,如果使用ZipFile(文件名)来打开文件,它将使用内嵌的高速缓冲,所以如果ZipFile(文件名)被重复调用的话,文件只被打开一次。缓冲值在第二次打开时使用。如果你工作在UNIX系统下,这是什么作用都没有的,因为使用ZipFile打开的所有ZIP文件都在内存中存在映射,所以使用ZipFile的性能优于ZipInputStream。然而,如果同一ZIP文件的内容在程序执行期间经常改变,或是重载的话,使用ZipInputStream就成为你的首选了。

我用jmh做了一个简单性能测试, 下面是代码, 备注一下:

package com;
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache license, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the license for the specific language governing permissions and
 * limitations under the license.
 */

import java.io.File;
import java.util.concurrent.TimeUnit;

import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;

/**
 * @author John Kenrinus Lee
 * @version 2016-05-07
 */
@Fork(1)
@Warmup(iterations = 4, time = 4)
@Measurement(iterations = 4, time = 4)
@State(Scope.Benchmark)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class UnzipTest {
    @Benchmark
    @Threads(1)
    public void zipinputstream() {
        File file = new File("/Users/temp/temp/weizhi21");
        ZipUtils.deleteExistsWithNoPermissionCheck(file);
        assert file.mkdirs();
        try {
            ZipUtils.unzipFileByZipInputStream(new File("/Users/temp/temp/weizhi2/temp.zip"),
                    "/Users/temp/temp/weizhi21", true, null, null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Benchmark
    @Threads(1)
    public void zipfile() {
        File file = new File("/Users/temp/temp/weizhi11");
        ZipUtils.deleteExistsWithNoPermissionCheck(file);
        assert file.mkdirs();
        try {
            ZipUtils.unzipFile(new File("/Users/temp/temp/weizhi1/temp.zip"),
                    "/Users/temp/temp/weizhi11", true, null, null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

其中ZipUtils可从我的github上下载, 这里只有部分java类达到可用的状态, 其他都属实验性状态, 代码比较凌乱, 强烈建议必须无视它.

结论: [ZipFile优于ZipInputStream]

    // Benchmark                     Mode  Samples         Score          Error  Units
    // UnzipTest.zipfile             avgt        4  70085414.616 ± 19146631.125  ns/op
    // UnzipTest.zipinputstream      avgt        4  81746111.179 ± 23409444.648  ns/op
    // UnzipTest.zipinputstream      avgt        4  78950748.131 ± 48377116.992  ns/op
    // UnzipTest.zipfile             avgt        4  68650953.926 ± 24305554.065  ns/op

备注:
tar.gz/tgz压缩方式[tar+gzip]兼容性和压缩比虽高, 但目前看Java JDK, android SDK不自带相关类库, 需要引入apache-ant.jar, 对于手机这种运算能力的设备也稍差, 而且也不如zip通用, 暂不去深究了;

13.5元低成本模拟乘法器AD633JN实测:手把手教你避开那些坑 本文以13.5元低成本模拟乘法器AD633JN为核心,通过实测搭建混沌电路的全过程,手把手教你避开电源灌流、芯片发烫、输入偏置等常见陷阱。文章详细剖析了AD633JN的比例因子、输入阻抗等关键特性,并提供了正确的电源去耦、信号耦合及稳定性布线方案,旨在帮助硬件爱好者与工程师高效利用这款高性价比芯片,节省调试时间与成本。 阅读详情

相关推荐

AST实战:解密Akamai混淆JS代码的完整流程

本文详细解析了如何使用AST技术解密Akamai混淆的JS代码,包括定位关键代码、AST解混淆实战步骤及常见问题解决方案。通过实际案例演示了从混淆代码到清晰逻辑的完整处理流程,并提供了工具推荐和法律合规建议,帮助开发者有效应对反爬虫技术。

weixin_33725722的博客 313

android 压缩文件快速,Android:更快的方式来读/写ZipInputStream?

我目前正在编写一个应用程序,它在我的assets文件夹中读取一个zip文件,其中包含一堆图像.我使用ZipInputStream API读取内容,然后将每个文件写入我的:Environment.getExternalStorageDirectory()目录.我有一切正常,但第一次运行应用程序将图像写入存储目录是不可思议的慢.将我的图像写入光盘大约需要5分钟.我的代码看起来像这样:ZipEntry ...

weixin_35886058的博客 560

mtk-drm初始化

mtk-drm初始化走读

zhexingsunba的博客 4930

Java IO操作——掌握压缩流的使用(ZipOutputStream、ZipFile、ZipInputStream)[java.util包中]...

学习目标 了解压缩流的主要作用 了解JAVA IO支持的三种压缩格式 掌握ZipOutputStream、ZipFile、ZipInputStream三个类的使用 压缩文件大致可以分为三种:ZIP、JAR、GZ 压缩流 在日常的使用中经常会使用到像WinRAR或WinZIP这样的压缩文件,通过这些软件可以把一个很大的文件进行压缩以方便传输。 在JAVA中 为了减少传输时的数据量也提供了专门的压缩流...

iteye_18817的博客 3352

HAL库硬件SPI驱动ST7735 TFT屏幕:从零实现高效刷屏与图形绘制

本文详细介绍了如何使用STM32的HAL库硬件SPI驱动ST7735 TFT屏幕,从硬件连接到SPI配置优化,再到图形绘制与文本显示的实现。重点分享了DMA传输、局部刷新等高级优化技巧,显著提升刷屏效率,帮助开发者快速掌握屏幕驱动技术并应用于实际项目。

pink的博客 740

如何使用 Python 爬虫爬取滴滴打车信息:获取司机和乘客数据

滴滴打车作为中国最大的打车平台之一,提供了丰富的司机和乘客数据,包括司机的车辆信息、乘客的评价、行程数据等。公开的司机和车辆信息(如司机的名字、车辆类型、评价等)可以通过网页直接获取,而乘客的个人信息和具体行程数据通常会受到隐私保护。在滴滴打车的网页中,司机的信息可能以特定的 HTML 标签存在,例如包含司机名称、车辆类型、车辆等级等信息。我们需要分析网页的 HTML 结构,找到这些数据所在的标签。同时,对于涉及到隐私的用户数据(如乘客的行程信息、用户评价等),我们必须特别谨慎,避免侵犯他人的隐私。

2201_76125261的博客 1917

使用java压缩文件成zip——三种方式压缩文件速度对比

java不同方法的压缩对比

gb4215287的博客 2663

北斗导航 | ChatGPT之RTK、RTD、ARAIM算法原理及程序代码(ChatGPT看你怎么回答,附部分代码)

ChatGPT之RTK、RTD、ARAIM算法原理及程序代码

尘世冰封的专栏 3677

【java】ZipInputStream与ZipFile的坑

这不是一个JAVA的坑,这也不是一个JAVA算法的坑,更加的不是ZipFile的坑,而且AI出来了之后,给全体的初级程序员挖了一个天大的坑。如果程序员再没有自己的想法,只会百度“搬” 那不需要你了。Ai搬的比你还好,“快”,“有效”,“无错”,而且,他还会分析出错误,“给出更好的答案”。

dearmite的专栏 1680

基于STM32L4XX的环境光传感器(VCNL4040M3OE)应用程序设计

• 集成模块:红外发射器(IRED)、环境光传感器(ALS)、接近传感器(PS)及信号调理IC。#define VCNL4040_I2C_ADDR (0x60 << 1) // 7位地址左移一位。// 组合成16位值。// I2C总线句柄。// 设置参数:ALS集成时间160ms,中断禁止,ALS功能开启。// 设置参数:PS工作频率80Hz,开红外二极管,PS功能开启。// 初始化I2C外设。• 输出类型:I2C总线(ALS/PS)// 2. 配置环境光传感器 (ALS) 并启动。

myron6688的博客 143

华为OD机试真题 新系统【网络数据包收发处理】

华为OD机试 新系统真题【网络数据包收发处理】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【网络数据包收发处理】多语言题解。

qq_45776114的博客 443

通过ZipInputStream来解析zip文件

1解析zip文件,可以通过ZipInputStream来解析。 如:String zipFileName="C:/Users/xucla/Desktop/CO60.zip"; ZipInputStream zip = new ZipInputStream(new FileInputStream(new File(zipFileName)));//通过ZIpInputStream得到zip文件的

xclsky的博客 2万+

Claude Code 100个真实案例 - 用AI设计Arduino PCB电路板(硬件小白也能画板)

本案例展示如何使用 Claude Code 配合 KiCad 的 Python 脚本接口,从零设计一块 Arduino 传感器扩展板 PCB。从原理图符号创建、网表生成到 PCB 布局布线,全程自动化完成,最终输出可直接发给工厂打样的 Gerber 文件。

yueyeguzhuo的专栏 438

ZIP压缩速度测试

ZIP压缩速度测试

weixin_42653892的博客 702

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

简直不敢想,我竟然把压缩20M文件从30秒优化到1秒...

程序员的成长之路互联网/程序员/成长/职场关注阅读本文大概需要 6.6 分钟。作者:不学无数的程序员来源:https://juejin.im/post/5d5626cdf265da0...

良月柒 722

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

20M文件从30秒压缩到1秒,我是如何做到的(附源码)?

点击上方“阿拉奇学Java”,选择“置顶或者星标”优质文章第一时间送达!链接:https://www.jianshu.com/p/25b328753017推荐阅读 |有一个需求需要将前端传过来的10张照片,然后后端进行处理以后压缩成一个压缩包通过网络流传输出去。之前没有接触过用Java压缩文件的,所以就直接上网找了一个例子改了一下用了,改完以后也能使用,但是随着前端所传图片的大小越来越大的时候,...

qq_36189144的博客 324

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java的zip文件压缩与解压:ZipInputStream,ZipOutputStream

通过上面的例子,我们知道压缩包里的是一个个ZipEntry对象,在解压时,可以遍历压缩包获取到ZipEntry对象。每一个ZipEntry对象都是一个文件,使用ZipFile可以获取到每一个ZipEntry对象的文件流;获取到文件流就可以将压缩包的文件读出来了。在创建ZipEntry对象时可以指定文件在压缩包的位置:new ZipEntry(“second-dir\second-01.txt”)用ZipOutputStream来压缩一个文件夹时,要搭配ZipEntry来使用。

Myd 1万+

Java IO 之 ZipFile/ZipInputStream/ZipOutputStream

进行文件操作时,一般的步骤如下: 读操作:对目标文件 new 一个输入流      —>       读取数据      —>      操作数据 写操作:对目标文件 new 一个输出流      —>       调用write方法写入数据    了解Java压缩

Holon的专栏 3596

Zip文件的解析与生成

在我们需要对Zip文件作出一些相应的操作时,我们就需要使用ZipInputStream类来解析以及生成Zip文件,ZIpInputStream是FilterInputStream的子类,所以可以知道他也是一个装饰器,并没有真正读取文件的能力,以下是Zip文件解析与生成的具体方法步骤:(一)解析Zip文件首先,我们要获取一个ZIp文件,在创建一个解压缩文件夹来存放解压出来的Zip文件内容 然后,使用ZipInputStream类对文件进行解析,在里面传入一个FileInputStream来读取到Zip文件

weixin_52237268的博客 2218

Java读取.zip文件为ZipInputStream,并读取压缩文件。

* 最近遇到一个需求,要调取接口获取一个zip文件流。解析zip包,读取启动的文件内容来进行业务处理。以下是处理读取zip压缩包方法,话不多说直接上代码。读取zip文件流,解析压缩文件。

weixin_43976964的博客 1736

Java基础之115 116 压缩与解压缩

java中实现zip的压缩与解压缩 ZipOutputStream 实现文件的压缩 ZipOutputStream(OutputStream out) 创建新的 ZIP 输出流。 void putNextEntry(ZipEntry e) 开始写入新的 ZIP 文件条目并将流定位到条目数据的开始处。 ZipEntry(String name) //test/mm.jpg /test/a.t...

C_time的博客 520

利用ZipInputStream(解压)/ZipOutputStream(压缩)文件夹

在操作.zip的压缩包时,可以用到高级流ZipInputStream和ZipOutputStream。.zip文件中的每个文件夹和文件都是一个ZipEntry对象。解压和压缩的本质就是操作每个ZipEntry对象,只能操作后缀为.zip的文件。

contact97的博客 2874

ZipInputStream实现压缩文件的读取与数据转化的过程

ZipInputStream实现压缩文件的读取与数据转化对象的过程 因为项目业务需要,实现调用第三方接口获取zip文件(byte数组形式接收),并解析文件的数据内容,将数据转化为自定义的对象保存于数据库中。整个过程不需要将文件存于磁盘。 以下为笔者所实现功能的代码,首次分享,大牛勿喷,多多指教~ public void resolveZipFile() { //自定义对象接收数...

咚咚大帝的博客 1万+

[Java语言] java 中使用ZipInputStream或ZipFile解压ZIP文件!!

下面的两个例子分别演示通过 java.util.zip 包中的  ZipInputStream和  ZipFile 来解压ZIP文件,使用的都是http://javadt.com/forum.php?mod=viewthread&tid=217&extra=生成的javadt.zip文件,解压后文件不会解压成目录,而是ZIP中所有文件都在工程当前目录中。 使用 java.util.zip.Z

dylancao的专栏 2456
上一篇: 提高android gradle构建速度的努力
下一篇: android查询几十万条数据的调研(一)
请问您哪位
博客等级 码龄15年 1粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值