Festplatte
PCGH-Community-Veteran(in)
Java - Sektion aus großer Datei extrahieren
Moin, ich beschäftige mich seit etwa 2 Tagen mit Java und möchte nun ein kleines Programm schreiben, das mir aus einer großen Datei eine Sektion zwischen zwei bestimmten Zeilen raussucht und diese in eine neue Datei schreibt. Die Quell-Datei ist etwa 900 MB groß. Aus dieser möchte ich nun den Text zwischen "/start xxxx" dem nächsten "/start yyyy" raussuchen und diesen in eine neue Datei schreiben. Der String xxxx ist vorher vom Nutzer festgelegt, der String yyyy wird nicht vom Nutzer definiert und soll hier jetzt einfach das nächste "/start" symbolisieren. Hier ein Beispiel:
Die vom Programm erstellte Datei sollte also den Inhalt "blubblubblubblub" haben. Ich habe bis jetzt schon ein kleines Programm geschrieben, das eine Datei einlesen, in eine ArrayList kopieren und wieder als Datei schreiben kann:
Bei kleinen Dateien kein Problem, bei einer 800 MB Datei stürzt der Spaß während dem Einlesen mit einem OutOfMemory ab. Klar, 800 MB in ein Array zu hauen braucht nun mal ordentlich Speicher. Nun zu meinen Fragen:
1) Ist es grundsätzlich richtig, den Text mittels BufferedReader(new FileReader(sourceFile)) und einem Scanner einzulesen oder geht das noch besser?
2) Brauche ich für das Extrahieren einer bestimmten Sektion überhaupt das Array oder kann ich die neue Datei direkt schreiben? Wenn ja, wie?
3) Wie genau kann ich das eigentliche Extrahieren der Sektion realisieren, vom "/start meinString" bis hin zum nächsten "/start"?
Moin, ich beschäftige mich seit etwa 2 Tagen mit Java und möchte nun ein kleines Programm schreiben, das mir aus einer großen Datei eine Sektion zwischen zwei bestimmten Zeilen raussucht und diese in eine neue Datei schreibt. Die Quell-Datei ist etwa 900 MB groß. Aus dieser möchte ich nun den Text zwischen "/start xxxx" dem nächsten "/start yyyy" raussuchen und diesen in eine neue Datei schreiben. Der String xxxx ist vorher vom Nutzer festgelegt, der String yyyy wird nicht vom Nutzer definiert und soll hier jetzt einfach das nächste "/start" symbolisieren. Hier ein Beispiel:
Code:
blablablablabla
/start baum
blubblubblubblub
/start banane
blablablablabla
Die vom Programm erstellte Datei sollte also den Inhalt "blubblubblubblub" haben. Ich habe bis jetzt schon ein kleines Programm geschrieben, das eine Datei einlesen, in eine ArrayList kopieren und wieder als Datei schreiben kann:
Code:
public class Test
{
public static void main(String[] args)
{
if (args.length == 0)
{
userInput();
}
else
{
if (args.length == 2)
{
String sourceNameArg = args[0];
String databaseNameArg = args[1];
readFile(sourceNameArg, databaseNameArg);
}
}
}
[..userInput..]
public static void readFile(String sourceName, String databaseName)
{
File sourceFile = new File(sourceName);
try (BufferedReader input = new BufferedReader(new FileReader(sourceFile)); Scanner scanner = new Scanner(input))
{
ArrayList<String> textArray = new ArrayList<>();
long startTime = System.currentTimeMillis();
while (scanner.hasNextLine())
{
String line = scanner.nextLine();
textArray.add(line);
}
System.out.println("Elapsed: " + (System.currentTimeMillis() - startTime) + " ms");
writeFile(textArray, databaseName);
}
catch (IOException e)
{
System.out.println("'" + sourceName + "' not found.");
userInput();
}
}
public static void writeFile(ArrayList<String> text, String targetName)
{
try (PrintWriter writer = new PrintWriter(new FileWriter(targetName + ".dmp")))
{
Iterator<String> iterator = text.iterator();
while (iterator.hasNext())
{
Object o = iterator.next();
writer.println(o);
}
}
catch (IOException e)
{
System.out.print("Something went wrong.");
}
}
}
Bei kleinen Dateien kein Problem, bei einer 800 MB Datei stürzt der Spaß während dem Einlesen mit einem OutOfMemory ab. Klar, 800 MB in ein Array zu hauen braucht nun mal ordentlich Speicher. Nun zu meinen Fragen:
1) Ist es grundsätzlich richtig, den Text mittels BufferedReader(new FileReader(sourceFile)) und einem Scanner einzulesen oder geht das noch besser?
2) Brauche ich für das Extrahieren einer bestimmten Sektion überhaupt das Array oder kann ich die neue Datei direkt schreiben? Wenn ja, wie?
3) Wie genau kann ich das eigentliche Extrahieren der Sektion realisieren, vom "/start meinString" bis hin zum nächsten "/start"?
Zuletzt bearbeitet: