eine Datei schnellstmöglich einlesen

heinz86

Mitglied
Hallo,

für ein Projekt muss ich relativ schnell Dateien einlesen und als String abspeichern. Mit diesen Strings werden anschließend verschiedene Operationen durchgeführt. Die Dateien haben jedoch eine Größe von zwischen 20MB und 100MB, so dass mein derzeitiger Code einfach zu lange braucht um die Datei komplett einzulesen.

Java:
public String getText(String inputName){
  inputstring = "";
  Scanner scan;
		
  try {
    scan = new Scanner(new FileInputStream(inputName));
  } catch (IOException e) {
    e.printStackTrace();
  }

  while (scan.hasNextLine()) {
    inputstring += scan.nextLine();
  }
		
  return inputstring;
}

Gibt es daher eine Möglichkeit diese deutlich schneller zu machen, damit der Nutzer nicht so lange warten muss und denkt, dass sich mein Programm aufgehängt hat?
 
Du könntest die Dateien in verschiedenen Intervalen anzeigen lassen bzw. alle 100 Datensätze , so dass der Benutzer sieht das etwas geschieht. Ein Timer oder Thread wäre eine Möglichkeit.
 
ohne große Erfahrungswerte würde ich mal tippen, dass es mit einem BufferedReader schneller geht:
Code von dieser Seite-ungetestet
Java:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/**
 *
 * @author javadb.com
 */
public class Main {
    
    /**
     * Reads text from a file line by line
     */
    public void readFromFile(String filename) {
        
        BufferedReader bufferedReader = null;
        
        try {
            
            //Construct the BufferedReader object
            bufferedReader = new BufferedReader(new FileReader(filename));
            
            String line = null;
            
            while ((line = bufferedReader.readLine()) != null) {
                //Process the data, here we just print it out
                System.out.println(line);
            }
            
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            //Close the BufferedReader
            try {
                if (bufferedReader != null)
                    bufferedReader.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new Main().readFromFile("myFile.txt");
    }
}
 
Auch mit einem BufferedReader kann das Einlesen von über 100mb großen Dateien einige Sekunden dauern. DU könntest auch eine Progressbar implementieren die den Fortschritt anzeigt.
 
Sekunden zum Einlesen wäre ja kein Problem. Aber bei einer 1MB großen Datei dauert der Vorgang des Einlesens schon mehrere Minuten. Ich werde mir den BUfferedReader mal anschauen und schauen, ob dieser schneller ist.

Wie würde man denn am Besten eine ProgressBar erstellen? Gibt es dort schon was fertiges, auf dem man aufbauen kann?
 
Das ist mir auch klar, aber ich gehe mal davon aus, dass er nicht vor einer 200 mhz Mühle sitzt 😉 Und für alles andere sollte jeder Rechner leistungsstark genug sein, .txt Dateien unterhalb einer Minute einzulesen.
 
Dieses Stücklein Code...
Java:
inputstring += scan.nextLine();
... ist auch nicht sehr freundlich. Für jede Linie die du einliest, wird ein neuer String erstellt, und zwei alte String kopiert. Benutz mal einen StringBuilder:
Java:
StringBuilder builder = new StringBuilder();

while( ... ){
  builder.append( scan.nextLine() );
}
 
Dieses Stücklein Code...
Java:
inputstring += scan.nextLine();
... ist auch nicht sehr freundlich. Für jede Linie die du einliest, wird ein neuer String erstellt, und zwei alte String kopiert. Benutz mal einen StringBuilder:
Java:
StringBuilder builder = new StringBuilder();

while( ... ){
  builder.append( scan.nextLine() );
}

Okay. Habe jetzt das ganze mit dem BufferedReader umgesetzt. Aber ich weiß jetzt noch nicht, wie ich genau die while-Schleife abfragen muss?

Es sieht jetzt so aus, aber irgendwie passt das noch nicht:
Java:
	public String readFromFile (String filename) {
		BufferedReader bR = null;
		StringBuilder builder = new StringBuilder();
		String inputtext = null;
		
		try {
			bR = new BufferedReader(new FileReader(filename));
				
			while ((inputtext = bR.readLine()) != null) {
				builder.append(inputtext);
			}
		} catch (FileNotFoundException ex) {
			ex.printStackTrace();
		} catch (IOException ex) {
			ex.printStackTrace();
		} finally {
			try {
				if (bR != null)
					bR.close();
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
		return inputtext;
	}
 
Java:
public String readFromFile(String filename) {
		BufferedReader bR = null;
		StringBuilder builder = new StringBuilder();
		String inputtext = null;

		try {
			bR = new BufferedReader(new FileReader(filename));

			while ((inputtext = bR.readLine()) != null) {
				builder.append(inputtext);
			}
		} catch (FileNotFoundException ex) {
			ex.printStackTrace();
		} catch (IOException ex) {
			ex.printStackTrace();
		} finally {
			try {
				if (bR != null)
					bR.close();
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
		return builder.toString();
	}
 

Zurück
Oben