Servus Leutz,
erstmal zu meinem Programm:
Das Programm wird über die GUI gesteuert. Auf dieser befinden sich Components zur Steuerung. Unter anderem eine JTextArea.
Eine Programmroutine öffnet eine Zipdatei in der sich log-Dateien befinden. Die Dateigröße der logs variiert von 100KB - 100MB. Eine vom Benutzer zuvor gewählte Datei wird geöffnet und mit einem ZipInputStream ausgelesen. Die einzelnen Zeichen verpacke ich in einem CharArrayWriter. Kommt ein Zeilenumbruch, wird der CharArrayWriter geleert und an einen StringBuffer angehängt. Das wird solange fortgesetzt bis das Dateiende erreicht ist.
Am Ende angelangt wird der StringBuffer auf die TextArea gesetzt.
Bei Dateien bis sagen wir mal 50MB ist das Programm einigermaßen performant. Wenn die Datei aber 100MB hat, dann bekomm ich ne OutOfMemoryException. Ich bin mit meinem Latein am Ende und weiss beim besten willen nicht, wie ich die ganze Geschichte performanter mache.
Wär klasse wenn mir da jemand helfen könnte.
Hab das Programm für nen Bekannten geschrieben, deshalb die netten Kommentare. Soll ja auch wartbar sein
erstmal zu meinem Programm:
Das Programm wird über die GUI gesteuert. Auf dieser befinden sich Components zur Steuerung. Unter anderem eine JTextArea.
Eine Programmroutine öffnet eine Zipdatei in der sich log-Dateien befinden. Die Dateigröße der logs variiert von 100KB - 100MB. Eine vom Benutzer zuvor gewählte Datei wird geöffnet und mit einem ZipInputStream ausgelesen. Die einzelnen Zeichen verpacke ich in einem CharArrayWriter. Kommt ein Zeilenumbruch, wird der CharArrayWriter geleert und an einen StringBuffer angehängt. Das wird solange fortgesetzt bis das Dateiende erreicht ist.
Am Ende angelangt wird der StringBuffer auf die TextArea gesetzt.
Bei Dateien bis sagen wir mal 50MB ist das Programm einigermaßen performant. Wenn die Datei aber 100MB hat, dann bekomm ich ne OutOfMemoryException. Ich bin mit meinem Latein am Ende und weiss beim besten willen nicht, wie ich die ganze Geschichte performanter mache.
Wär klasse wenn mir da jemand helfen könnte.
Hab das Programm für nen Bekannten geschrieben, deshalb die netten Kommentare. Soll ja auch wartbar sein
Code:
public int dateiAuslesen(File datei, String dateiString, JTextArea jtextarea)
{
int rück=0;
StringBuffer sb=null;
try
{
ZipFile zipFile = new ZipFile(datei.getAbsoluteFile());
//Eingabestrom
ZipInputStream zipInput = new ZipInputStream(new FileInputStream(datei.getAbsoluteFile()));
//aktueller Eintrag
ZipEntry zipEintrag = null;
zipFile.close();
//solange die ZipDatei noch Einträge hat
while((zipEintrag=zipInput.getNextEntry())!=null)
{
//aktuelle ZipEintrag ist die gewählte Datei
if(zipEintrag.getName().equalsIgnoreCase(dateiString))
{
zipEintrag=null;
CharArrayWriter caw = new CharArrayWriter();
sb = new StringBuffer();
//sind im Eingabestrom noch Bytes vorhanden
while(zipInput.available()!=0)
{
//erste Zeichen in Bytefromat einlesen
int buffer = zipInput.read();
//Bytezeichen entspricht nicht einem Zeilenumbruch und
//das Dateiende ist noch nicht erreicht
if(buffer!=13 && buffer!=10 && buffer!=-1)
{
//Zeichen wird in Buffer geschrieben
caw.write(buffer);
}
//Zeilenumbruch oder Dateiende
else if(caw.size()>0)
{
//an Buffer anhängen
sb.append(caw.toString()+"\n");
//der Buffer wird geleert
caw.reset();
}
}
zipInput.close();
break;
}
}
if(sb!=null)
{
jtextarea.setText(sb.toString());
}
else
{
rück=2;
}
}
catch (IOException io)
{
System.out.println("Fehler beim Auslesen der Datei: "+io.getMessage());
}
catch(OutOfMemoryError oome)
{
System.out.println("Nicht genügend Speicher reserviert: "+oome.getMessage());
}
return rück;
}