Java Tricks
Strings vergleichen
Das Vergleichen von Strings führt oft zu Frustration, weil Java Strings (angeblich...) nicht als gleich erkennt. Meist sieht ein Vergleich dann so aus:
// **** FALSCH!!!! ****
String string1 = "Meier";
String string2 = "Meier";
if(string1 == string2){...}
if(string1 != string2){...}
Wichtig: Strings sind OBJEKTE!!! D.h. ein Vergleich mit == (bzw. !=) funktioniert nur, wenn es sich um genau das gleiche OBJEKT handelt! Das ist z.B. nicht der Fall, wenn der String s1 = "Meier"; an einer Stelle gespeichert ist und der String s2 = "Meier" an einer anderen Stelle.
Strings muss man mithilfe der Methode equals() vergleichen. Dann wird der Wert des Strings betrachtet und man erhält die gewünschte Gleichheit.
// **** RICHTIG!!!! ****
String string1 = "Meier";
String string2 = "Meier";
if(string1.equals(string2)){...}
if(string1.equals(string2) == false){...}
Datum und Uhrzeit ausgeben
Hier ein Beispiel, wie in Java Datum und Uhrzeit des Systems ausgelesen und angemessen formatiert werden können.
import java.text.SimpleDateFormat;
import java.util.Date;
public class DatumUhrzeitBeispiel {
public static void main(String[] args) {
Date dasDatum = new Date();
String datumUhrzeitVollstaendig = dasDatum.toString();
System.out.println(datumUhrzeitVollstaendig);
SimpleDateFormat formatDatum = new SimpleDateFormat("yyyy-MM-dd");
String datumString = formatDatum.format(dasDatum);
System.out.println( "Datum: " + datumString);
SimpleDateFormat formatUhrzeit = new SimpleDateFormat("HH:mm");
String uhrzeitString = formatUhrzeit.format(dasDatum);
System.out.println( "Uhrzeit: " + uhrzeitString);
}
}
Objekte als String (z.B. an die Konsole) ausgeben
Oft steht man vor der Schwierigkeit, dass man ein Objekt mit System.out.println() an die Konsole ausgeben möchte oder sonst eine String-Repräsentation eines Objektes braucht.
Das geht am einfachsten (und strategisch am besten!), indem man in der Klasse die Methode toString() definiert. Diese Methode überschreibt dann die Methode toString() der Klasse Object.
Z.B. für die Klasse Auftrag:
import java.util.Date;
public class Auftrag{
private String text;
private String datumZeit;
public Auftrag(String text){
this.text = text;
this.datumZeit = new Date();
}
// weitere Methoden!!!
// **** JETZT KOMMT DAS WESENTLICHE! ****
public String toString(){
return (this.text + ", "+this.datumZeit);
}
}
Mit Hilfe der Methode toString() werden die Objekte auch richtig im StackWithViewer (bzw. QueueWithViewer) angezeigt!
Konvertierung von Objekten
TODO
IP-Adresse des eigenen Rechners auslesen
Um z.B. einen Chatserver aufzusetzen, braucht man die IP-Adresse des eigenen Rechners - denn die muss man den Clients mitteilen können! Die Methode getLocalIPAddress() (s.u.) kann man per Copy/Paste in die eigene Klasse packen.
Damit das funktioniert, braucht man folgende import-statements:
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* liest die IP-Adresse des lokalen Rechners aus.
* @return IP-Adresse des lokalen Rechners.
*/
public static String getLocalIPAddress(){
String ipAddress = null;
try {
// Holt den Hostnamen
String localHost = InetAddress.getLocalHost().getHostName();
// Holt die IP-Adresse
InetAddress ia = InetAddress.getByName(localHost);
// liest die Host-Adresse in einen String aus
ipAddress = ia.getHostAddress().toString();
} catch (UnknownHostException e) {
e.printStackTrace();
ipAddress = "Unknown Host";
}
return ipAddress;
}
Speichern im Dateisystem
In Java gibt es die Möglichkeit, Objekte mit ihrem kompletten Status und alle abhängigen Objekte auf einen Schlag im Filesystem zu speichern. D.h. Es wird ein ganzes ObjektCluster gespeichert. Entsprechend kann man diese Objekte auf einen Schlag wieder auslesen.
Dafür braucht man die folgende Klasse FileReaderWriter
:
import java.io.*;
import java.util.*;
public class FileReaderWriter {
/**
* Es sollen keine Objekte vom Typ Serializer erzeugt werden.
*/
private FileReaderWriter(){
}
/**
* speichert ein Objekt - und alle davon abhaengigen Objekte! -
* in serialisierter Form.
* Voraussetzung: Das Objekt - und alle davon abhaengigen Objekte -
* implementieren Serializable
* @param object
* @param filename
*/
public static void saveSerialized( Object object, String filename )
{
try
{
FileOutputStream file = new FileOutputStream( filename );
ObjectOutputStream o = new ObjectOutputStream( file );
o.writeObject ( object );
o.writeObject ( new Date() );
o.close();
}
catch ( IOException e ) { System.err.println("FileReaderWriter.saveSerialized(): "+ e ); }
}
/**
* liest ein serialisiertes Objekt
* @param filename
* @return
*/
public static Object readSerialized( String filename )
{
Object result = null;
try
{
FileInputStream file = new FileInputStream( filename );
ObjectInputStream o = new ObjectInputStream( file );
result = o.readObject();
o.close();
}
catch ( IOException e ) {
System.err.println("FileReaderWriter.readSerialized(): "+ e );
}
catch ( ClassNotFoundException e ) {
System.err.println("FileReaderWriter.readSerialized(): "+ e );
}
return result;
}
}
Verwendung
Schreiben ins Filesystem:
FileReaderWriter.saveSerialized(meinObjekt, filename);
Lesen aus dem Filesystem:
MeineKlasse meinObjekt = (MeineKlasse)FileReaderWriter.readSerialized(filename);