Ok, eu percebi. Vários manuais Promise indicam que o tamanho da faixa é padronizado para 64k e pode ser definido como 32k ou 128k. Então, eu escrevi um pequeno aplicativo java para combinar de duas fontes diferentes, e funcionou como um encanto! Acontece que eles eram 64k listras.
Aqui está o código, para o caso de alguém mais ter esse problema. Não é extravagante (e só funciona até ficar sem espaço de entrada ou saída), mas vai tirar você de uma pitada.
public class PromiseFastTrakCombiner {
public static void main(String[] args) {
if(args.length != 4) {
System.out.println("Usage: java PromiseFastTrakCombiner <source1> <source2> <dest> <blocksize_in_kB>");
System.exit(1);
}
String source1 = args[0];
String source2 = args[1];
String dest = args[2];
int blocks = Integer.parseInt(args[3]);
System.out.println("Going to copy: " + source1 + " and " + source2 + " to " + dest + " with " + blocks + "kB blocks");
System.out.println("If this is not what you want, hit Ctrl-C now. Otherwise, hit Enter");
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
try {
FileInputStream in1 = new FileInputStream(source1);
FileInputStream in2 = new FileInputStream(source2);
FileOutputStream out = new FileOutputStream(dest);
int bufsize = 1024 * blocks;
byte[] buffer = new byte[bufsize];
long bytesread;
long totalbytes = 0;
long lastreport = 0;
while(true) {
bytesread = in1.read(buffer);
totalbytes += bytesread;
out.write(buffer);
bytesread = in2.read(buffer);
totalbytes += bytesread;
out.write(buffer);
// Progress update after every 10MB...
if(totalbytes - lastreport > 10000000) {
System.out.println("Bytes processed: " + totalbytes);
lastreport = totalbytes;
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}