Große Textdatei einlesen

Moltar

Mitglied
Hallo,

ich möchte in meinem Programm eine ziemlich große Textdatei verarbeiten.
Die Dateigröße liegt etwa bei 10 MB.

Verarbeiten heißt, ich will nach bestimmten Zeichenketten suchen, deren Position speichern, Zeichenketten ersetzen, etc.
Daher dachte ich zunächst daran, das ganze in einem String zu speichern.

Hier mein Code:
Code:
public void readFile(String filename) throws IOException {
		String content = new String();
		BufferedReader input = new BufferedReader(new FileReader(filename));
		String line;
		int count = 0;
		while((line = input.readLine()) != null) {
			content = content + line + "\n";
			count++;
			if(count%100 == 0) { System.out.println(count); }
		}
		input.close();
		System.out.println(content);
	}

Das Problem ist, dass das Programm mit jeder Zeile langsamer wird. Ab Zeile 15.000 wird es langsam unerträglich. Getestet habe ich das mit einer nur 800KB Datei.

Das ist also keine Lösung für 10MB.

Weiß jemand etwas besseres?

Danke

Moltar
 
Das problem ist:
Code:
content = content + line + "\n";

Lösung, entweder mit StringBuffer/StringBuilder arbeiten.
Oder, die Fragmente die du ausliest speicherst du nicht extra in einen String sondern einfach immer wieder überschreiben. Kommst du an eine Passage die du brauchst speicherst du nur noch die Position und kannst später mit RandomAccessFile genau zu dieser Stelle springen und die Daten verarbeiten.
 
Hallo MasterEvil,

und danke für die schnelle Antwort.

Die Speicherung der entsprechenden Positionen erscheint mir für mein Problem am günstigsten. Kann ich der Datei irgendwie direkt einen Druckbefehl geben?

Also beispielsweise:
Ich suche mir alle Seiten, auf denen der Text "abcxyz" vorkommt und speichere die Seitennummern in einem int[] pages.

Gibts etwas wie:
Code:
for(int i=0; i<pages.length; i++) { File.printPage(i); }

oder müsste ich mir da selbst was basteln?

Grüße
Moltar
 
Ich glaube nicht das es sowas gibt, jedenfall kenn ich sowas nicht.
Außerdem wie definiert man eine Seite? Das wirst du wohl selber machen müssen.
 
Hi,

der Datei kannst du nicht direkt einen Druck-Befehl geben, schau dir aber mal die Print-API von Java an.

Ich glaube der folgende link ist der korrekte:

http://java.sun.com/j2se/1.4.2/docs/guide/jps/index.html

Anbei ein kurzes beispiel, welches ich einmal für experimente erstellt hatte (wobei ich hier auf PDF druck aus war, welches noch nicht richtig unterstützt wurde...).

Vielleicht hilft es dir ja...

Das PrintInterface von mir hatte einfach nur die drei funktionen, welche ich in unterer Implementation entwickelt hatte.
Code:
import java.io.*;
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;

import com.lowagie.text.Document;

/**
 * @author scheidler
 *
 */
public class PrintImplementation implements PrintInterface {

    
    int i;
    FileInputStream fis=null;
    

    /* (non-Javadoc)
     * 
     */
    public boolean doPrint(Document doc1, int printtype) {
        // Set print attributes:
        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
        DocFlavor flavor=null;
        aset.add( MediaSizeName.ISO_A4 );
        try {
            // Print to PrintService (e.g. to Printer):
            PrintService[] prservices=new PrintService[1];
            if (printtype==PDF_PRINT) flavor=DocFlavor.INPUT_STREAM.PDF;
            if (printtype==GIF_PRINT) flavor=DocFlavor.INPUT_STREAM.GIF;
            if (printtype==JPG_PRINT) flavor=DocFlavor.INPUT_STREAM.JPEG;
            if (flavor==null) {
                prservices[0]=PrintServiceLookup.lookupDefaultPrintService();
                flavor=DocFlavor.INPUT_STREAM.AUTOSENSE;
            }
            else prservices = PrintServiceLookup.lookupPrintServices( flavor, aset );
            if( null == prservices || 0 >= prservices.length) {
                       System.out.println("Flavor: "+flavor.toString());
                       System.out.println("No Services Found");
                       return false;
            }
            PrintService prserv = null;
            prserv=prservices[0];
            if( null != prserv)
            {
             printPrintServiceAttributesAndDocFlavors(prserv);
              DocPrintJob pj = prserv.createPrintJob();
              Doc doc = new SimpleDoc(doc1, flavor, null );
              pj.print( doc, aset );
              return true;
            }
            return false;

        } catch( PrintException pe ) { 
          System.err.println( pe );
          return false;
        } 
      }
    
     public boolean canPrintFormat() {
           PrintService[] prservices = PrintServiceLookup.lookupPrintServices( DocFlavor.INPUT_STREAM.PDF, null );
        if( null == prservices || 0 >= prservices.length) return false;
        return true;

     }

      private void printPrintServiceAttributesAndDocFlavors( PrintService prserv )
      {
        String s1=null, s2;
        Attribute[] prattr = prserv.getAttributes().toArray();
        DocFlavor[] prdfl  = prserv.getSupportedDocFlavors();
        if( null != prattr && 0 < prattr.length )
          for( int i=0; i<prattr.length; i++ )
            System.out.println( "      PrintService-Attribute["+i+"]: "
                                + prattr[i].getName() + " = " + prattr[i] );
        if( null != prdfl && 0 < prdfl.length )
          for( int i=0; i<prdfl.length; i++ )
          {
            s2 = prdfl[i].getMimeType();
            if( null != s2 && !s2.equals( s1 ) )
              System.out.println( "      PrintService-DocFlavor-Mime["+i+"]: " + s2 );
            s1 = s2;
          }
      }
}

Gruß,

Torsten
 
Zuletzt bearbeitet:
Zurück