【问题标题】:Why byte array of .doc or .docx file in Java changes everytime the file is saved again in MS Word?为什么每次在 MS Word 中再次保存文件时,Java 中 .doc 或 .docx 文件的字节数组都会发生变化?
【发布时间】:2016-06-14 15:57:08
【问题描述】:

我正在尝试在 Java 中读取字节数组中的 .doc 或 .docx 文件。我不期待使用任何第三方 API,如 Apache POI、TIKA、doc4j 等。 最简单的代码是:-

Path file_path = Paths.get("D:\\", "myname3.doc");
    byte[] ByteArray= Files.readAllBytes(file_path);
    for(byte b : ByteArray){
        System.out.print(b);
    }

代码工作正常,我收到了字节数组。但是,当我在 MS Word 中再次打开同一个文件时,没有进行任何更改,而是以相同的内容再次将其保存在同一个驱动器中,我收到的字节数组完全不同。我知道存在与修改时间有关的元数据差异,但字节数组完全不同,好像文件的全部内容已更改。 (附加包含两个迭代的字节数组的文本文件)。 Difference in Byte Array

是否有不使用第三方 API 的解决方案?

注意:- 我已经查看了 MS 网站上给出的 Word 编码格式,并且还查看了字节顺序问题以防万一。还尝试通过 FileInputStreamReader 读取文件。

注意:- 此程序适用于 ASCII 格式的文本文件。

编辑 1:- 只是为了使问题清晰。当我读取以不同名称保存在同一位置两次的 .docx 文件时,当我使用上述程序读取文件时,字节数组完全不同。我想知道这背后的原因。

编辑 2:- 我尝试在 OffVis 工具中读取文件,但原始字节也不同。

【问题讨论】:

  • 问题是什么?不清楚。
  • 尝试再次将两个字节数组保存到磁盘上,看看这两个文件是否会打开,它们的内容是否相同
  • 由于我必须将字节数组转换为 char 格式,因此内容将不一样,因为字节已转换为 char。 @tfosra
  • 不,您不必将每个字节保存为 char,而是使用 ByteArrayOutputStream 中的字节数组将所有数据保存回另一个物理文件。也可以使用Files.write(...)方法
  • 在 byteArrayOutputStream 中存储字节数组,然后将其写入另一个文件只不过是将字节从一个文件复制到另一个文件。当我每次接收不同的字节数组时,如果我将它们复制到另一个文件,数组的内容不会改变。

标签: java file bytearray streamreader doc


【解决方案1】:

这绝对可以用.docx来解释,它只是一个zipped, XML-based file format。由于它是一个压缩文件,因此对其中一个基础文件的轻微更改可能会在全局范围内彻底改变存档文件的位。

不知道为什么会发生在 doc 上。

【讨论】:

  • 我试过为Doc文件做,但是字节数组不同。
【解决方案2】:

.Doc 文件每次都会产生相同的字节数组。 如答案所述,.docx 文件是一个压缩的 OOXML 文件,因此,当我尝试通过 officeVis 查找二进制文件时,添加了一些额外的字节,因此整个字节数组要么被移动,要么被改变。 另一个观察结果是,我的系统中有一个安全应用程序正在加密 .doc 文件,因此,当我尝试通过智能手机(没有安全应用程序)读取文件时,一切正常。

感谢您的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    相关资源
    最近更新 更多