Posts Tagged ‘Tipps & Tricks’

XML parsen und wieder in String konvertieren

XML wird in Java meist über DOM oder SAX bearbeitet. Im Falle von DOM wird ein Baum aufgebaut, der die Struktur und die Inhalte des XML Dokuments wiedergibt. Wie kommt man aber von einem XML String zu einem DOM Baum und vom DOM Baum wieder zurück zu einem String? Dafür habe ich ein kleines Helferlein programmiert…

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
 
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
 
/**
 * Utilities for parsing and converting XML DOMs.
 */
public class XMLUtilities {
 
	/**
	 * Parse a string containing XML.
	 *
	 * @param xmlString the XML string
	 * @return XML DOM document
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 * @throws IOException
	 */
	public static Document parse(String xmlString) throws ParserConfigurationException, SAXException, IOException {
		// define inputs
		StringReader stringReader = new StringReader(xmlString);
		InputSource inputSource = new InputSource(stringReader);
		// parse inputs
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.parse(inputSource);
		return document;
	}
 
	/**
	 * Convert XML DOM document to a string.
	 *
	 * @param document XML DOM document
	 * @return XML string
	 * @throws TransformerException
	 */
	public static String toString(Document document) throws TransformerException {
        StringWriter stringWriter = new StringWriter();
        StreamResult streamResult = new StreamResult(stringWriter);
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
        transformer.setOutputProperty(OutputKeys.METHOD, "xml");
        transformer.transform(new DOMSource(document.getDocumentElement()), streamResult);
        return stringWriter.toString();
	}
 
}

Posted by Sebastian on September 2nd, 2008 1 Comment

Textdateien mit Java

Zurzeit programmiere ich wieder viel in Java. Ein Problem das man immer mal wieder hat: Textdateien einlesen. Erstaunlicherweise kann man dabei wahnsinnig viele unterschiedliche Methoden verwenden. Die meisten sind schlecht, unschön und sehr, sehr langsam…

Ein modifiziertes Beispiel aus den Weiten des Internets, das zwar eine Textdatei einliest, sich aber dabei ziemlich viel Zeit lässt:

/**
 * Load a text file in a string.
 * @param file text file
 * @return string containing the text
 * @throws IOException
 */
public static String loadTextFile(File file) throws IOException {
        BufferedReader in = new BufferedReader(new FileReader(file));
        String result = "";
        boolean linesLeft = true;
        while (linesLeft) {
           String str = in.readLine();
           if (str != null) {
        	   result += str + "\n";
           }
           else {
        	   linesLeft = false;
           }
        }
        in.close();
        return result;
}

Da ich öfters Textdateien einlesen muss, habe ich mir eine kleine Klasse zu diesem Thema geschrieben. Das Einlesen geht wesentlich schneller als im oberen Beispiel. Ich schätze, dies ist so ziemlich das Maximum an Performance, was man mit relativ geringen Aufwand aus Java kitzeln kann. Nebenbei bemerkt ist die Methode auch wesentlich kompakter und lesbarer!

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
 
/**
 * Utility class for loading and saving text files.
 */
public class TextFileUtilities {
 
    /**
     * Write a string to a file.
     *
     * @param text text to save
     * @param file file to save text to
     * @throws IOException
     */
    public static void saveTextFile(String text, File file) throws IOException {
      FileWriter fileWriter = new FileWriter(file);
      fileWriter.write(text);
      fileWriter.flush();
      fileWriter.close();
    }
 
    /**
     * Read the content of a text file.
     *
     * @param file text file
     * @return content of text file
     * @throws IOException
     */
     public static String loadTextFile(File file) throws IOException {
       BufferedReader reader = new BufferedReader( new FileReader(file) );
       char[] chars = new char[ (int)file.length() ];
       reader.read(chars);
       reader.close();
       return new String(chars);
     }
}

Posted by Sebastian on August 13th, 2008 No Comments

Thunderbird beschleunigen

Thunderbird 2.0 ist mein derzeitiger Lieblings-eMail-Client. Leider wurde mein POP3 eMail-Konto in letzter Zeit sehr langsam. Das Öffnen von Nachrichten hat mitunter eine halbe Minute oder mehr gedauert. Jetzt habe ich endlich herausgefunden, wie man hier Abhilfe schaffen kann. Das eMail-Konto muss komprimiert werden!

Das kann man auf zwei unterschiedliche Arten machen:

  1. Im Kontextmenü (Rechtsklick auf das Konto in der Ordneransicht) das “Komprimieren” manuell starten.
  2. In den Thunderbird-Einstellungen (Extras > Einstellungen > Erweitert > Netzwerk & Speicherplatz) die Option “Ordner komprimieren, wenn dies mehr Platz spart als xxx KB”. Der konkrete Kilobyte-Wert ist relativ egal. Es haben sich bei mir die Standardeinstellung 100 KB bewährt.

Posted by Sebastian on May 13th, 2007 No Comments