Newline Sonderzeichen aus File entfernen u als String speic?

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hi zusammen,

ich möchte ein ca. 2,6 Mb großes HTML File, das einzelne Tags wie Name, Titel usw. enthält, mit Hilfe von Java parsen und anschließend mit den Werten daraus weiterarbeiten. Leider tritt bei zu langen Tags manchmal ein Seitenumbruch auf. Deshalb würde ich gerne alle Newline Commands aus dem File entfernen, so dass ich nur noch eine Zeile habe.

Momentan schaffe ich das nur über Umwege, indem ich mir Zeile für Zeile die Datei in einem String speichere und diesen anschließend in ein neues File speichere.

Code:
private static void prepareFile()
	{
		File file = new File("report.html");
		String htmlfile = null;
		
		try
		{
			FileReader fin = new FileReader(file);
			BufferedReader bin = new BufferedReader(fin);
			
			System.out.println("file " + file.getName() + " was accessed");
			
			while (bin.ready())
			{
				htmlfile += bin.readLine() + " "; 
			}
			
			/* closing the file file */
			bin.close();
			fin.close();
			System.out.println("file " + file.getName() + " was closed");
		
		}catch (IOException e1)
		{
			e1.printStackTrace();
		}
	
		FileWriter fw = null; 
		try 
		{ 
		  fw = new FileWriter( "report_short.txt" ); 
		  fw.write(htmlfile); 
		} 
		catch ( IOException e ) { 
		  System.err.println( "Konnte Datei nicht erstellen" ); 
		} 
		finally 
		{ 
		  if ( fw != null ) 
		    try 
		  	{ 
		    	fw.close(); 
		    } catch ( IOException e ) 
		    { 
		    	//
		    } 
		}
	}

Das Problem dabei ist, dass Java warum auch immer sehr lange für das Zusammensetzen des htmlfile-Strings benötigt. Deshalb habe ich versucht aus dem File ein CharArray zu erstellen, welches ich dann in einen String umwandeln wollte. Dabei kommt als Ergebnis aber leider nur ein Hashwert raus. Woran liegt das?
Habt ihr vielleicht eine Lösung für mein Problem?

Code:
//		/* get character count */
//		int charCount = 0;
//		try
//		{
//			FileReader fin = new FileReader(file);
//			BufferedReader bin = new BufferedReader(fin);
//			
//			System.out.println("file " + file.getName() + " was accessed");
//			
//			while(bin.ready())
//			{
//				bin.read();
//				charCount++;
//			}
//			
//			/* closing the file file */
//			bin.close();
//			fin.close();
//			System.out.println("file " + file.getName() + " was closed");
//		
//		}catch (IOException e1)
//		{
//			e1.printStackTrace();
//		}
//		
//		char[] charArray = new char[charCount];
//		
//		/* kill newline commands */
//		for (int i=0; i<charArray.length; i++)
//		{
//			if (charArray[i] == '\n' ||charArray[i] == '\r')
//			{
//				charArray[i] = ' ';
//			}
//		}
//		
//		/* create new String */
//		String htmlfile = charArray.toString();


Gruß Markus
 
na toString ist eben normalerweise ein Hashcode,
ist für Array grundsätzlich nicht näher definiert,

new String(charArray);
müsste gehen

-----
das zusammenfügen der Strings geht auch rasend schnell,
wenn du einen StringBuilder nimmst (der intern wiederum mit charArray arbeitet)

statt
string + string
dann eben
builder.append(string),

am Ende
String st = builder.toString(),

hier klappt das toString() 😉

---------

bei String-Addition wird für jedes + der String komplett neu erzeugt..,
kein Wunder dass das lange dauert bei großen Dateien
 
Herzlichen Dank für deine Hilfe, SlaterB. Dein Tip mit dem StringBuilder hat einwandfrei funktioniert. Das Einlesen dauert jetzt weniger als eine Sekunde. Den Umweg über ein separates File brauche ich da jetzt gar nicht mehr gehen.

Ich dachte eigentlich, dass String + String intern das Gleiche wäre wie String.append(String) - aber nun gut ...


Schönen Tag noch!

Markus
 
ist es ja im wesentlichen auch

String + String
~ new StringBuilder(String).append(String).toString()

bei drei Strings allerdings
~ new StringBuilder(new StringBuilder(String).append(String).toString()).append(String).toString()

usw.

deshalb manuell StringBuilder kontrollieren,

---
noch ein Tipp:
wenn du mit einem normalen StringBuilder anfängst,
dann hat der ein moderates char-Array der Größe 16,

wenn du mehr Text einfügst, wird das Array immer größer und muss dabei kopiert werden,
zwar wird wohl immer verdoppelt, so dass es nur eine Handvoll Kopier-Vorgänge sind,
aber mit new StringBuilder(2.6 Mio oder wieviel auch immer) könntest du noch einen Tick sparen
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben