Hallo Java-Forum,
ich bin momentan an einem Problem, bei dem ich aktuell nicht mehr selbst weiter weiß.
Ausgangspunkt ist folgender:
Unter einem Oberordner gibt es diverse Ordner mit Tagesdaten. Unter diesen Unterordnern hängen Dateien und Ordner ohne bekannte Namen. In diesen Ordnern sind XML-Dateien und TIF-Dateien. Die XML-Dateien haben in einem Tag die Namen der zugeordneten Tifs, die aber nicht im selben Order/Tagesdatum sein müssen.
Ordnerstruktur veranschaulicht:
Oberordner\
020215\
xml\
tif\
030215\
xml\
abzug2\
dritterabzug\
040215\
Meine Aufgabe soll es sein ein Programm zu schreiben, welches durch Übergabe der Namen von XMLs sowie des Oberordners und eines Zielordners die passenden XML und TIF-Dateien findet und zum Zielordner kopiert.
Der Dateiname einer XML kommt aus einer Datenbank und ist dort als pagid bezeichnet (nur zum etwaigen Codeverständnis)
Soweit so gut. Hier ist mal meine Rohfassung:
Mein Problem ist nun folgendes:
Die Methode SearchRecursiv bleibt "hängen" Und zwar jedes mal bei dem Ordner Oberordner\020215\tif (daher auch die System.Outs). Ich weiß nicht genau an was es liegt, aber ich schätze die Größe dieses Ordners spielt eine große Rolle. In dem Ordner sind round about 94000 Dateien mit einer Gesamtgröße von insgesamt 2,5 GB. Gibt es eine elegante Möglichkeit wie ich das ganze effektiv durchsuche, bzw. meinen Code überhaupt bei solchen Datenmengen zum laufen bekomme ?
Für Kritik an meinem Code bin ich natürlich gerne zu haben - ich bin hier um zu lernen und nicht um mit Samthandschuhen angepackt zu werden
Vielen Dank schonmal
ich bin momentan an einem Problem, bei dem ich aktuell nicht mehr selbst weiter weiß.
Ausgangspunkt ist folgender:
Unter einem Oberordner gibt es diverse Ordner mit Tagesdaten. Unter diesen Unterordnern hängen Dateien und Ordner ohne bekannte Namen. In diesen Ordnern sind XML-Dateien und TIF-Dateien. Die XML-Dateien haben in einem Tag die Namen der zugeordneten Tifs, die aber nicht im selben Order/Tagesdatum sein müssen.
Ordnerstruktur veranschaulicht:
Oberordner\
020215\
xml\
tif\
030215\
xml\
abzug2\
dritterabzug\
040215\
Meine Aufgabe soll es sein ein Programm zu schreiben, welches durch Übergabe der Namen von XMLs sowie des Oberordners und eines Zielordners die passenden XML und TIF-Dateien findet und zum Zielordner kopiert.
Der Dateiname einer XML kommt aus einer Datenbank und ist dort als pagid bezeichnet (nur zum etwaigen Codeverständnis)
Soweit so gut. Hier ist mal meine Rohfassung:
Java:
public static boolean XmlTifSearch(String root, String[] pagid, String dest){
suchlist = Arrays.asList(pagid);
listenart = "xml";
File dir = new File(root);
File destfile;
try{
LinkedList<File> xmlresult = new LinkedList<File>();
searchRecursiv(dir, xmlresult);
tifsuch = new LinkedList<String>();
for(File f : xmlresult){
tifsuch.addAll(ermittleTif(f));
}
LinkedList<File> tifresult = new LinkedList<File>();
if (!tifsuch.getFirst().equals(" ")){
searchRecursiv(dir, tifresult);
}
for(File xml : xmlresult){
destfile = new File(dest+"xml\\"+xml.getName());
copyFile(xml, destfile);
}
for(File tif : tifresult){
destfile = new File(dest+"tif\\"+tif.getName());
copyFile(tif, destfile);
}
return true;
}
catch(Exception e){
e.printStackTrace(); //Ja ich weiß, super Handling...
return false;
}
}
private static List<String> ermittleTif(File f) throws IOException, JDOMException {
List<String> tifname = new LinkedList<String>();
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(f);
Element root = doc.getRootElement();
List<Element> children = root.getChildren();
List<Element> docChild;
for (int i = 0; i < children.size(); i++) {
if (children.get(i).getName().equals("document")) {
docChild = children.get(i).getChildren();
for (int j = 0; j < docChild.size(); j++) {
if (docChild.get(j).getName().equals("primarycontent")) {
tifname.add(docChild.get(j).getChild("file")
.getAttributeValue("contentfile"));
} else {
}
}
}
}
return tifname;
}
private static void searchRecursiv(File currentFolder, List<File> result){
File[] content = currentFolder.listFiles();
for(File f:content){
System.out.println("SearchRecursiv Aktuelle Datei: "+f.getName());
if (f.isDirectory()){
System.out.println("Datei ist Directory - nächster Recursivaufruf");
searchRecursiv(f, result);
}
else if (isFileValid(f)){
result.add(f);
}
}
}
private static boolean isFileValid(File f){
if (listenart.equals("xml")){
return suchlist.contains(f.getName()+".xml");
}
else if (listenart.equals("tif")){
return tifsuch.contains(f.getName()+".tif");
}
else return false;
}
private static boolean copyFile(final File src, final File dest)
throws IOException {
FileChannel srcChannel = new FileInputStream(src).getChannel();
FileChannel destChannel = new FileOutputStream(dest).getChannel();
try {
srcChannel.transferTo(0, srcChannel.size(), destChannel);
} catch (IOException e) {
e.printStackTrace();
return false;
} finally {
if (srcChannel != null)
srcChannel.close();
if (destChannel != null)
destChannel.close();
}
return true;
}
}
Mein Problem ist nun folgendes:
Die Methode SearchRecursiv bleibt "hängen" Und zwar jedes mal bei dem Ordner Oberordner\020215\tif (daher auch die System.Outs). Ich weiß nicht genau an was es liegt, aber ich schätze die Größe dieses Ordners spielt eine große Rolle. In dem Ordner sind round about 94000 Dateien mit einer Gesamtgröße von insgesamt 2,5 GB. Gibt es eine elegante Möglichkeit wie ich das ganze effektiv durchsuche, bzw. meinen Code überhaupt bei solchen Datenmengen zum laufen bekomme ?
Für Kritik an meinem Code bin ich natürlich gerne zu haben - ich bin hier um zu lernen und nicht um mit Samthandschuhen angepackt zu werden
Vielen Dank schonmal
Zuletzt bearbeitet: