Как объединить два файла AFP вместе - PullRequest
3 голосов
/ 29 сентября 2011

У меня есть два 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) {

        }
    }
}

Ответы [ 3 ]

2 голосов
/ 24 октября 2011

AFP, сгенерированный программным обеспечением Xenos D2e по умолчанию, содержит встроенные ресурсы вверху страниц, например

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

Это решит проблему.

0 голосов
/ 09 декабря 2012

Чтобы воспользоваться ответом выше о переупорядочении содержимого файлов, вот один из предложенных инструментов, который я использовал, когда работал в DST Output (очень крупной компании, занимающейся печатью и почтой).

Iсоздал утилиту с именем «afp_dd», которая работала как команда unix «dd», позволяя мне указывать значения пропуска и количества записей в командной строке для извлечения вложенных файлов, которые выходили за границы записи (стандартная программа dd ожидает записи фиксированного размера, а не переменный размер с индикатором длины в начале каждой записи).Я мог бы передать вложенные файлы через нашу программу дампа AFP, чтобы проверить их, а затем использовать выходные файлы в качестве входных данных для создания измененных файлов.

0 голосов
/ 29 сентября 2011

Из примера хранилища, вот быстрая функция для получения байтов из файла:

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); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...