将 ZipEntry 复制到新 ZipFile 的惯用方法是什么?

2024-02-09

我正在编写一个工具来在 DOCX 文件(一种压缩格式)中进行一些小的文本替换。我的方法是复制ZipEntry使用以下命令将原始文件中条目的内容写入修改后的文件中ZipOutputStream。对于大多数 DOCX 文件来说,这很有效,但偶尔我会遇到ZipException关于我编写的内容与包含在其中的元信息之间的差异ZipEntry(通常是压缩大小的差异)。

这是我用来复制内容的代码。为了简洁起见,我删除了错误处理和文档处理;到目前为止,我在文档输入方面还没有遇到任何问题。

ZipFile         original = new ZipFile(INPUT_FILENAME);
ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(OUTPUT_FILE));
Enumeration     entries = original.entries();
byte[]          buffer = new byte[512];
while (entries.hasMoreElements()) {
    ZipEntry    entry = (ZipEntry)entries.nextElement();
    if  ("word/document.xml".equalsIgnoreCase(entry.getName())) {
        //perform special processing
    }
    else{
        outputStream.putNextEntry(entry);
        InputStream in = original.getInputStream(entry);
        while (0 < in.available()){
            int read = in.read(buffer);
            outputStream.write(buffer,0,read);
        }
        in.close();
    }
    outputStream.closeEntry();
}
outputStream.close();

直接复制的正确或惯用方法是什么ZipEntry物体从一ZipFile到另一个?


我找到了避免该错误的解决方法。通过创建一个新的ZipEntry仅设置名称字段,我就可以毫无问题地复制内容。

ZipFile         original = new ZipFile(INPUT_FILENAME);
ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(OUTPUT_FILE));
Enumeration     entries = original.entries();
byte[]          buffer = new byte[512];
while (entries.hasMoreElements()) {
    ZipEntry    entry = (ZipEntry)entries.nextElement();
    if  ("word/document.xml".equalsIgnoreCase(entry.getName())) {
        //perform special processing
    }
    else{
        // create a new empty ZipEntry
        ZipEntry newEntry = new ZipEntry(entry.getName()); 
//      outputStream.putNextEntry(entry);
        outputStream.putNextEntry(newEntry);
        InputStream in = original.getInputStream(entry);
        while (0 < in.available()){
            int read = in.read(buffer);
            if (read > 0) {
              outputStream.write(buffer,0,read);
            }
        }
        in.close();
    }
    outputStream.closeEntry();
}
outputStream.close();

