无法使用FileOutputStream在一个合并文件中显示两个文件的内容,而是只显示第一个文件中的内容



我正在尝试读取字节数组中的两个docx文件,并尝试使用FileOutputStream将其写入一个docx文档中。以下是我在groovy和grails中使用的代码片段。

byte[] firstFile = Files.readAllBytes(Paths.get("D:/MyDoc/firstFile.docx"));
byte[] secFile = Files.readAllBytes(Paths.get("D:/MyDoc/secFile.docx"));
FileOutputStream f = new FileOutputStream(new File("D:/MyDoc/mergedFile.docx"));
f.write(firstFile);
f.write(secFile);
f.close();

问题是文件大小增加了,但合并文件中的内容仅来自第一个文件。相同的代码适用于txt文件,但不适用于docx文件。

我认为这应该是一些显示/格式化问题,这就是为什么它没有显示第二个文件的内容。

这是因为docx不是一种简单的文件格式。关于原始数据,第二文件的数据被附加到第一文件。但是Word将读取文件开头的头信息,这将是第一个文件的头信息并且只解释第一个文件。这是因为标题中有一部分告诉单词文档有多大。单词将只读取文档的定义长度,而忽略其他所有内容。

一些小例子:

文件1.docx

<HEADER>
FILE_SIZE=3
<BODY>
1
2
3

文件2.docx

<HEADER>
FILE_SIZE=2
<BODY>
1
2

如果你把两者结合起来,你会得到:

<HEADER>
FILE_SIZE=3
<BODY>
1
2
3
<HEADER>
FILE_SIZE=2
<BODY>
1
2

但是Word将从顶部开始解释此文件。在读取标题和文件只有3行长的信息后,它将在第一个文档之后停止
这个例子当然非常简单!!!

如果你真的想使用java中的docx文件,你应该使用一个理解单词格式并适当处理它的库。像DOCX4J或Apache POI

相关内容