Verzeichnisse rekursiv durchlaufen und dann RegEx

Status
Nicht offen für weitere Antworten.

muemmel_0811

Bekanntes Mitglied
Hi zusammen,

ich hab hier ein kleines Tool gebastelt, mit dem es mir möglich ist, genau den ersten Treffer in einer htm- bzw. html-Datei zu ersetzen. Mein Problem ist jetzt allerdings, dass das Tool zwar sehr gut funktioniert, aber leider nur, wenn es sich um eine Hand voll Dateien handelt - bei ca. 200 Dateien ist Schluss und es gibt folgende Fehlermeldung: Exception in Thread "Main" Java.lang.OutOfMemoryError: Java Heap Space

Hier der Code:
Code:
import java.util.*;
import java.util.regex.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ImgRegEx extends JFrame{
   JLabel lblPfad = new JLabel("Pfad: ");
   JTextField inPfad = new JTextField();
   JButton go = new JButton("Go !");
   JLabel lblMuster = new JLabel("Suche: ");
   JTextField inMuster = new JTextField();
   JLabel lblRep = new JLabel("Ersetze: ");
   JTextField inRep = new JTextField();
   JLabel lblZeig = new JLabel();
   Pan pan = new Pan();

   ImgRegEx() {
      super();
      setTitle("ImgRegEx");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      initLaF();
      setLayout(new BorderLayout());
      getContentPane().add(pan, BorderLayout.CENTER);
   }

   public class Pan extends JPanel {
      JTextArea textfeld = new JTextArea(20,30);
      Pan() {
         super();
         setLayout(null);
         lblMuster.setBounds(10,10,50,20);
         add(lblMuster);
         inMuster.setBounds(60,10,700,20);
         add(inMuster);
         lblRep.setBounds(10,40,50,20);
         add(lblRep);
         inRep.setBounds(60,40,700,20);
         add(inRep);
         lblPfad.setBounds(10,60,50,40);
         add(lblPfad);
         inPfad.setBounds(60,70,700,20);
         add(inPfad);
         go.setBounds(10,100,200,20);
         add(go);
         go.addActionListener(new Liste());
         lblZeig.setBounds(220,100,500,20);
         add(lblZeig);
         textfeld.setBounds(10,130,770,190);
         add(textfeld);
      }
   }

   class Liste implements ActionListener{
      public void actionPerformed(ActionEvent ae) {
         String p = inPfad.getText();
         File f = new File(p);
         listen(f);
      }
   }

   class DateiFilter implements FileFilter {
      private String ende1, ende2;
      public DateiFilter(String endung1, String endung2) {
         ende1 = endung1;
         ende2 = endung2;
      }
      public boolean accept(File dat) {
         if(dat.isDirectory() == true) {
            return true;
         }
         else {
            if(dat.getName().endsWith(ende1) == true || dat.getName().endsWith(ende2) == true) {
               return true;
            }
            else {
               return false;
            }
         }
      }
   }

   static void listen(File dir) {
      DateiFilter filter = new DateiFilter(".html",".htm");
      File[] dateien = dir.listFiles(filter);

      if(dateien != null) {
         for(int i=0; i<dateien.length; i++) {
            //System.out.println(dateien[i].getAbsolutePath());
            lblZeig.setText(dateien[i].getAbsolutePath());
            if(dateien[i].isDirectory()) {
               System.out.println(dateien[i].getAbsolutePath());
               lblZeig.setText(dateien[i].getAbsolutePath());
               listen(dateien[i]);
            }
         }
      }

      for(int j=0; j<dateien.length; j++) {
         try {
            BufferedReader rein = new BufferedReader(new FileReader(dateien[j]));
            StringBuffer puffer = new StringBuffer();
            String zeile;
            while((zeile = rein.readLine()) != null) {
               puffer.append(zeile);
               puffer.append('\n');
            }
            rein.close();
            String inhalt = new String(puffer);
            pan.textfeld.setText("");
            pan.textfeld.setText(inhalt);
            pan.textfeld.setCaretPosition(0);
            pan.textfeld.selectAll();
            String regMus = inMuster.getText();
            String repText = inRep.getText();
            Pattern p = Pattern.compile(regMus);
            Matcher m = p.matcher(pan.textfeld.getSelectedText());
            String result = m.replaceFirst(repText);n
            pan.textfeld.selectAll();
            pan.textfeld.setText(result);
            BufferedWriter raus = new BufferedWriter(new FileWriter(dateien[j]));
            pan.textfeld.selectAll();
            String merk = pan.textfeld.getSelectedText();
            raus.write(merk);
            raus.close();
         }
         catch(Exception e) {
         }
      }
   }

   public void initLaF() {
      try {
         UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
         SwingUtilities.updateComponentTreeUI(this);
         SwingUtilities.updateComponentTreeUI(pan);
      }
      catch(Exception c){
      }
   }

   public static void main (String [] args) {
      JFrame fenster = new ImgRegEx();
      fenster.setSize(800,360);
      fenster.setLocation(200,200);
      fenster.setVisible(true);
      fenster.setResizable(false);
   }
}


