Hmm .. also bei deinem Code da oben wundert es mich erlich gesagt das du das Zip überhaupt zusammengesetzt bekommst.
Ich erklär dir erstmal die "Fehler" und dann poste ich dir ein kleines Beispiel wie man sowas eleganter löst.
1) Zeile 1
Java:
splittedZips = new File[checkedCount];
Gut ... damit legst du ein neues File[]-Objekt an und speicherst dies in splittedZips *sollte demnach auch vom Typ File[] sein*.
Damit hast du zwar ein File-Array das die Größe von checkedCount hat, aber die einzelnen Felder sind immernoch NULL.
2) Zeile 3
Ist ja gut das du eine Variable für mehrere Aufgabe nutzt ... aber damit verliert man schnell den überblick und muss sich immer durch den gesamten Code wühlen. Da ein Rechner deutlich mehr Resourcen hat hättest du hier auch einen neuen int deklarieren können. Die 4 Byte mehr oder weniger im Speicher sind auf einem PC kein Problem, aber es ist schon mal ein guter Ansatz wenn du mal auf nem embedded System arbeiten musst wo jedes Byte extra Gold wert ist.
3) Zeile 4
Java:
qZipTmp = new File(selectedDirectory + System.getProperty("file.separator") + "Anhang/", "tempAntrag.zip");
Vorne machst du dir die Mühe mit System.getProperty und hinten schreibst du dann einfach ein "/". Ist zwar beides richtig und funktioniert auch beides ... aber wenn du schon einmal die einfach Variante drin hast kannst du das auch anstelle des System.getProperty machen
4) Zeilen 7 bis 13
Ähäm ... also was diese for() soll versteh ich gerade überhaupt nicht.
Gut ... soweit wie ich das sehe speichert sie das Array splittedZipsTmp in umgekehrter Reihenfolge in splittedZips. Bevor ich sowas schreiben würde würde ich mir erstmal Gedanken machen WARUM ich das schreiben sollte : suche hier also weiter oben einen Ansatz bei dem das Array splittedZipsTmp gleich in der richtigen Reihenfolge angelegt wird. Sowas ist eine unnötige Performancebremse und ist ein Zeichen für schlechtes Konzept und schlechten Code.
5) Zeile 14
Java:
for(int j=0; j < splittedZips.length; j++)
Da splittedZips vom Typ File[] ist und du im Schleiferumpf eh ein File-Objekt brauchst kannst du hier ein
foreach draus machen. Das sieht in Java dann so aus:
Java:
for(File file : splittedZips)
und beim erstellen des FIS nutzt du dann anstelle von splittedZips[j] einfach file.
6) Zeile 18
Achtung : prüfen auf read(byte[]) > 0 sollte man laut Doc
NICHT machen. Das wirst du später sehen wenn du mal mit Sockets und Verbindungen darüber arbeitest. Du solltest hier lieber auf read(byte[]) != -1 prüfen da read(byte[]) im Fehlerfall -1 zurückgibt, aber 0 wenn einfach nichts gelesen wurde. Das 0 zurückgegeben wird kann z.B. vorkommen wenn du von einem gepuffertem Stream liest und dieser aber noch nicht genug Daten im Puffer hat das er dir diese über read(byte[]) zur verfügung stellt.
Da man aber nicht nur Meckern sondern auch bei Fehlern helfen soll hier mal ein sehr kompaktes Beispiel
Java:
private void binaryJoin() throws Exception
{
String PATH=this.getClass().getResource(this.getClass().getSimpleName()+".class").toString();
if(PATH.contains("!"))
PATH=PATH.substring(0, PATH.indexOf("!"));
PATH=(new File(PATH.substring(PATH.indexOf("/"), PATH.lastIndexOf("/")))).getAbsolutePath();
FileOutputStream fos=new FileOutputStream(new File(PATH, "output.zip"));
File[] inputFiles=(new File(PATH)).listFiles(new FilenameFilter()
{
public boolean accept(File path, String name)
{
Pattern pattern=Pattern.compile("input\\.[\\d]{3}\\.zip");
Matcher matcher=pattern.matcher(name);
return matcher.matches();
}
});
for(File file : inputFiles)
{
FileInputStream fis=new FileInputStream(file);
int br=0;
byte[] buf=new byte[8129];
while((br=fis.read(buf))!=-1)
{
fos.write(buf, 0, br);
}
fis.close();
}
fos.close();
}
Zur kurzen Erklärung einiger Zeilen
1) Zeilen 3 bis 6
String PATH enthält den absolute Pfad zur aktuellen Klasse. Daher müssen die Input-Files auch im selben Ordner liegen und das Output-File wird ebenfalls im selben Ordner erstellt. Bei Unterordnern ggf an entsprechender Stelle anpassen.
2) Zeilen 8 bis 16
Erzeugen eines File-Arrays des aktuellen Ordners. Dabei werden nur Dateien in das Array aufgenommen auf das die RegEx zutrifft.
Beispiel : "input.XXX.zip" wobei XXX eine
dreistellige Zahl ist.
benötigtes Paket : java.util.regex.*
3) Zeilen 17 bis 27
foreach über das eben erzeugte File-Array.
Dabei wird für jedes File ein neuer FileInputStream geöffnet , aus diesem bis EOF gelesen , dabei mit einem Buffer von 8kByte *kannst du auch anpassen* in den FileOutputStream des Output-Files geschreiben und das InputFile wieder geschlossen.
Eine Prüfung ob das Array-Feld NULL ist brauchst du nicht da dieses Array aus den Verzeichnisinformationen erstellt wurde und daher nur gültige File-Objekte enthält.
Eine OutputStream.flush() ist hier nicht nötig da du keinen BufferedStream verwendest.
Ob die RegEx jetzt wirklich so hinhaut weis ich nicht da das jetzt nur schnell aus dem Kopf mit Hilfe der APi-Doc geschrieben ist , müsste aber so hinhauen.
Wichtig sind die
doppelten Backslashes vor den Punkten da ein Punkt in einer RegEx als Symbol für "jedes Zeichen" steht.
So habe ich in der selben Anzahl an Zeilen eine komplett funktionierende Methode an stelle deines Codes wobei bei dir da noch einiges fehlt. Auch habe ich einfach "throws Exception" drangeschrieben weil es wohl am einfachsten ist anstatt jede mögliche Exception *namentlich : IOException , FileNotFoundException und andere die damit in zusammenhang stehen* einzelen und in richtiger Reihenfolge anzugeben.
Was jetzt deinen Code im zweiten Post angeht würde ich erstmal das ganze Lesen der einzelnen Files zum Testen rausnehmen und erstmal nur mit einem anderen Tool wie WinRar o.ä. prüfen ob überhaupt der
gesamte Inhalt gefunden wird oder ob vorher eine Exception fliegt. Denn einfach "findet am einem bestimmten Punkt nichts mehr"
ohne Exception ist in Java nicht möglich. Ansonsten ist das File beschädigt / falsch zusammen kopiert.