但是,此方法会丢失原始字段中存储的任何元信息ZipEntry(例如:评论、额外)。 API 文档并不清楚这是否重要。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 ZipEntry 复制到新 ZipFile 的惯用方法是什么? 的相关文章

  • 具有默认值的 Java JAX-RS 自定义参数

    假设我有这个 这只是一个示例 GET Path value address Produces application json public Response getAddress QueryParam user User user 用户是
  • Windows批处理文件:将结构转换为单行字符串

    我需要将这个艰巨的任务作为批处理文件来完成 这对于 C 来说不是最困难的 但在 DOS 中是一个地狱 至少对我来说 我需要将结构转换为单个 var 字符串 才能在我的程序中再次将它们转换为该结构 别担心回归 一切都已经完成了 该结构的大小会
  • Hashmap并发问题

    我有一个哈希图 出于速度原因 我希望不需要锁定 假设我不介意过时的数据 同时更新它和访问它会导致任何问题吗 我的访问是获取 而不是迭代 删除是更新的一部分 是的 这会导致重大问题 一个例子是向散列映射添加值时可能发生的情况 这可能会导致表重
  • 使用 Java 在 WebDriver 中按 Ctrl+F5 刷新浏览器

    我已经使用 java 刷新了 WebDriver 中的浏览器 代码如下 driver navigate refresh 如何使用 Java 在 WebDriver 中按 Ctrl F5 来做到这一点 我认为您可以使用 WebDriver 和
  • 无法使用 json 架构验证器根据预定义的 yaml 文件验证查询参数

    我需要根据预定义的 yaml 文件架构验证查询参数的架构 因此我使用 json 架构验证器 验证如何失败 我正在执行以下步骤 填充参数和相应的架构 final List
  • 哪个 Swing 布局管理器可以获得我想要的布局?

    我正在尝试按照这个模型制作一个基本的登录菜单 我决定将整个菜单放入 JPanel 中 以便在连接成功后我可以切换到另一个面板 所以我决定使用 Borderlayout 将标题放在北区 将连接按钮放在南区 我将边框布局的中心本身设置为面板 我
  • 将过滤器添加到 Eclipse 中的 Project Explorer

    我想向 Project Explorer 添加一个新的过滤器 以向用户隐藏一些在 Eclipse RCP 应用程序中自动创建的项目 到目前为止我已经找到了两个扩展点 org eclipse ui ide resourceFilters 允许
  • 请参阅 Java EE eclipse 调试中的 POST 参数

    我在调试 Java EE 方面没有经验 我更像是一个 javascript 人 我需要查看哪些 HTTP POST 参数到达服务器端 我在表单将其操作指向的 jsp 文件中放置了一个断点 现在我在调试变量窗口中找不到 POST 内容 他们在
  • 如何拦截 REST 端点以接收所有标头?

    我当前的代码是 Path login RequestScoped public class LoginResource GET SecurityChecked public Response getUser HeaderParam AUTH
  • Java Microsoft Excel API [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 fopen() 包装器创建 ZIP 文件

    如何使用以下命令创建 ZIP 文件fopen 包装器 http es php net manual en wrappers compression php 这显然是not道路
  • 在 Java 中将弯音发送到 MIDI 音序器

    我了解启动和运行 MIDI 音序器的基础知识 并且希望能够在播放过程中增加 减小序列的音高 但弯音是发送到合成器而不是音序器的消息 我尝试将音序器的接收器设置为合成器的发射器 当我发送弯音短消息时 音序器保持相同的音调 但随后合成器以新的弯
  • 改变for循环的顺序?

    我遇到一种情况 我需要根据用户输入以不同的顺序循环遍历 xyz 坐标 所以我是 3D 空间中的一个区域 然后是一组像这样的 for 循环 for int x 0 x lt build getWidth x for int y 0 y lt
  • Hibernate HQL:将对值作为 IN 子句中的参数传递

    我面临一个问题 如何使用 IN 子句将查询中的成对值的参数传递给 HQL 例如 select id name from ABC where id reg date in x y 并且参数是不同的数据类型string id 和reg date
  • Android Gradle 同步失败:无法解析配置“:classpath”的所有工件

    错误如下 Caused by org gradle api internal artifacts ivyservice DefaultLenientConfiguration ArtifactResolveException Could n
  • 失败时石英重试

    假设我有一个这样配置的触发器
  • 防止Java实例化的正确方法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 每次我们调用浏览器时,在 selenium 中使用 driver.manage().window().maximize() 是否好?

    We use driver manage window maximize 最大化浏览器 我在网上看到一些使用的例子driver manage window maximize 尽管不需要最大化浏览器 例如 gmail 登录 我还看到使用 se
  • 为什么应该首选 Java 类的接口?

    PMD https pmd github io 将举报以下违规行为 ArrayList list new ArrayList 违规行为是 避免使用 ArrayList 等实现类型 而是使用接口 以下行将纠正违规行为 List list ne
  • 如何捕获 try-with-resource 语句中 close 方法抛出的异常

    我正在读关于try with resourceJava 中的语句可用于指定任意数量的资源 try Resource1 res1 initialize code Resource1 res2 initialize code statement

随机推荐

  • 绝对定位元素上的 nowrap 和 max-width 问题

    我猜这两个属性实际上并不一起工作 但我的情况是 我正在尝试创建一个工具提示组件 我的工具提示是绝对定位的 并且由于我不知道内容的长度是多少 所以没有宽度 因此 对于与宽度相关的 css 文本只是形成一个又高又瘦的列 我试过max width
  • 在闪亮的应用程序中调整导航栏菜单的高度

    我有一个基本的闪亮应用程序 我希望能够在其中设置名为 Navnar 的导航栏菜单的高度 我没有看到任何设置其高度的选择 ui r library markdown navbarPage Navbar tabPanel Plot sideba
  • 如何在 Artillery.i.o 中运行 Node-js 脚本而不将其包含在负载测试场景中

    我要对用户在地址簿中添加联系人的场景进行负载测试 为此 用户必须首先登录其帐户 我有一个 Nodejs 脚本 自动登录 js 为用户和 json 文件执行登录 联系人 json 其中具有在地址簿中添加联系人所需的配置和 POST 请求参数
  • 如何将表达式作为 Angular2 中的输入传递给组件?

    我需要将一个表达式传递给将在组件模板内计算的组件 例如 组件 Component selector app my component export class MyComponent Input items MyClass Input ex
  • Visual Studio 2012 中的 TypeScript 无法编译

    我已经安装了打字稿 v0 9 1 1 在我的 Visual Studio 2012 安装上 但我无法让它编译我的 ts构建期间的文件 请参见下面的屏幕截图 我已经尝试过这里发布的许多不同的解决方案 但没有一个对我有用 请注意 我可以创建一个
  • 使用 jQuery 对文本输入数组索引重新编号

    我有以下 HTML 块 用于作为表单的一部分从用户收集有关项目的信息 div class clone block Name div
  • 如何使用dispatch_async_f?

    我想要排队的函数不带参数 我传递什么paramContext 传入 NULL 会生成编译错误 无效使用 void 表达式 我不想只是为了编译而向我的函数添加参数 我该如何使其工作 Mac OS X Snowleopard 带有 Object
  • 在 git 中取消暂存已删除的文件

    通常 要放弃对文件的更改 您可以执行以下操作 git checkout
  • kivy python3检测鼠标滚轮

    你好 我想在 kivy 的图表中创建缩放效果 我在 Windows 上的 python 3 6 64 位中使用 kivy 1 10 我想在我的图形小部件中检测鼠标滚轮事件 但我找不到如何执行此操作 我的代码 import itertools
  • 将变量从控制器传递到 Yii 中的视图

    我无法在相应视图中使用控制器中指定的变量 这是我的代码 public function actionHelloWorld this gt render helloWorld array var gt this is me 在 helloWo
  • 在方向改变时重新渲染网页的最佳方法是什么?

    我有一个流畅的 CSS 布局 当我改变方向时 它在 iPhone 上渲染得很糟糕 刷新后看起来不错 我使用下面的代码来刷新方向更改的页面 效果很好 只是感觉这样做有点不对 有没有什么方法可以实现这一点而无需重新加载整个页面 这是一个移动网站
  • 如何获取/proc/[pid]/status信息

    是否有一个定义的结构来获取特定进程的该文件的每个字段而不是解析该文件 The proc pid创建伪文件系统的目的是为了使其他程序能够访问大量内核数据 而无需与二进制结构绑定 尽管 proc pid status旨在 以更易于人类解析的格式
  • 如何在 Lumen 5.5 中将作业分派到特定队列

    在标准作业中 我使用此方法来调度作业 dispatch new PurchaseJob trxId method params 接下来我想调度另一个作业来发送电子邮件 但我想将其拆分到另一个单独的队列 根据我在 Laravel 5 5 文档
  • 命令行工具已安装,是否使用“软件更新”来安装更新?

    我收到您在下面看到的错误 xcode select error command line tools are already installed use Software Update to install updates Name Nam
  • 如何处理 NextJS 导出带有 .html 扩展名的文件,但在 中没有 .html

    所以 我有一个 NextJS 应用程序 我构建链接的方式是通过组件 例如 a My page a 我已经使用此模式构建了整个应用程序 但是 当我进行导出以生成静态站点时 它创建了包含带有 html 扩展名的页面的 out 文件夹 这现在是一
  • getElementById 用于 XML 文档、Mozilla 扩展

    Is document getElementById使用 Mozilla 中的 DOMParser 方法从 XML 字符串解析 DOM 时支持的方法吗 我正在制作一个 Mozilla 扩展 它读取 XML 文件并使用 DOM 解析器将 XM
  • 在 silverlight 应用程序中使用 Windows 集成身份验证和 SqlRoleProvider

    我正在开发 Web 应用程序 该应用程序要求将用户分配到角色并根据其角色授予不同的权限 通过使用 Forms Authentication 和 SqlRoleProvider 可以轻松完成此操作 但是 应用程序将在企业内部网内部使用 并且表
  • AWS lambda java响应不支持嵌套对象?

    我是 Java 新手 所以这可能与 AWS lambda 根本无关 然而 lambda 对输入 输出对象采取了如此自由的态度 我认为它是罪魁祸首 我正在构建我的第一个 lambda 函数 并希望返回一个简单的 JSON 结构 在此示例中进一
  • Python 3 和 b'\x92'.decode('latin1')

    我使用 latin1 编解码器解码 b x92 得到了意想不到的结果 请参阅下面的会议 Python 3 5 2 v3 5 2 4def2a2901a5 Jun 25 2016 22 01 18 MSC v 1900 32 bit Inte
  • 将 ZipEntry 复制到新 ZipFile 的惯用方法是什么?

    我正在编写一个工具来在 DOCX 文件 一种压缩格式 中进行一些小的文本替换 我的方法是复制ZipEntry使用以下命令将原始文件中条目的内容写入修改后的文件中ZipOutputStream 对于大多数 DOCX 文件来说 这很有效 但偶尔