Java Tips & Tricks #
Auf dieser Wiki-Seite können sich kleinere und größere Tips, Tricks und Links zu Java allgemein oder auch zu speziellen Bibliotheken sammeln, für die man vielleicht nicht direkt eine eigene Seite anlegen will.
Anzeigen von wachsenden Dateien #
Ich möchte gerne eine ständig wachsende Textdatei (also z.B. eine Logdatei) anzeigen. Die Anzeige soll in einem Swing-Widget erfolgen. Dabei soll die Anzeige ständig aktualisiert werden. Leider scheint es nach erstem googlen sowas nicht direkt zu geben. Ansätze könnten folgende Links sein:
- http://www.informit.com/guides/content.aspx?g=java&seqNum=226 - Lesen einer Log-Datei in eigenem Thread
- http://www.codeproject.com/KB/java/MakeLogic_Tail_20.aspx - Tail als komplette Applikation
Fehlermeldung "incompatible types" (Bug im Sun Compiler) #
Ich bekam eine ebensolche Fehlermeldung, als ich Enums als Eigenschaften in einer Annotation verwendet habe. Der Fehler trat allerdings nur in bestimmten Compilerumgebungen auf (z.B. in Netbeans in Ant, wenn Groovy mitbenutzt wird). Da das Problem laut einigen gegoogelten Mitstreitern öfters in verschiedenen Java 1.5 und 1.6-Versionen auftritt, möchte ich es hier kurz erklären:
In einem Ausdruck wie
FeldWidgetType widgetType() default FeldWidgetType.AUTO;
haben wir es nämlich mit zwei verschiedenen Typen zu tun. Java geht nämlich bei Enums hin und leitet die Enum-Klasse, die man deklariert hat, für jedes einzelne Element ab. Warum das so gemacht worden ist, weiss ich auch nicht, das erlaubt aber u.a., für jedes Element Methoden zu überladen.
Nun ist obige Zeile auf den ersten Blick einfach und logisch, aber links und rechts stehen wirklich Objekte mit verschiedenen Klassen und anstatt das der Compiler nun merkt, daß die Klasse von "FeldWidgetType.AUTO" eine abgeleitete Klasse von "FeldWidgetType" ist, schmeisst er eine Fehlermeldung. :-(
Umgehen kann man das Ganze, indem man folgendes macht:
import static de.bayen.beans.FeldWidgetType.AUTO; ... FeldWidgetType widgetType() default AUTO;
Warum das nun klappt, weiss ich auch nicht, es ist aber so. :-) -- ThomasBayen
Links dazu:
- http://jira.codehaus.org/browse/PLXCOMP-100 - ältere Beschreibung des Fehlers (ohne Lösung)
- http://forums.sun.com/thread.jspa?messageID=10883241#10883241 - Versuch einer Erklärung, warum das Verhalten so "richtig" ist
- http://forums.sun.com/thread.jspa?threadID=5416155 - Das hat mich auf die Lösung gebracht
Encoding von Properties-Dateien #
Ein ganz altes Verfahren, um Einstellungen eines Programms zu speichern, ist es, dafür sogenannte Properties-Dateien zu benutzen. Eine gute Einführung ist im Java-Tutorial und natürlich auch in der Properties Javadoc. (Für ähnliche Zwecke gibt es übrigens auch die etwas modernere Preferences API, die ein XML-Format benutzt.)
Properties-Dateien werden im Gegensatz zu allen anderen Texten, wie z.B. Java-Quellcode, unabhängig von der eingestellten System-Umgebung immer in ISO-8859-1 kodiert. Zuerst mag einen das verwirren, aber eigentlich sind Properties-Dateien ja nicht dazu da, von Menschen gelesen zu werden, sondern vom Programm. Und dieses sollte in allen denkbaren Umgebungen schließlich immer dieselben Werte aus derselben Datei lesen. Warum die Java-Macher sich da jetzt ausgerechnet für ISO-8859-1 und nicht für das sicherlich flexiblere UTF-8 entschieden haben, weiß kein Mensch, aber für irgendwas mussten sie sich entscheiden.
Interessant zu wissen ist übrigens auch, daß auch Eclipse diese Konvention kennt und eine Datei mit der Endung ".properties" automatisch mit einem anderen Encoding öffnet als den Rest des Codes.
Nun gibt es allerdings auch Gelegenheiten, in denen das lästig ist. Die Codierung enthält bestimmte Sonderzeichen nicht (z.B. das Euro-Zeichen ist nicht enthalten). Das kann man auf zwei Arten umgehen: Entweder benutzt man ein XML-Format (mit obiger Preferences-API). Das ist allerdings nicht so User-tauglich. Properties-Dateien haben den Vorteil, daß man das Format auch dem einfachsten User erklären kann, wenn man ihm einen Texteditor in die Hand drückt. Alternativ geht folgendes:
Properties prop = new Properties() prop.load(new InputStreamReader(inputstream));
Der Trick ist, daß der Konstruktor des Streamreaders implizit das Default-Charset der Plattform benutzt. Damit kann der Benutzer seinen eigenen Texteditor benutzen. Zu beachten ist, daß man die so erstellten Properties-Dateien nicht mehr zwischen Plattformen (oder Benutzern) mit unterschiedlichem Encoding austauschen kann. Wer das möchte, kann dem Konstruktor des Streamreaders als zweiten Parameter auch ein Encoding angeben (z.B. "utf-8") und dieses somit fest einstellen.
Die letzte Frage ist nun, wo der Stream herkommt. Normalerweise nimmt man dazu die Methode ClassLoader.getResourceAsStream(...), der man einen Resourcennamen (Dateinamen) übergibt. Meiner Meinung nach sollte man einer derartig umkodierten Datei eine andere Endung als ".properties" geben. Nicht nur Eclipse ist sonst verwirrt und benutzt das (dann) falsche Encoding, man verstößt ja letztlich gegen den Properties-Standard. Also könnte man die Datei auf ".props" enden lassen, Eclipse erzeugt sie im Default-Encoding und alles passt wieder zusammen. :-) -- ThomasBayen
Java Plugin, via JDK #
Ist das JDK ohne JRE installiert, so geht auch das Plugin, einziger Nachteil, man muss an der registry schrauben. Installiert ist das Plugin unter dem jdk/jre path
Speichern und anpassen des path sollte dann das Plugin im FF aktivieren. Hier der Export meiner FF registry. ff.reg
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@java.com/JavaPlugin] "Description"="Oracle® Next Generation Java™ Plug-In" "GeckoVersion"="1.9" "Path"="C:\\Program Files\\Java\\jdk1.6.0_23\\jre\\bin\\new_plugin\\npjp2.dll" "ProductName"="Oracle® Java™ Plug-In" "Vendor"="Oracle Corp." "Version"="160_23" [HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@java.com/JavaPlugin\MimeTypes] [HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@java.com/JavaPlugin\MimeTypes\application/x-java-applet] "Description"="Java™ Applet" [HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@java.com/JavaPlugin\MimeTypes\application/x-java-applet;jpi-version=160_22] "Description"="Java™ Applet" [HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@java.com/JavaPlugin\MimeTypes\application/x-java-applet;version=1.1] "Description"="Java™ Applet" [HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@java.com/JavaPlugin\MimeTypes\application/x-java-applet;version=1.1.1] "Description"="Java™ Applet" [HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@java.com/JavaPlugin\MimeTypes\application/x-java-applet;version=1.1.2] "Description"="Java™ Applet" [HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@java.com/JavaPlugin\MimeTypes\application/x-java-applet;version=1.1.3] "Description"="Java™ Applet" [HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@java.com/JavaPlugin\MimeTypes\application/x-java-applet;version=1.2] "Description"="Java™ Applet" [HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@java.com/JavaPlugin\MimeTypes\application/x-java-applet;version=1.2.1] "Description"="Java™ Applet" [HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@java.com/JavaPlugin\MimeTypes\application/x-java-applet;version=1.3] "Description"="Java™ Applet" [HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@java.com/JavaPlugin\MimeTypes\application/x-java-applet;version=1.3.1] "Description"="Java™ Applet" [HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@java.com/JavaPlugin\MimeTypes\application/x-java-applet;version=1.4] "Description"="Java™ Applet" [HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@java.com/JavaPlugin\MimeTypes\application/x-java-applet;version=1.4.1] "Description"="Java™ Applet" [HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@java.com/JavaPlugin\MimeTypes\application/x-java-applet;version=1.4.2] "Description"="Java™ Applet" [HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@java.com/JavaPlugin\MimeTypes\application/x-java-applet;version=1.5] "Description"="Java™ Applet" [HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@java.com/JavaPlugin\MimeTypes\application/x-java-applet;version=1.6] "Description"="Java™ Applet" [HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@java.com/JavaPlugin\MimeTypes\application/x-java-vm] "Description"="Java™ Virtual Machine" [HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@java.com/JavaPlugin\MimeTypes\application/x-java-vm-npruntime] "Description"="Java™ Applet"