JSON mit GSON schreiben

Wenn man unter Java eine JSON-Datei schreiben möchte, so kann man dies natürlich von Hand tun. Einfacher und effizienter ist es allerdings wenn man das ganze mit der Bibliothek GSON erledigt. Dabei handelt sich um eine von Google entwickelte Bibliothek, welche ursprünglich für den internen Gebrauch bei Google gedacht war. Mit dieser ist neben vielen anderen Dingen unter anderem auch die Serialisierung von Java-Objekten in JSON möglich. Möchte man eine JSON-Datei manuell schreiben so nutzt man den von der Bibliothek bereitgestellten JsonWriter:

JsonWriter writer = new JsonWriter(new OutputStreamWriter(new FileOutputStream(new File("test.json")), StandardCharsets.UTF_8));

writer.setIndent("  "); // definiert die Einrückung

writer.beginObject();
writer.name("test");
writer.value("123");
writer.endObject();

writer.close();

Im ersten Beispiel wird ein einfaches Objekt in eine JSON-Datei geschrieben, was in der Datei schlussendlich so aussieht:

{
  "test": "123"
}

Natürlich ist es auch möglich beliebig viele Objekte in eine Datei zu schreiben und Arrays zu nutzen:

JsonWriter writer = new JsonWriter(new OutputStreamWriter(new FileOutputStream(new File("C:\\Temp\\test.json")), StandardCharsets.UTF_8));

writer.setIndent("  "); // definiert die Einrückung

writer.beginObject();
writer.name("persons");

writer.beginArray();

writer.beginObject();
writer.name("firstname");
writer.value("Hans");
writer.name("lastname");
writer.value("Meiser");
writer.endObject();

writer.beginObject();
writer.name("firstname");
writer.value("Luna");
writer.name("lastname");
writer.value("Bottom");
writer.endObject();

writer.endArray();

writer.endObject();

writer.close();

Heraus kommt dabei eine JSON Datei welche so aussieht:

{
  "persons": [
    {
      "firstname": "Hans",
      "lastname": "Meiser"
    },
    {
      "firstname": "Luna",
      "lastname": "Bottom"
    }
  ]
}

Zu finden ist die Bibliothek auf GitHub. Lizenziert ist die GSON-Bibliothek unter der Apache Lizenz und damit freie Software.

Heap Dumps unter Java auswerten

Manchmal kommt es vor das man eine Java Applikation geschrieben hat, welche aus irgendeinem Grund mehr Speicher verbraucht als sie sollte. Im schlimmsten Fall führt dies zu einem OutOfMemory-Error. Möchte man dem Übeltäter auf die Spur kommen, kann man im ersten Schritt einen Heap Dump bei einem OutOfMemory-Error vornehmen. Dazu fügt man den VM Optionen der JVM den Parameter:

-XX:+HeapDumpOnOutOfMemoryError

hinzu. Dieser Parameter sorgt dafür, das im Falle eines OutOfMemory-Error, ein Dump des Heaps auf der Festplatte landet. Das Problem an diesem Dump ist allerdings, das er sich händisch schlecht auswerten lässt. Abhilfe schafft hier das freie Werkzeug Eclipse Memory Analyser.

Eclipse Memory Analyser

Eclipse Memory Analyser

Mit diesem ist es möglich den Heap Dump einzulesen und anschließend unter Zuhilfenahme der Analysefunktion dem Memory Leak auf die die Spur zu kommen. Bezogen werden kann das Tool über die offizielle Webseite. Lizenziert ist der Memory Analyser unter der Eclipse Public License und damit freie Software.

InputStream mit einem BufferedReader nutzen

In Java gibt es eine Klasse mit dem Namen InputStream. Wie der Name verrät handelt es sich um einen Stream für eine wie auch immer geartete Quelle von Eingangsdaten. Möchte man diesen Stream auslesen, so könnte man einen BufferedReader nutzen. Das Problem ist, das der BufferedReader keinen InputStream akzeptiert. Abhilfe schafft hier ein kleiner Umweg über den InputStreamReader:

InputStream inputStream=new InputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));

Mit dem InputStreamReader wird der InputStream in einem Reader gekapselt und kann somit in einem BufferedReader genutzt werden.

Verzeichnisse in Java rekursiv anlegen

Möchte man in Java Verzeichnisse rekursiv anlegen, so kann man hierfür das File-Objekt nutzen. Dazu muss das Objekt angelegt werden und anschließend die Methode mkdirs ausgeführt werden:

File directories = new File("/Users/seeseekey/Ordner1/Ordner2/Ordner3/");
directories.mkdirs();

Im Gegensatz zu Methode mkdir, legt die Methode mkdirs alle Verzeichnisse im übergebenen Pfad an – wenn sie noch nicht existieren sollten. Die Methode gibt dabei über einen boolean den Erfolg der Operation zurück – diesen Wert sollte man natürlich anschließend auswerten.

Auskommentierung unter IntelliJ IDEA

In der Java-IDE IntelliJ IDEA ist es wie in vielen anderen IDEs möglich ein markiertes Stück Quelltext auf Knopfdruck auszukommentieren. Der Weg führt dabei über das Menü Code. Dort gibt es den Menüpunkt Comment with Line Comment. Nutzt man eine deutsche Tasterturbelegung steht man allerdings vor einem Problem. Das Kürzel Strg + / funktioniert nicht. Über die Einstellung könnte man nun die Tastenkombination für diese Funktion ändern, damit diese wieder funktioniert.

Im Menü Code ist die Funktionalität zum Auskommentieren zu finden

Im Menü Code ist die Funktionalität zum Auskommentieren zu finden

Einfacher kann man das Problem lösen wenn man eine Tastatur mit Numpad nutzt. Dort reicht es dann Strg in Verbindung mit dem Geteiltzeichen zu drücken (welches intern ebenfalls als Slash gewertet wird). So kann die Funktionalität über die Tastatur genutzt werden, ohne die Konfiguration anzupassen.