Posted: Januar 18th, 2014 | Filed under: Java, Programmieren, Software, Tutorials | Tags: Config, datei, File, INI-Alternative, JSON, Konfigurationsdatei, Property | 1 Comment »
In meiner langjährigen Programmiererfahrung hatte ich schon öfters die Ehre mit sogenannten .ini- bzw. Property-Dateien zu arbeiten. Ich muss sagen, wirklich zufrieden war ich damit nie. Oft gab es Probleme mit der Identifikation von boolean Werten. Auch das behandeln von Listen in der jeweiligen Property-Datei war stets ein Sonderfall und handelte mir manchmal Schwierigkeiten ein. Ich glaube nicht mal das meine Abneigung an den prinzipiellen Aufbau und Grundgedanken einer .ini-Dateie gerichtet ist, vielmehr stören mich die mangelhaften Implementierungen der jeweiligen Programmiersprachen.
In folgendem Artikel möchte ich euch meine Implementierung einer Konfigurationsdatei auf Basis von JSON vorstellen. Diese verwendet die Bibliothek GSON und wird für folgende Implementierung benötigt. Wie ihr die Bibliothek in euer Projekt einbinden könnt erfahrt ihr hier nachlasen.
Die Klasse Config.java verwendet den Singleton-Mechanismus. Vorteil: Ihr müsst die Konfigurationsdatei nur einmal laden und erhält im Anschluss darauf Zugriff auf die jeweiligen Attribute innerhalb jeder anderen Klasse in eurer Applikation.
Config.java
package de.roth.json.config; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import com.google.gson.Gson; import com.google.gson.GsonBuilder; public class Config { // Hier schreibst du deine Attribute hin public String TITLE; public int WIDTH; public int HEIGHT; public double RATIO; public ArrayList<String> NAMES; public Config() { // Hier die Standardwerte der Attribute, falls diese // nicht in der Konfigurationsdatei vorhanden sind.
this.TITLE = "Titel der Anwendung"; this.WIDTH = 800; this.HEIGHT = 600; this.RATIO = 0.6; this.NAMES = new ArrayList<String>(); this.NAMES.add("Peter"); this.NAMES.add("Paul"); } // DON'T TOUCH THE FOLLOWING CODE private static Config instance; public static Config getInstance() { if (instance == null) { instance = fromDefaults(); } return instance; } public static void load(File file) { instance = fromFile(file); // no config file found if (instance == null) { instance = fromDefaults(); } } public static void load(String file) { load(new File(file)); } private static Config fromDefaults() { Config config = new Config(); return config; } public void toFile(String file) { toFile(new File(file)); } public void toFile(File file) { Gson gson = new GsonBuilder().setPrettyPrinting().create(); String jsonConfig = gson.toJson(this); FileWriter writer; try { writer = new FileWriter(file); writer.write(jsonConfig); writer.flush(); writer.close(); } catch (IOException e) { e.printStackTrace(); } } private static Config fromFile(File configFile) { try { Gson gson = new GsonBuilder().setPrettyPrinting().create(); BufferedReader reader = new BufferedReader(new InputStreamReader( new FileInputStream(configFile))); return gson.fromJson(reader, Config.class); } catch (FileNotFoundException e) { return null; } } @Override public String toString() { Gson gson = new GsonBuilder().setPrettyPrinting().create(); return gson.toJson(this); } } |
Die Verwendung dieser Klasse ist sehr einfach. Schaut selbst:
Test.java
package de.roth.json.config; public class Test { public static void main(String[] args) { // Konfigurationsdatei laden, falls vorhanden. // Ansonsten werden die Werte im Konstruktor verwendet Config.load("config.json"); // Zugriff auf Attribut Config.getInstance().TITLE = "Neuer Titel"; Config.getInstance().RATIO = 0.4; for (String s : Config.getInstance().NAMES) { System.out.println(s); } // Speichern der Konfigurationsdatei Config.getInstance().toFile("config.json"); } } |
Da in unserem Beispiel noch keine Konfigurationsdatei vorhanden war ergibt sich nach dem ändern und sichern der Konfiguration folgende JSON-Datei.
{ "TITLE": "Neuer Titel", "WIDTH": 800, "HEIGHT": 600, "RATIO": 0.4, "NAMES": [ "Peter", "Paul" ] } |
Mit Hilfe dieser Implementierung und GSON ist es natürlich auch möglich vollständige Objekte als Konfigurationsattribut abzulegen. GSON löst automatisch jedes Objekt in primitive Datenstrukturen auf und speichert es im Anschluss darauf als JSON-Objekt in der Konfigurationsdatei ab.
GitHub
Den Quellcode zu dem Projekt könnt ihr euch auch auf GitHub ansehen:
https://github.com/frankred/json-config-file
Download
Das ganze Beispiel könnt ihr euch zusätzlich hier als vollständiges Eclipse-Projekt herunterladen.
Posted: Dezember 4th, 2013 | Filed under: Java, Programmieren | Tags: Java, JAVA JSON lesen, JAVA read JSON, JSON, JSON decode | 9 Comments »
Da sich JSON aus meiner Sicht immer mehr gegenüber dem Klassiker XML durchsetzt und ich mittlerweile auch die Verwendung einer JSON-Datei gegenüber einer gängigen “Property-Datei” (*.ini) bevorzuge, hier ein kleines Tutorial mit Hilfe ihr von Googles JSON-Bibliothek gson Json-Dateien einlesen bzw. erzeugen könnt.
GSON Bibliothek herunterladen und einbinden
Zu allererst müsst ihr die Java-Bibliothek gson herunterladen: https://code.google.com/p/google-gson/downloads/list und entpacken. Für die Verwendung benötigt ihr lediglich die Datei gson-X.X.X.jar.
Falls ihr eclipse als IDE eurer Wahl verwendet, könnt ihr hier nachlesen wie ihr diese genau einbindet (unter dem Abschnitt “Bibliothek ins Projekt importieren”).
JSON-Datei lesen
Als Beispiel verwende ich folgende, relativ simple JSON-Datei, welche dennoch alle wichtigen Strukturen wie Array oder Objekt beinhaltet.
personen.json
{
"personen" : [
{
"name" : "Frank",
"alter" : 27,
"hobbys" : [
{
"name" : "Karlsruher SC"
},
{
"name" : "Computer spielen"
}
]
},
{
"name" : "Peter",
"alter" : 21,
"hobbys" : [
{
"name" : "Tennis"
},
{
"name" : "Boxen"
}
]
}
]
}
Prinzipiell kann man JSON-Dateien mit Hilfe zwei verschiedener Vorgehensweise auslesen. Entweder direkt über ein vorhandenes Java-Objekt, oder allgemein über das sogenannte JsonObject. In diesem Beispiel verwende ich den Weg über das JsonObject.
GsonExample.java
import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStreamReader; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; public class GsonExample { public static void main(String[] args) { Gson gson = new Gson(); try { // Datei "personen.json" über einen Stream einlesen FileInputStream input = new FileInputStream("personen.json"); BufferedReader reader = new BufferedReader(new InputStreamReader(input)); // Datei als JSON-Objekt einlesen JsonObject json = gson.fromJson(reader, JsonObject.class); // Attribut "personen" als Array lesen JsonArray personen = json.getAsJsonArray("personen"); for(int i = 0; i < personen.size(); i++){ JsonObject person = personen.get(i).getAsJsonObject(); // Attribute ausgeben z.B.: name, alter und hobbies System.out.println(person.get("name").getAsString()); System.out.println(person.get("alter").getAsInt()); // Attribut "hobbys" als Array lesen JsonArray hobbys = person.get("hobbys").getAsJsonArray(); for(int k = 0; k < hobbys.size(); k++){ JsonObject hobby = hobbys.get(k).getAsJsonObject(); // Name des Hobbys ausgeben System.out.println(hobby.get("name").getAsString()); } System.out.println("------"); } } catch (FileNotFoundException e) { e.printStackTrace(); } } } |
Konsolenausgabe
Frank
27
Karlsruher SC
Computer spielen
——
Peter
21
Tennis
Boxen
——
Ich hoffe ich konnte dem ein oder anderen damit helfen. Wie ihr ein vorhandenes Java-Objekt inklusive der vollständigen Daten-Struktur in eine JSON-Datei umwandelt und wieder einliest zeige ich euch das nächste mal.
Posted: November 26th, 2013 | Filed under: Java, Programmieren, Tutorials | Tags: Base64, codieren, decode, encode, Java, konvertieren, String, String in Base64 | No Comments »
Mittels Base64 kann man beliebige Binärdaten oder Strings in eine Zeichenfolge aus lesbaren ASCII-Zeichen umwandeln. Momentan setzte ich Base64 ein, um sonderzeichenbehaftet Datei-Pfade in “harmlose” Strings umzuwandeln. Ein wenig erstaunt hat mich, dass Java dies von Haus aus nicht kann.
Um ein String in Java problemlos in eine Base64-Zeichenketten umzuwandeln könnt ihr die Bibliothek commons-codec aus dem Hause Apache verwenden:
Herunteladen der Bibliothek
Ladet die aktuelle Version der Bibliothek hier runter:
http://commons.apache.org/proper/commons-codec/download_codec.cgi
Zum Beispiel diese hier: http://apache.mirror.iphh.net//commons/codec/binaries/commons-codec-1.8-bin.zip
Entpacken
In der Zip-Datei befinden sich häufig viele *.jar-Dateien, ihr benötigt lediglich die rot markiert Datei. Entpackt diese.
Bibliothek ins Projekt importieren
Jetzt müsst ihr die Bibliothek in Form der Jar-Datei in euer Projekt importieren. In eclipse könnt ihr das über die Projekteigenschaften umsetzen. Idealerweise kopiert ihr eure verwendeten Bibliotheken in ein Verzeichnis innerhalb des Projektes, zum Beispiel in den Ordner Libs: [projektname]\lib\commons-codec-1.8.jar
String in Base64
Nachdem ihr die Bibliothek commons-codecs erfolgreich eingebunden habt, könnt ihr wie folgt Strings nach Base64 codieren.
import org.apache.commons.codec.binary.Base64; public class ConvertStringToBase64 { public static void main(String[] args) { String text = "Hallo, was geht ab!"; // Einen String in Base64 konvertieren (encode) String base64 = new String(Base64.encodeBase64(text.getBytes())); System.out.println(base64); // Einen Base64-String wieder zurück konvertieren (decode) String text2 = new String(Base64.decodeBase64(base64)); System.out.println(text2); } } |
Konsolenausgabe:
SGFsbG8sIHdhcyBnZWh0IGFiIQ==
Hallo, was geht ab!
Das war’s auch schon, hoffe ich konnte dem ein oder anderen von euch helfen 😉
Posted: November 4th, 2013 | Filed under: Internet, Java, Programmieren, Tutorials | Tags: auslesen, crawlen, deutsches Tutorial, internetseiten, Java, jSoup, parsen, scraping, web | 2 Comments »
Um Informationen aus einer Webseite heraus zu extrahieren (engl. web scraping), gibt es viele verschiedene Vorgehensweisen und Frameworks. Nach langer Suche bin ich endlich auf ein einfaches und gut dokumentiertes Framework gestoßen: jSoup
jSoup ist eine Java-Bibliothek mit der es möglich ist mittels CSS-Selektoren und dem Document Object Model (DOM), Seiteninhalte extrem einfach abzugreifen. Das folgende Beispiel erläutert die Funktionsweise des Frameworks und die Einfachheit der Handhabung.
Webseite analysieren
Ziel unseres Tutorial ist es, auf der Wikipedia Startseite die Ereignisse der “Was geschah am <aktuelles Datum>?”-Kategorie auszulesen.
Mit Hilfe der Debug-Konsole im Google Chrome Browser und dem Inspektor ist es möglich die HTML-Struktur zu genau zu analysieren. Unsere Informationen die wir abgreifen möchten befinden sich in einer Liste innerhalb des DIV mit der Id hauptseite-ereignisse.
Beispiel – Wikipedia parsen
Herunterladen könnt ihr die Java-Bibliothek jSoup hier: http://jsoup.org/download
Nachdem ihr die .jar-Datei jsoup-X.X.X.jar in euer Projekt eingebunden habt (so wird’s gemacht http://www.javabeginners.de/Grundlagen/Bibliothek_einbinden.php), könnt die das Framework wie folgt verwenden:
import java.io.IOException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class jSoupExample { public static void main(String[] args) { try { // Wikipedia Seite laden Document doc = Jsoup.connect("http://de.wikipedia.org/wiki/Wikipedia:Hauptseite").get(); // Alle Listenelemente über den entsprechenden Selektor markieren // Ein Leerzeichen initiert ein Kindelement des Elternelementes (links) // div#hauptseite-ergeignisse => Der DIV mit der ID hauptseite-ereignisse (# => id) // div.inhalt => Der DIV mit der Klasse inhalt (. => class) Elements ereignisse = doc.select("div#hauptseite-ereignisse div.inhalt ul li"); // Selektierte Elemente ausgeben ohne HTML-Tags for (Element e : ereignisse) { System.out.println(e.text()); } } catch (IOException e) { e.printStackTrace(); } } } |
|
Konsolenausgabe
Führt man das obige Quellcode-Stück aus, so wird unser gewünschter Inhalt zeilenweise wie folgt ausgegeben:
1763 – In Havanna wird mit dem Bau der Festungsanlage San Carlos de La Cabaña begonnen.
1813 – Der an der badischen Revolution von 1848/49 beteiligte Politiker Lorenz Brentano, nach deren Scheitern im US-Exil und dort 1877 bis 1879 Kongressabgeordneter, kommt zur Welt.
1913 – Am Königlichen Hoftheater Stuttgart wird Walter Braunfels’ Oper Ulenspiegel uraufgeführt.
1913 – Ein von Marseille kommender Schnellzug kollidiert bei Melun mit einem Postzug.
1988 – Die Uraufführung von Thomas Bernhards Drama Heldenplatz am Wiener Burgtheater löst einen Skandal aus.
Alternativen
Viel Spaß beim Auslesen!
Posted: November 3rd, 2013 | Filed under: Programmieren, Tutorials | Tags: apt-get install, installieren, Java, Java7, JDK, Linux, Oracle JDK, Ubuntu | 1 Comment »
Da die vorinstallierte JavaVM-Implementierung OpenJDK häufig Probleme macht habe ich mich dazu entschlossen auf meinem Server Oracle JDK7 zu installieren. Standardmäßig sind diese Pakete seltsamerweise jedoch nicht in den normalen Ubuntu Repos zu finden. Hier eine kleine Anleitung wie ihr Oracles JDK7 schnell und einfach dennoch per APT-Paketverwaltung installieren könnt.
Anleitung
Paketquelle von webupd8team hinzufügen:
sudo add-apt-repository ppa:webupd8team/java
Neueinlesen der Paketlisten:
sudo apt-get update
Oracle JDK7 installieren:
sudo apt-get install oracle-jdk7-installer
Oracle Java7 aktivieren, indem ihr die entsprechende VM per Eingabe auswählt (siehe Screenshot 2):
sudo update-alternatives –-config java