hi leute, bitte helft mir, ich bin nahe der Verzweiflung icon_sad.gif
Grunddeklarationen der gesamten Methode:
Code:
folgendes:
ich habe eine Methode, die Dateien bis zu ca. 3 MB in einem rutsch liest, die charzeichen durch andere ersetzt und die datei neuschreibt --> funzt wunderbar!
die veränderte datei lässt sich wieder problemlos in den Orginalzustand portieren, bevor sie verändert wurde, was ja auch das Ziel ist.
Code:
Problem:
bei größeren Dateien kommt bei der Methode nat. ein "outofmemoryerror" (mit dem Standardheap von 64MB). Um das zu umgehen, habe ich ne Methode geschrieben, die die Datei in kleinen Häppchen umwandeln soll und die veränderten daten in ein 2. file immer anhängt.
zumindest ist hier die Datei größe mit dem Orginal bytegenau.
ABER:
ich habe hier offentsichtlich ein Problem in bezug auf das casten von byte zu char, denn die Daten von der veränderten datei sind bei der portierung zurück zu den Orginaldaten nicht mehr dem orginal entsprechend.
wenn die veränderte datei erneut eingelesen wird, liefert das byte-array werte im minusbereich zurück, was nat. mit char (Wertebereich 0-255) nicht kompatibel ist und der ganze String nur noch aus eckigen Kästchen besteht.
Hier die Methode zum verändern der datei:
Code:
und hier diese, um die daten wieder in den vorhergehenden Orginalzustand zu bekommen:
Code:
Ich hoffe ihr habt ne idee an was es liegt, denn ich weiß echt nicht mehr weiter icon_scratch.gif
Danke im Vorraus......
Grunddeklarationen der gesamten Methode:
Code:
Code:
public void ByteReader(String fname)
{
int[] buffer;
StringBuffer sb;
//FileInputStream filein=null;
BufferedInputStream filein=null;
String temp=null;
int i = 0;
long actime, sectime, gesamt=0;
int länge=10;
try
{
filein = new BufferedInputStream(new FileInputStream(fname));
//....dannach die unteren Methoden (sind unten nur Ausschnitte der wichtigsten Elemente)
folgendes:
ich habe eine Methode, die Dateien bis zu ca. 3 MB in einem rutsch liest, die charzeichen durch andere ersetzt und die datei neuschreibt --> funzt wunderbar!
die veränderte datei lässt sich wieder problemlos in den Orginalzustand portieren, bevor sie verändert wurde, was ja auch das Ziel ist.
Code:
Code:
buffer = new int[ (int) (new File(fname)).length() + 1];
sb = new StringBuffer(buffer.length);
actime = System.currentTimeMillis();
while ( (buffer[i] = filein.read()) != -1) // Datei einlesen
{
sb.append((char)buffer[i]);
i++;
}
filein.close();
sectime = System.currentTimeMillis();
gesamt=gesamt+(sectime-actime);
System.out.println("Bytereader: " + (sectime-actime) + " ms");
actime = System.currentTimeMillis();
temp = sb.toString();
sectime = System.currentTimeMillis();
gesamt=gesamt+(sectime-actime);
System.out.println("Stringbuffer lesen: " + (sectime-actime) + " ms");
if (filemodus.equals("filever"))
{
actime = System.currentTimeMillis();
result=co.encode(temp,tfcode.getText()); // Byte bzw. char für char durch ein anderes char ersetzen
sectime = System.currentTimeMillis();
gesamt=gesamt+(sectime-actime);
System.out.println("Datei verschlüsselt: " + (sectime-actime) + " ms");
actime = System.currentTimeMillis();
ByteWriter(fname, result); // Veränderte Daten schreiben
sectime = System.currentTimeMillis();
gesamt=gesamt+(sectime-actime);
System.out.println("Datei gespeichert: " + (sectime-actime) + " ms");
}
Problem:
bei größeren Dateien kommt bei der Methode nat. ein "outofmemoryerror" (mit dem Standardheap von 64MB). Um das zu umgehen, habe ich ne Methode geschrieben, die die Datei in kleinen Häppchen umwandeln soll und die veränderten daten in ein 2. file immer anhängt.
zumindest ist hier die Datei größe mit dem Orginal bytegenau.
ABER:
ich habe hier offentsichtlich ein Problem in bezug auf das casten von byte zu char, denn die Daten von der veränderten datei sind bei der portierung zurück zu den Orginaldaten nicht mehr dem orginal entsprechend.
wenn die veränderte datei erneut eingelesen wird, liefert das byte-array werte im minusbereich zurück, was nat. mit char (Wertebereich 0-255) nicht kompatibel ist und der ganze String nur noch aus eckigen Kästchen besteht.
Hier die Methode zum verändern der datei:
Code:
Code:
actime = System.currentTimeMillis();
while ( (len = filein.read(buf)) > 0)
{
sb = new StringBuffer(länge);
for (i=0;i<buf.length;i++)
{
if (buf[i] != 0)
sb.append((char)buf[i]);
}
temp = sb.toString();
result=co.encode(temp,tfcode.getText());
for (i = 0; i < result.length(); i++)
{
fout.write((char)result.charAt(i));
}
sb = null;
buf = new byte[länge];
}
sectime = System.currentTimeMillis();
gesamt=gesamt+(sectime-actime);
und hier diese, um die daten wieder in den vorhergehenden Orginalzustand zu bekommen:
Code:
Code:
actime = System.currentTimeMillis();
while ( (len = filein.read(buf)) > 0)
{
sb = new StringBuffer(länge);
for (i=0;i<buf.length;i++)
{
if (buf[i] != 0)
sb.append((char)buf[i]);
}
temp = sb.toString();
result=co.decode(temp,tfcode.getText());
for (i = 0; i < result.length(); i++)
{
fout.write( (char) (result.charAt(i)));
}
sb = null;
buf = new byte[länge];
}
sectime = System.currentTimeMillis();
gesamt=gesamt+(sectime-actime);
Ich hoffe ihr habt ne idee an was es liegt, denn ich weiß echt nicht mehr weiter icon_scratch.gif
Danke im Vorraus......