Ich bin mir durchaus bewusst, dass das Tool keine Meisterleistung ist, aber bevor ich 10.000 Dateien, um die es wirklich geht, von Hand anfasse kann ich auch mit einem unperformanten Tool leben und lieber eine halbe Stunde Kaffee trinken gehen ;).

Wäre jemand so lieb und würde mir dabei helfen, das Tool für 10.000 Dateien fit zu machen?

Grüße,
muemmel
 

Kim Stebel

Bekanntes Mitglied
Vorschlag: Sämtliche leeren catch-Blöcke mit e.printStackTrace(); füllen. Wahrscheinlich tritt hin und wieder eine Exception auf, die dann dazu führt, dass die Methode abgebrochen wird, bevor close() ausgeführt werden kann. Außerdem sollten alle close()-Aufrufe im finally-Block stehen.
 

muemmel_0811

Bekanntes Mitglied
Kim Stebel hat gesagt.:
Vorschlag: Sämtliche leeren catch-Blöcke mit e.printStackTrace(); füllen. Wahrscheinlich tritt hin und wieder eine Exception auf, die dann dazu führt, dass die Methode abgebrochen wird, bevor close() ausgeführt werden kann. Außerdem sollten alle close()-Aufrufe im finally-Block stehen.

Hallo Kim,

Du hattest Recht - es gibt einen Haufen an Fehlermeldungen... hier mal ein Block davon
Code:
java.io.FileNotFoundException: E:\Programmieren\Java\RegEx\testSeiten\menudlg_it_files (Zugriff verweigert)
 at java.io.FileInputStream.open(Native Method)
 at java.io.FileInputStream.<init>(FileInputStream.java:106)
 at java.io.FileReader.<init>(FileReader.java:55)
 at ImgRegEx.listen(ImgRegEx.java:117)
 at ImgRegEx.listen(ImgRegEx.java:109)
 at ImgRegEx$Liste.actionPerformed(ImgRegEx.java:68)
 at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
 at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
 at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
 at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
 at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:234)
 at java.awt.Component.processMouseEvent(Component.java:5488)
 at javax.swing.JComponent.processMouseEvent(JComponent.java:3093)
 at java.awt.Component.processEvent(Component.java:5253)
 at java.awt.Container.processEvent(Container.java:1966)
 at java.awt.Component.dispatchEventImpl(Component.java:3955)
 at java.awt.Container.dispatchEventImpl(Container.java:2024)
 at java.awt.Component.dispatchEvent(Component.java:3803)
 at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
 at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
 at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
 at java.awt.Container.dispatchEventImpl(Container.java:2010)
 at java.awt.Window.dispatchEventImpl(Window.java:1766)
 at java.awt.Component.dispatchEvent(Component.java:3803)
 at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
 at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:234)
 at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
 at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

Ich gehe jetzt mal davon aus (ich weiß es nämlich nicht besser), dass die erste Zeile das eigentliche Problem verursacht und der Rest danach nur die Folge ist.
Ich hab jetzt mal kurz alle Dateien ausgeben lassen und dabei hat sich gezeigt, dass zuerst alle Dateien auf oberster Ebene geändert werden und dann wird in Ebene 1.1 (nur bildlich) gegangen und dort alle Dateien geändert und dann springt es wieder auf die Ebene 1 (es gibt auch keine 1.1.1) und dann versucht es wieder in Ebene 1.1 zu kommen und dann erscheint die Fehlermeldung.
Ich schließe daraus, dass das Problem am rekursiven Durchlauf der Verzeichnisse liegt, aber wie macht man es denn richtig, damit jedes Verzeichnis auch nur einmal durchlaufen wird?

Mag mir nochmal jemand helfen?

Danke und Grüße,
muemmel
 
S

SlaterB

Gast
also das 'Zugriff verweigert'-Problem klingt ja etwas härter, oder meinst du, dass die falsche Rekursion das verursacht?

dass zuerst alle Dateien auf oberster Ebene geändert werden und dann wird in Ebene 1.1 (nur bildlich) gegangen und dort alle Dateien geändert und dann springt es wieder auf die Ebene 1 (es gibt auch keine 1.1.1) und dann versucht es wieder in Ebene 1.1 zu kommen und dann erscheint die Fehlermeldung.
und fällt dir nicht ein, wie du prüfen könntest, ob und warum das Programm das macht?
pflastere doch dein Programm voll mit Ausgaben a la

"durchsuche nun Order x"
"durchsuche nun Order y, i.ter Unterorder von x"
...
 

Kim Stebel

Bekanntes Mitglied
Welche IDE verwendest du? Gar keine? Dann besorg dir Eclipse oder Netbeans und lerne, einen Debugger zu benutzen. Von diesem println()-pseudo-debugging bekomme ich Kopfschmeren. :wink:
 

muemmel_0811

Bekanntes Mitglied
Hallo Ihr,

ich hab mir einige Eurer Tipps zu Herzen genommen und bin jetzt dabei rausgekommen:
Code:
void listen(File dir) {
      DateiFilter filter = new DateiFilter(".html",".htm");
      File[] dateien = dir.listFiles(filter);

      if(dateien != null) {
         for(int i=0; i<dateien.length; i++) {
            if(dateien[i].isDirectory()) {
               listen(dateien[i]);
            }
            if(dateien[i].isFile()) {
               try {
                  BufferedReader rein = new BufferedReader(new FileReader(dateien[i]));
                  StringBuffer puffer = new StringBuffer();
                  String zeile;
                  while((zeile = rein.readLine()) != null) {
                     puffer.append(zeile);
                     puffer.append('\n');
                  }
                  rein.close();
                  String inhalt = new String(puffer);
                  pan.textfeld.setText("");
                  pan.textfeld.setText(inhalt);
                  pan.textfeld.setCaretPosition(0);
                  pan.textfeld.selectAll();
                  String regMus = inMuster.getText();
                  String repText = inRep.getText();
                  Pattern p = Pattern.compile(regMus);
                  Matcher m = p.matcher(pan.textfeld.getSelectedText());
                  String result = m.replaceFirst(repText);
                  pan.textfeld.selectAll();
                  pan.textfeld.setText(result);
                  BufferedWriter raus = new BufferedWriter(new FileWriter(dateien[j]));
                  pan.textfeld.selectAll();
                  String merk = pan.textfeld.getSelectedText();
                  raus.write(merk);
                  raus.close(); 
               }
               catch(Exception e) {
                  e.printStackTrace();
               }
            }
         }
      }
   }

Es gibt auch keinerlei Fehlermeldungen mehr, dass irgendwie der Zugriff auf ein Verzeichnis verweigert würde oder ähnliches.
Blöderweise bleibt aber das Problem mit Exception in Thread "Main" Java.lang.OutOfMemoryError: Java Heap Space[/] bestehen.
Jetzt zwar nicht mehr schon nach 200 Dateien - lasst es 2.000 gewesen sein - aber von 10.000 bin ich noch meilenweit entfernt :(

Könnt Ihr mir nochmal helfen?
Grüße,
muemmel
 

muemmel_0811

Bekanntes Mitglied
Ich nochmal...

Ich musste heute mehr als überrascht in der Arbeit feststellen, dass mein kleines Tool locker mit 10.000 Dateien fertig wird :)
Der einzige Unterschied zu zuhause ist, dass ich es hier als Standalone-jar ausgeführt hab und nicht im Rahmen meines Editors (dieses Ding vom hessischen Bildungsministerium) und siehe da: Null Probleme mehr :)

So langsam aber sicher überleg ich mir doch, ob ich mich nicht mal mit Eclipse anfreunden soll - auch wenn ich es für diese One-File-Projekte, die ich so schreibe (bin halt noch Anfänger) immer noch für vollkommen überdimensioniert halte.

Grüße,
muemmel
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Verzeichnisse rekursiv durchlaufen Java Basics - Anfänger-Themen 3
R Verzeichnisse rekursiv nach Dateiduplikaten durchsuchen Java Basics - Anfänger-Themen 5
S Datenbänke und Verzeichnisse Java Basics - Anfänger-Themen 7
I 1) Laufwerke auslesen 2) Verzeichnisse von Laufwerke auslesen Java Basics - Anfänger-Themen 2
F Verzeichnisse und Dateien kopieren Java Basics - Anfänger-Themen 3
Z Verzeichnisse mit Inhalt löschen löschen Java Basics - Anfänger-Themen 7
A Verzeichnisse nach Datei / Ordner durchsuchen Java Basics - Anfänger-Themen 11
P Text in Verzeichnisse suchen Java Basics - Anfänger-Themen 4
B Verzeichnisse und Dateien in JAR Files Java Basics - Anfänger-Themen 7
L Verzeichnisse mit Inhalt verschieben auf UNIX Java Basics - Anfänger-Themen 5
H BITTE SCHNELLE HILFE - VERZEICHNISSE DURCHGEHEN Java Basics - Anfänger-Themen 2
T Zugriff auf geschützte Verzeichnisse? Java Basics - Anfänger-Themen 7
M Dateien/Verzeichnisse anlegen Java Basics - Anfänger-Themen 10
D Verzeichnisse durchsuchen Java Basics - Anfänger-Themen 4
J Verzeichnisse auslesen Java Basics - Anfänger-Themen 3
DEvent Dialogfenster in dem man Verzeichnisse auswählen kann Java Basics - Anfänger-Themen 6
Z Klassen, Pakete und Verzeichnisse Java Basics - Anfänger-Themen 8
V Jtree: Alle Verzeichnisse und Ordner anzeigen, aber wie? Java Basics - Anfänger-Themen 2
H Passwort Brute Force rekursiv Java Basics - Anfänger-Themen 7
1 Array rekursiv durchlaufen Java Basics - Anfänger-Themen 8
E Rekursiv Objekte erzeugen - geht das? Java Basics - Anfänger-Themen 2
Cassy3 Binäre Bäume Rekursiv durchlaufen und bestimmte Elemente Zählen Java Basics - Anfänger-Themen 6
R0m1lly Kombinationen aus int array rekursiv Java Basics - Anfänger-Themen 2
L Rekursiv gegebenes Passwort herausfinden. Java Basics - Anfänger-Themen 2
P9cman Char Index rekursiv finden Java Basics - Anfänger-Themen 4
B Methoden Rekursiv festellen, ob eine Zahl gerade-oft vorkommt oder nicht Java Basics - Anfänger-Themen 4
S Methoden Methodenaufruf rekursiv zählen Java Basics - Anfänger-Themen 4
B Array nach Wert prüfen rekursiv Java Basics - Anfänger-Themen 5
sashady Zahlen rekursiv zerlegen und Ziffern addieren Java Basics - Anfänger-Themen 38
jhCDtGVjcZGcfzug Fibonacci Zahlen rekursiv und iterativ Java Basics - Anfänger-Themen 21
H Binominalkoeffizient tail-rekursiv in java darstellen Java Basics - Anfänger-Themen 0
GAZ Tribonacci Folge Rekursiv Java Basics - Anfänger-Themen 11
G Primzahlen von Rekursiv nach Iterativ Java Basics - Anfänger-Themen 6
A Ackermmanfunktion rekursiv Java Basics - Anfänger-Themen 4
A Binärbaum rekursiv durchsuchen und Referenz zurückgeben Java Basics - Anfänger-Themen 4
H Rekursiv Methode ausführen bei Kindern Java Basics - Anfänger-Themen 12
G Methode Rekursiv umschreiben Java Basics - Anfänger-Themen 8
L Jede zweite Ziffer entfernen (rekursiv) Java Basics - Anfänger-Themen 6
J Dateien in Verzeichnissen rekursiv auflisten wirft Exception Java Basics - Anfänger-Themen 4
D Pentagonale Nummern in Rekursiv Java Basics - Anfänger-Themen 14
O Enum Array Rekursiv abarbeiten Java Basics - Anfänger-Themen 44
E Weg-Suche-Problem rekursiv Java Basics - Anfänger-Themen 12
O Primzahl rekursiv mit einem Wert ohne i, wie? Java Basics - Anfänger-Themen 6
E Erste Schritte Potenz Negativ (rekursiv) Java Basics - Anfänger-Themen 2
O Rekursiv aufrufen Java Basics - Anfänger-Themen 2
F In List Rekursiv suchen Java Basics - Anfänger-Themen 12
F Iterativ in Rekursiv Java Basics - Anfänger-Themen 2
S Fibonacci Zahlen rekursiv Java Basics - Anfänger-Themen 1
L Rekursiv zwei Strings vergleichen Java Basics - Anfänger-Themen 3
B Fakultätsfunktion Rekursiv Berechnen aber mit Array Java Basics - Anfänger-Themen 10
J Fibonacci -Folge rekursiv berechnen Java Basics - Anfänger-Themen 18
B Wie kann ich Linien rekursiv zeichnen? Java Basics - Anfänger-Themen 4
kilopack15 Sin(x) rekursiv lösen Java Basics - Anfänger-Themen 17
T Rekursiv Tiefe eines binären Suchbaums ermitteln Java Basics - Anfänger-Themen 22
P Methoden Arrays.AsList kleinste Zahl ausgeben Rekursiv Java Basics - Anfänger-Themen 9
W A hoch N Rekursiv Java Basics - Anfänger-Themen 3
K Rechtecke rekursiv zeichnen Java Basics - Anfänger-Themen 20
V Quadrate rekursiv zeichnen Java Basics - Anfänger-Themen 7
M Fibonacci rekursiv mittels Cache Java Basics - Anfänger-Themen 17
E Binärbaum - von rekursiv zu iterativ Java Basics - Anfänger-Themen 10
Y Rekursiv Palindrom herausfinden Java Basics - Anfänger-Themen 5
B Fibonacci Zahlen rekursiv Array Java Basics - Anfänger-Themen 12
M String rekursiv Spiegeln mit Originalwort davor Java Basics - Anfänger-Themen 3
K Türme von Hanoi - Rekursiv. Java Basics - Anfänger-Themen 1
T MergeSort rekursiv programmieren Java Basics - Anfänger-Themen 8
M Zahlenpyramide rekursiv programmieren Java Basics - Anfänger-Themen 7
hello_autumn Potenz selber berechnen, Rekursiv. Java Basics - Anfänger-Themen 6
V Text wüerfeln-Rekursiv Java Basics - Anfänger-Themen 4
J Baum rekursiv durchlaufen Java Basics - Anfänger-Themen 2
D Münzverteilung Möglichkeiten | Rekursiv Java Basics - Anfänger-Themen 3
R Hanoi rekursiv lösen Problem Java Basics - Anfänger-Themen 1
D Rekursiv Kombinationen ausgeben klappt nur bei einer Wiederholung Java Basics - Anfänger-Themen 4
shiroX OOP String rekursiv zurückgeben Java Basics - Anfänger-Themen 6
Z Fibonacci rekursiv meine Erklärung stimmt so? Java Basics - Anfänger-Themen 2
S java rekursiv iterativ hilfee :s Java Basics - Anfänger-Themen 5
E Erste Schritte Pi, rekursiv Java Basics - Anfänger-Themen 6
A Frage Methode ggt Rekursiv Java Basics - Anfänger-Themen 5
E Hanoi-Varianten rekursiv Java Basics - Anfänger-Themen 2
P Hanoi rekursiv zu iterativ umbauen Java Basics - Anfänger-Themen 20
P Mittelwert rekursiv Java Basics - Anfänger-Themen 13
E Integral Rekursiv Java Basics - Anfänger-Themen 15
M MergeSort rekursiv Java Basics - Anfänger-Themen 2
D Ziffer in Zahl Rekursiv Java Basics - Anfänger-Themen 4
B Array rekursiv untersuchen Java Basics - Anfänger-Themen 21
I Rekursiv Java Basics - Anfänger-Themen 13
C Rekursiv Zahlenfolgen berechnen mit zwei Variablen Java Basics - Anfänger-Themen 5
K Rekursiv zu Literal Java Basics - Anfänger-Themen 12
L File Tree rekursiv Java Basics - Anfänger-Themen 10
W Binomialkoeffizient iterativ/rekursiv Java Basics - Anfänger-Themen 2
X Addition rekursiv ohne Schleife Java Basics - Anfänger-Themen 10
M Sudoku Rekursiv lösen Java Basics - Anfänger-Themen 9
E Datentypen ein java problem rekursiv loesen Java Basics - Anfänger-Themen 2
K indexOf selbst rekursiv definieren Java Basics - Anfänger-Themen 4
M Fibonacci-Linear und Rekursiv Java Basics - Anfänger-Themen 14
J Java Rekursiv vs(zu) Iterativ Hilfe Java Basics - Anfänger-Themen 3
D preOrder, inOrder, postOrder rekursiv zusammensetzen aus String Java Basics - Anfänger-Themen 1
K Binomialkoeffizient rekursiv berechnen Java Basics - Anfänger-Themen 8
J eulersche rekursiv berechnen Java Basics - Anfänger-Themen 6
J Suchbaumeigenschaft rekursiv programmieren Java Basics - Anfänger-Themen 3
T Rekursiv Vokale zählen Java Basics - Anfänger-Themen 19

Ähnliche Java Themen

Neue Themen


Oben