Federlesen #12: Zusatzfunktionen für Java mit Apache Commons

Seite 2: I/O und HTTP

Inhaltsverzeichnis

Bis Java 7 hat es gedauert, dass das java.nio.file-Paket viele Unzulänglichkeiten von java.io.File behob. Obwohl nun das Arbeiten mit Dateien, Dateisystemen, Wildcards und Kompressionsverfahren einfacher geworden ist, bleibt genügend Raum für Commons IO und Compress. In Commons IO werden besonders häufig folgende Klassen angewandt:

  • FileCleaningTracker zum Löschen von Dateiressourcen, wenn der Garbage Collector die Java-Objekte aufräumt
  • FilenameUtils, um sowohl für Windows als auch UNIX portabel zu sein
  • FileSystemUtils, FileUtils und IOUtils bieten gegenüber der java.io-API erweiterte oder vereinfachte Funktionen wie die Platzberechnung oder Kopierfunktionen

System.out.println("Free Space on disk " + FileSystemUtils.freeSpaceKb());

  • Ein Sonderfall ist die Klasse HexDump zum Ausgeben von Byte-Arrays im Hexformat:

HexDump.dump(byteData, 0, System.out, 0)

Ein Spezialfall von Dateien sind komprimierte Dateien oder Dateiarchive. Dafür unterstützt die Compress-Bibliothek die Formate CPIO, TAR, ZIP, BZip2 und GZip. Die Commons-Bibliothek FileUpload, setzt den RFC 1867, "Form-based File Upload in HTML" über HTTP-POST und den Content-Type "multipart/form-data" für Servlets um. Erst mit Servlet 3.0 in Java EE 6 ist ein standardisiertes File-Upload mit der Annotation @MultipartConfig möglich.

Commons Net kümmert sich um eine bessere Kommunikation durch die Unterstützung vieler Standardprotokolle. Am einfachsten klappt der Einstieg mit den fertig ausführbaren Beispielen, die sich mit java -jar commons-net-examples-3.2.jar anzeigen lassen. So kann man mit java -jar commons-net-examples-3.2.jar SubnetUtilsExample Informationen zur IPv4-Adresse einsehen. Leider unterstützt Commons Net noch nicht in allen Bereichen IPv6. Obwohl die Version 3.x binärkompatibel mit dem Vorgänger 2.0 ist, gilt das nicht für den Sourcecode, sodass er an einzelnen Stellen anzupassen ist.

Apache HttpComponents kann weitgehend mit HTTP umgehen, also mit Verschlüsselung, Authentifizierung und Proxy-Support. Neben der synchronen Verarbeitung wird für einen höheren Durchsatz die nicht blockierende Verarbeitung unterstützt. Deswegen gibt es den synchronen und asynchronen HttpClient, wobei letzterer Beta-Status hat. Die korrekte Überprüfung von SSL-Zertifikaten ist trotz häufiger Verwendung im Web und einer frühen Unterstützung durch die Java Secure Socket Extension (JSSE) leider in vielen Java-Versionen bis heute nicht gegeben. Da sich der HttpClient in der Version 4 komplett neu gestaltet und einige schwere Fehler in der SSL-Verarbeitung behebt, sollte dieser verwendet werden.

Außerdem bietet er einige komfortable Funktionen, gute Konfigurationen, Cookie-Unterstützung und eine gute Performance, sodass er als Kronjuwel auf dem Gebiet glänzen kann und als De-facto-Standard gesetzt ist. Deswegen verwenden ihn viele andere darauf aufbauende Bibliotheken. Von allen Commons-Bibliotheken haben die HttpComponents die umfangreichste Dokumentation mit einer Vielzahl von Beispielen und Einstiegs-Tutorials, die gut die Verwendung der Funktionen erläutern und so den schnellen Einstieg erleichtern. Zur Überprüfung der eingesetzten HttpComponents-Version fordert man folgendes Programm an:

java -cp \lib\httpcore-4.2.2.jar; \lib\httpcore-nio-4.2.2.jar; 
lib\httpclient-4.2.2.jar;. org.apache.http.examples.PrintVersionInfo
org.apache.http org.apache.http.nio org.apache.http.client

Das folgende Beispiel zeigt einen einfachen Aufruf einer Webseite und die Ausgabe dessen Antwort und Seiteninhalte:

DefaultHttpClient httpclient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://www.heise.de");
try {
System.out.println("executing request " + httpGet.getURI());
HttpResponse response = httpclient.execute(httpGet);

System.out.println(response.getStatusLine() + " "
+ response.getLocale());
HttpEntity entity = response.getEntity();

// print response header
Header[] allHeaders = response.getAllHeaders();
for (int i = 0; i < allHeaders.length; i++) {
System.out.println(allHeaders[i]);
}
System.out.println("Response content length: "
+ entity.getContentLength());

Die am meisten verwendeten Bibliotheken sind Lang, Collections, IO, Logging, Codec, Collections und HttpComponents. Bei einigen Bibliotheken hat sich seit längerem nichts mehr getan, und die meisten setzen als Minimum Java 5 oder 6 voraus. Sowohl bei den Spracherweiterungen Lang und Math gab es ein Redesign, was sich in den um die Nummer 2 und 3 ergänzten Paketnamen widerspiegelt.

Die Verwendung von Commons führt zu einem besseren wartbaren und weniger fehleranfälligen Code, da sich damit wiederkehrende Probleme einheitlich lösen lassen. Das ist sicherlich ein Grund, warum diese Bibliotheken auch außerhalb von Apache beliebt sind. Deshalb werden Commons noch vielen Java-Programmierern treue Dienste leisten, weil sie einen hohen Nutz- und Wiederverwendungswert haben. Letztlich bedeutet weniger eigener Code oft auch eine bessere Lesbarkeit, weniger eigene Fehler und Wartungsaufwand.

Frank Pientka
ist Senior Software Architect bei der Materna GmbH in Dortmund.
(ane)