Charset Konvertieren

Java unterstützt auf einfache Art und Weise die Konvertierung von Zeichensätzen:

import java.nio.ByteBuffer;
import java.nio.charset.Charset;

Charset utf8 = Charset.forName("UTF-8");
Charset iso88591 = Charset.forName("ISO-8859-1");

//get byte array from string
ByteBuffer utf8Buffer = ByteBuffer.wrap( utf8String.getBytes() );

//convert byte array from UTF-8 to ISO-8859-1
ByteBuffer iso88591Buffer = iso88591.encode( utf8.decode( utf8Buffer ) );

//parse byte array to ISO-8859-1 string
String iso88591String = new String( iso88591Buffer.array(), "ISO-8859-1" ); 

Nähere Angaben zu den unterstützten Zeichensätzen findet sich in der Dokumentation der Klasse Charset.

Um mit Java die Daten aus einer Oracle Datenbank von ISO-8859-1 in UTF-8 konvertieren kann man folgendermassen vorgehen:

import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

Class.forName("oracle.jdbc.driver.OracleDriver");
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@server:port:sid", "username", "password");

PreparedStatement selectStmt = connection.prepareStatement("SELECT id,subject FROM messages");
ResultSet resultSet = selectStmt.executeQuery();

Charset utf8 = Charset.forName("UTF-8");
Charset iso88591 = Charset.forName("ISO-8859-1");

System.out.println( "Converting Records..." );

while( resultSet.next() ){
    byte[] raw = resultSet.getBytes("subject");
    ByteBuffer iso88591Buffer = ByteBuffer.wrap(raw);

    //do the actual charset conversion
    ByteBuffer utf8Buffer = utf8.encode( iso88591.decode(iso88591Buffer) );
    
    try{
        String iso88591Str = new String(iso88591Buffer.array(),"UTF8");
        String utf8Str = new String(utf8Buffer.array(),"UTF8");
        
        System.out.println("UTF8: '" + iso88591Str + "' => '" + utf8Str + "'");
        
        PreparedStatement updateStmt = connection.prepareStatement("UPDATE messages SET subject = ? WHERE id = ?");
        updateStmt.setString(1,utf8Str);
        updateStmt.setInt(2, resultSet.getInt("id"));
        updateStmt.executeUpdate();
        updateStmt.close();
        
    } catch( UnsupportedEncodingException e ){}
}

if( selectStmt != null ){
    selectStmt.close();
}

JAR erstellen

Eine kurze Anleitung, wie eine JAR (Java ARchive) Datei aus Java Source Code generiert wird.

Wir verwenden folgenden Code um ein Beispielprogramm zu erzeugen, das „Hello World!“ auf der Kommandozeile ausgibt:

$: vi HelloWorld.java
/**
* The HelloWorld class implements an application that
* simply prints "Hello World!" to standard output.
*/
class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello World!"); // Display the string.
  }
}

Um nun daraus eine lauffähige *.jar Datei zu machen, muss als erstes ein MANIFEST erstellt werden. Dieses beinhaltet den Namen der Hauptklasse, die als Einstiegspunkt des Programms verwendet werden soll. Der Name der MANIFEST Datei spielt dabei keine Rolle, Java passt ihren Namen automatisch bei der Erstellung der JAR Archivs an.

$: vi manifest.txt
Main-Class: HelloWorld

Im nächsten Schritt kompilieren wir den Quellcode der HelloWorld.java Datei in ausführbaren Bytecode:

$: javac HelloWorld.java

Und als letztes packen wir alles zusammen in ein helloworld.jar Archiv. Weitere Dateien können durch ein Leerzeichen getrennt hinzugefügt werden. Sollte es sich um ein Verzeichnis handeln, so wird dieses rekursiv hinzugefügt:

$: jar -cvfm helloworld.jar manifest.txt HelloWorld.class

Et voilà, schon haben wir unser ausführbares „Hello World!“ Java Programm:

$: java -jar helloworld.jar
Hello World!

JAR vs. WAR vs. EAR

Die Unterschiede der Java Archive JAR, WAR und EAR kurz und knackig zusammengefasst.

JAR

Java Archive beinhalten *.class Dateien, Bibliotheken, statische Dateien und ein optionales META-INF/MANIFEST.MF. Dieses optionale MANIFEST.MF kann Versionsinformationen und andere Beschreibungen der Archivs beinhalten.

WAR

Web Archive beinhalten eine vollständige Java Web Applikation, die auf einem Servlet Container wie zBsp. Apache Tomcat deployed werden kann. Das Archiv enthält alle dazu notwendigen statischen als auch *.jsp, *.css, *.js oder *.jar Dateien. Zusätzlich dazu besitzt das Web Archiv ein WEB-INF/web.xml Deployment Descriptor, der dem Servlet Container mitteilt, wie das Archiv korrekt deployed wird.

EAR

Enterprise Archive können mehrere *.war und *.jar Dateien beinhalten und vereinfachen so das Deployment komplexer Enterprise Applikationen.