我有两个AFP文件,我想将它们连接在一起,我怎样才能实现这一目标。我编写了java代码来连接它们,使用BufferedInputStream和BufferedOutputStream,结果AFP格式不正确。我甚至尝试使用linux cat但产生相同的错误结果。请帮忙。我不认为问题是我的java代码,但我发布下面的代码以防万一。
注意:一个奇怪的事情是,如果我切换连接的顺序,那么它会产生正确的格式输出。例如,如果我连接A.afp然后连接B.afp,那么输出就搞砸了,但如果我连接B.afp,那么A.afp然后它会产生正确的格式结果。但我需要A.afp出现在B.afp之前
public static void main(String[] args) {
String filePath1 = "C:\\dev\\harry\\ETCC_data\\3199_FI_20_20110901143009.afp";
String filePath2 = "C:\\dev\\harry\\ETCC_data\\3643_FI_49_20110901143006.afp";
ConcatenateMain cm = new ConcatenateMain();
cm.concate(filePath1, filePath2);
}
private void concate(String filePath1, String filePath2){
BufferedInputStream bis1 = null;
BufferedInputStream bis2 = null;
FileInputStream inputStream1 = null;
FileInputStream inputStream2 = null;
FileOutputStream outputStream = null;
BufferedOutputStream output = null;
try{
inputStream1 = new FileInputStream(filePath1);
inputStream2 = new FileInputStream(filePath2);
bis1 = new BufferedInputStream(inputStream1);
bis2 = new BufferedInputStream(inputStream2);
List<BufferedInputStream> inputStreams = new ArrayList<BufferedInputStream>();
inputStreams.add(bis1);
inputStreams.add(bis2);
outputStream = new FileOutputStream("C:\\dev\\harry\\ETCC_data\\output.afp");
output = new BufferedOutputStream(outputStream);
byte [] buffer = new byte[BUFFER_SIZE];
for(BufferedInputStream input : inputStreams){
try{
int bytesRead = 0;
while ((bytesRead = input.read(buffer, 0, buffer.length)) != -1)
{
output.write(buffer, 0, bytesRead);
}
}finally{
input.close();
}
}
}catch(IOException e){
}finally{
try {
output.close();
} catch (IOException e) {
}
}
}
答案 0 :(得分:2)
Xenos D2e软件生成的AFP默认包含页面顶部的内联资源,如下所示
AFP file 1 resources AND AFP file 2 resources
AFP file 1 content AFP file 2 content
但是,当我尝试将这两个文件连接在一起时,某些资源将位于连接文件的中间,从而搞乱了结果
AFP file 1 resources
AFP file 1 content
AFP file 2 resources ------> resources should not be in the middle page
AFP file 2 content
因此解决方案是将所有资源导出到外部文件,然后您可以连接如下
AFP file resources
AFP file 1 content
AFP file 2 content
这将解决问题。
答案 1 :(得分:0)
从示例库中,这是一个从文件中获取字节的快速函数:
public static byte[] getBytesFromFile(File file) throws IOException {
InputStream is = new FileInputStream(file);
// Get the size of the file
long length = file.length();
// Create the byte array to hold the data
byte[] bytes = new byte[(int)length];
// Read in the bytes
int offset = 0;
int numRead = 0;
while (offset < bytes.length
&& (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
offset += numRead;
}
// Ensure all the bytes have been read in
if (offset < bytes.length) {
throw new IOException("Could not completely read file "+file.getName());
}
// Close the input stream and return bytes
is.close();
return bytes;
}
然后只需加载它们并将其写入文件
try {
FileOutputStream fos = new FileOutputStream("C:\\dev\\harry\\ETCC_data\\output.afp");
byte[] bytes1 = getBytesFromFile(new File(filePath1));
byte[] bytes2 = getBytesFromFile(new File(filePath2));
fos.write(bytes1);
fos.write(bytes2);
fos.flush();
fos.close();
}
catch(FileNotFoundException ex) { System.out.println("FileNotFoundException : " + ex); }
catch(IOException ioe) { System.out.println("IOException : " + ioe); }
答案 2 :(得分:0)
为了捎带上面关于重新订购文件内容的答案,这是我在DST Output(一家非常大的印刷和邮件公司)工作时制作的建议工具。
我创建了一个名为“afp_dd”的实用程序,它的工作方式与unix“dd”命令类似,允许我在命令行中指定记录跳过和计数值,以提取打破记录边界的子文件(标准dd程序)期望固定大小的记录,而不是可变大小,每个记录的开头附近有一个长度指示符)。我可以通过我们的AFP转储程序管道子文件来检查它们,然后使用输出子文件作为输入来创建更改的文件。