【问题标题】:Appending content of binary files [duplicate]附加二进制文件的内容[重复]
【发布时间】:2020-07-21 17:36:31
【问题描述】:

我想将一个文件的内容附加到另一个包含内容的现有文件中。我使用带有附加参数的 FileOutputStream 以及 SequenceInputStream 使用纯文件副本。两者都适用于 txt 文件,但不适用于 pdf 和 excel 等二进制文件。

如果我尝试合并两个 pdf 文件,则第二个输入流总是会在结果文件中被覆盖。有没有其他方法可以为二进制文件实现相同的目标?

下面是我的代码。

package org.saurav.simpletests.io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.SequenceInputStream;

public class ConcatStreams {
    
    public static void main (String a[]) {
        
        ConcatStreams concatStreams = new ConcatStreams();
        
        
        try {
            InputStream  input1 = new FileInputStream("<path to first binary file>");
            InputStream input2 = new FileInputStream("<path to second binary file>");
            
            OutputStream  output = new FileOutputStream("<path to first binary file> ",true);
            //concatStreams.mergeUsingSequenctInputStream(input1,input2); // uncomment it to run the code with sequenceInputStream
            concatStreams.mergeUsingFileOutputAppend(output, input2);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
        
    }
    
    private void mergeUsingFileOutputAppend(OutputStream outStream, InputStream input) {
        
        
        try {
            byte[] buffer = new byte[256];
            int data;
            
                data = input.read(buffer);
                while(data != -1){
                    String str = new String(buffer, "UTF-8");
                    //System.out.println(str);
                    outStream.write(buffer);
                    data = input.read(buffer);
                    
                }
            
           //output.write(data);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
           try {
            outStream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        }
    }
    
    private void mergeUsingSequenctInputStream(InputStream input1, InputStream input2) {
        
        

        SequenceInputStream sequenceInputStream =
            new SequenceInputStream(input1, input2);
        FileOutputStream fos = null;
        try {
        fos = new FileOutputStream("<path to first binary file>");
        byte[] buffer = new byte[256];
        int data;
        
            data = sequenceInputStream.read(buffer);
            while(data != -1){
                String str = new String(buffer, "UTF-8");
                //System.out.println(str);
                fos.write(buffer);
                data = sequenceInputStream.read(buffer);
                
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                fos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        
    }

}

最好的问候, 索拉夫

【问题讨论】:

    标签: java java-io


    【解决方案1】:

    您的实现中存在一个错误:您总是将固定的字节块(等于缓冲区的大小)写入输出流,请注意这一行:

    outStream.write(buffer);
    

    请注意输入流的余数可能小于缓冲区大小。 修复应使用以下行:

    outStream.write(buffer, 0, data);
    

    我已经像这样更新了你的代码,并且能够加入被分成两部分的 jpeg 文件。

    【讨论】:

    • 感谢您的回复...是的,我错过了其余部分...我尝试使用在线拆分器拆分图像文件并尝试与上述代码合并,但没有成功
    猜你喜欢
    • 1970-01-01
    • 2020-10-07
    • 2017-05-12
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 2013-12-01
    相关资源
    最近更新 更多