Java 附加二进制文件的内容

Java 附加二进制文件的内容,java,java-io,Java,Java Io,我想将一个文件的内容附加到另一个包含内容的现有文件。我使用带有追加参数的FileOutputStream和SequenceInputStream的普通文件副本。两者都适用于txt文件,但不适用于pdf和excel等二进制文件 如果我尝试合并两个pdf文件,则结果文件中的第二个输入流总是被覆盖。对于二进制文件,有没有其他方法可以达到同样的效果 下面是我的代码 package org.saurav.simpletests.io; import java.io.FileInputStream; im

我想将一个文件的内容附加到另一个包含内容的现有文件。我使用带有追加参数的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();
            }
        }
        
        
    }

}
package org.saurav.simpletests.io;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.OutputStream;
导入java.io.SequenceInputStream;
公共类ConcatStreams{
公共静态void main(字符串a[]{
ConcatStreams ConcatStreams=新的ConcatStreams();
试一试{
InputStream input1=新文件InputStream(“”);
InputStream input2=新文件InputStream(“”);
OutputStream输出=新文件OutputStream(“”,true);
//concatStreams.mergeUsingSequenctInputStream(input1,input2);//取消对其注释以使用sequenceInputStream运行代码
concatStreams.mergeUsingFileOutputAppend(输出,输入2);
}catch(filenotfounde异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
私有void合并使用FileOutputAppend(OutputStream超出流,InputStream输入){
试一试{
字节[]缓冲区=新字节[256];
int数据;
数据=输入。读取(缓冲区);
while(数据!=-1){
String str=新字符串(缓冲区,“UTF-8”);
//系统输出打印项次(str);
超流写入(缓冲区);
数据=输入。读取(缓冲区);
}
//输出。写入(数据);
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}最后{
试一试{
exptream.close();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
私有void合并使用SequenctinInputStream(InputStream input1,InputStream input2){
SequenceInputStream SequenceInputStream=
新的SequenceInputStream(input1、input2);
FileOutputStream=null;
试一试{
fos=新文件输出流(“”);
字节[]缓冲区=新字节[256];
int数据;
数据=sequenceInputStream.read(缓冲区);
while(数据!=-1){
String str=新字符串(缓冲区,“UTF-8”);
//系统输出打印项次(str);
写入(缓冲区);
数据=sequenceInputStream.read(缓冲区);
}
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}最后{
试一试{
fos.close();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
}
致以最良好的祝愿,
Saurav

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

outStream.write(缓冲区);
请考虑输入流可能有一个小于缓冲区大小的余数。 修复程序应使用以下行:

outStream.write(缓冲区,0,数据);

我已经像这样更新了您的代码,并且能够将jpeg文件合并为两部分。

感谢您的回复…是的,我错过了其余部分…我尝试使用一个联机拆分器拆分图像文件,并尝试与上述代码合并,但没有成功