FileOutputStream追加问题,我哪里错了?

时间:2013-05-14 12:25:42

标签: java file-handling fileoutputstream

我正在尝试获取3到5个PDF文件(来自某些互联网资源)&将它们一个接一个地合并。 仅供参考,我不想使用iText或任何其他PDF库,因为,请查看代码一次

public static void saveFile(String[] urls, String fileName) throws IOException {
    ClientURLConnection clientURLConnection = null;
    InputStream inputStream = null;
    try {
        int t = 1;
        FileOutputStream outputStream = new FileOutputStream(fileName,true);
        for (String url : urls) {                
            clientURLConnection = new ClientURLConnection(url);
            clientURLConnection.setHttpMethod(ClientURLConnection.GET_METHOD);
            inputStream = clientURLConnection.getInputStream();
            outputStream.write(IOUtils.toByteArray(inputStream));
            inputStream.close();
            outputStream.flush();
            System.out.println((t++) + " - File inserted in " + fileName + "\n");
            Thread.sleep(3000);
        }
            outputStream.close();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

String [] urls - 是用于获取PDF文档的URL数组。 Sting fileName - 是一个用于存储其中所有PDF的文件。 ClientURLConnecion - 是我自己的类来处理代理和其他事情。

预期输出 - 我们从URL获取的两个PDF文件在单个文件中

实际输出 - 第二个PDF覆盖第一个,但文件的大小是两个PDF的大小的总和。

问题 - 即使我创建了FileOutputstream - 追加为true,它也会被覆盖。 我不明白我在哪里做错了

先谢谢

2 个答案:

答案 0 :(得分:2)

合并两个PDF文件并不等同于附加这些文件的二进制内容。

您的代码可能以您希望的方式附加字节 - 建议输出文件的大小 - 但是当您打开它时,您的PDF阅读器似乎只读取了最后一个附加文件

因此,您可能使用API​​来阅读PDF的实际内容。

答案 1 :(得分:0)

  

为什么合并两个PDF文件并不等同于附加这些文件的二进制内容?

每个文档文件(无论是.doc,.ppt还是.pdf)都有文件格式。文件的扩展名表示数据编码的格式。这里通过编码我的意思是文件的位和字节已写入磁盘的结构。

每个文件都包含实际数据以及定义文件元数据的一些标头。对于例如一个.doc文件会有一些关于作者的元数据以及其他几个。所有这些字段(它们的顺序等)如何存储在磁盘上取决于文件格式。这就是MS Word无法读取PDF的原因,因为它可能期望一组完全不同的字段。

现在,如果您合并以下两个PDF文件

[pdf: meta data header]       [pdf: meta data header] 
  [pdf: page1]          with    [pdf: page3]
  [pdf: page2]                  [pdf: page4]
[pdf: meta data footer]       [pdf: meta data footer]

使用基本的文件I / O合并,您将获得类似

的内容
[pdf: meta data header]
  [pdf: page1]
  [pdf: page2]
[pdf: meta data footer]
[pdf: meta data header]
  [pdf: page3]
  [pdf: page4]
[pdf: meta data footer]

这是不正确的。不能有多个标题,不同的程序会表现不同。在您的情况下,您的PDF阅读器很高兴向您展示最后合并的PDF。

如果另一方面(正如其他人所建议的那样)你使用第三方API明确支持编辑PDF文件(如iText),你可能会在合并后得到这样的东西

[pdf: meta data header]
  [pdf: page1]
  [pdf: page2]
  [pdf: page3]
  [pdf: page4]
[pdf: meta data footer]

您的PDF阅读器在正确显示时不会有任何麻烦。