effizientes lesen & schreiben von Dateien mit speziellem Datensatz

nero-15

Grünschnabel
Hallo,
ich bin dabei ein Progrämmchen zu schreiben, dass extrem viele (einige Millionen) .html files von einem Server lädt und dann lokal bei mir abspeichert.
Ich habe zwei Problemchen:

1. Die html Datei ist im Zeichensatz iso-8859-2 und ich möchte sie am liebsten in UTF-8 umwandeln oder java dazu bewegen auch diesen Zeichensatz zu nutzen. Bis jetzt verschwinden bei mir alle Sonderzeichen und werden durch ein Fragezeichen ersetzt.

2. Welche Methode ist am effizientesten, um eine solche Datei zu schreiben?
Ich nutze zur Zeit den Filewriter. Kann ich dem oder einer anderen Klasse den zum schreiben zu nutzenden Zeichensatz übergeben?

Kann ich evtl das Problem des Zeichensatzes durch byteweises einlesen oder ähnlichem umgehen?

Vielen Dank und ein schönes Wochenende

Niklas
 
Versuch mal zum lesen einen InputStreamReader (z.b. auf einem FileInputStream) zu verwenden. Dem kannst du das Charset mitgeben.

Schreiben tust du dann mit nem OutputStreamWriter dem du ebenfalls das Charset geben kannst.
 
Vielen Dank schonmal. Die Methode funktioniert einwandfrei. Ich habe allerdings noch Probleme mit dem Zeichensatz. Ich kriege es einfach nicht hin den vorliegenden Text (Latin2) in eine UTF-8 kodierte Datei umzuwandeln. Mein Quelltext lauet:

Code:
	public static String getString(String uri){
		InputStream is = null; 
		String s = "";
	    try{ 
	    	URL url = new URL( uri ); 
	    	is = url.openStream(); 
			InputStreamReader isr = new InputStreamReader ( is ,"iso-8859-2" );
			BufferedReader stdin = new BufferedReader ( isr ); 
			
			for(int i = 0 ; i < 30 ; i++){
				s += stdin.readLine();
			}
	    } 
	    catch ( Exception e ) { 
	    	e.printStackTrace(); 
	    } 
	    finally { 
	    	if ( is != null ) 
	    		try { is.close(); } catch ( IOException e ) { } 
	    } 
	    
		byte[] byteString = null;
		
		try {
			byteString = s.getBytes("iso-8859-2");
			s = new String(byteString , "utf-8");
		} catch (UnsupportedEncodingException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

	    return s;
 
	}

Ich kriege die Sonderzeichen einfach immer falsch dargestellt. Wäre super wenn mir da nochmal jemand nen Tip geben könnte.
 
Wo kriegst du sie denn falsch dargestellt? Lässt du dir das mit einem Editor anzeigen der UTF-8 unterstützt?
 
Ja ich hab Notepad ++ auf UTF-8 eingestellt und dann den Text angeschaut. Die Sonderzeichen werden dann falsch dargestellt.
Ich bin ehrlich gesagt ein wenig ratlos...
 
Wie hast du denn die Zeichen in die Datei geschrieben die du anschaust?

Mit dem von mit vorgeschlagenen OutputStreamWriter?
 
Ja ich benutze den OutputStreamWriter wie folgt:

Code:
                String str = getString("http://szukaj.gazetawyborcza.pl/archiwum/1,0,5001392.html");  // Methode von oben
                FileOutputStream fout;

		try {
	            fout = new FileOutputStream("test.txt");
		    BufferedOutputStream bout= new BufferedOutputStream(fout);
		    OutputStreamWriter os = new OutputStreamWriter(bout, "UTF8");
		    os.write(str);
		    os.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

Könnte es etwa sein, dass die Datei gar nicht in Latin2 codiert ist, obwohl es in dem Metatag so steht?
Also das Lesen und schreiben funktioniert ja tadellos. Es werden halt nur die paar Sonderzeichen falsch dargestellt...
 
Zuletzt bearbeitet:
Also da hat sich der compiler nicht beschwert. Ich habe jetzt zufällig eine Lösung gefunden. Ich habe einfach das Lesen und Schreiben in eine Methode gemacht und jetzt funktionierts.
Warum auch immer..
Habe da wirklich keine Antwort auf die Frage. Vielen Dank trotzdem für die Mühe, die du dir gemacht hast.

schönen Sonntag noch
 
Zurück