Hallo zusammen,
ich hab mir hier ein kleines Progrämmchen gebastelt, das alle html-Dateien eines Verzeichnisses durchläuft, nach einem best. RegEx-Muster darin sucht und diesen an der ersten Fundstelle ersetzt und dann die Daten wieder zurückschreibt.
Das funktioniert auch alles bestens, bis ich an Dateien gerate, die größer als 1 MB sind, dann steigt das Programm aus und folgende Fehlermeldung erscheint:
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
Der Code:
Was muss ich tun, damit mein Progrämmchen auch große Dateien verarbeiten kann oder muss ich mich geschlagen geben?
Grüße,
muemmel
ich hab mir hier ein kleines Progrämmchen gebastelt, das alle html-Dateien eines Verzeichnisses durchläuft, nach einem best. RegEx-Muster darin sucht und diesen an der ersten Fundstelle ersetzt und dann die Daten wieder zurückschreibt.
Das funktioniert auch alles bestens, bis ich an Dateien gerate, die größer als 1 MB sind, dann steigt das Programm aus und folgende Fehlermeldung erscheint:
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
Der Code:
Code:
import java.util.regex.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class FirstMatch extends JFrame{
private static final long serialVersionUID = 1L;
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();
FirstMatch() {
super();
setTitle("FirstMatch");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initLaF();
setLayout(new BorderLayout());
getContentPane().add(pan, BorderLayout.CENTER);
}
public class Pan extends JPanel {
private static final long serialVersionUID = 1L;
JTextArea textfeld = new JTextArea(20,30);
//JTextField auswahl = new JTextField();
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);
//auswahl.setBounds(230,100,100,20);
//add(auswahl);
go.addActionListener(new Liste());
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 ende;
public DateiFilter(String endung) {
ende = endung;
}
public boolean accept(File dat) {
if(dat.isDirectory() == true) {
return true;
}
else {
if(dat.getName().endsWith(ende) == true) {
return true;
}
else {
return false;
}
}
}
}
int gesamtCnt = 0;
int matchCnt = 0;
void listen(File dir) {
DateiFilter filter = new DateiFilter(".html");
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()) {
System.out.println(dateien[i]);
gesamtCnt++;
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());
if(m.find() == true) {
matchCnt++;
String result = m.replaceFirst(repText);
pan.textfeld.selectAll();
pan.textfeld.setText(result);
BufferedWriter raus = new BufferedWriter(new FileWriter(dateien[i]));
pan.textfeld.selectAll();
String merk = pan.textfeld.getSelectedText();
raus.write(merk);
raus.close();
}
}
catch(Exception e) {
e.printStackTrace();
}
}
}
}
System.out.println("Dateien gesamt: " + gesamtCnt);
System.out.println("geänderte Dateien: " + matchCnt);
}
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 FirstMatch();
fenster.setSize(800,360);
fenster.setLocation(200,200);
fenster.setVisible(true);
fenster.setResizable(false);
}
}
Was muss ich tun, damit mein Progrämmchen auch große Dateien verarbeiten kann oder muss ich mich geschlagen geben?
Grüße,
muemmel