Lange versprochen wenden wir uns jetzt unserer Kuh aus dem zweiten Java-Tutorial zu. Schauen wir uns noch einmal an wie das Unix-Programm cowsay funktioniert.

cowsay 'Java rocks!'

Die Ausgabe dazu sollte so aussehen:

 _____________
< Java rocks! >
 -------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Diese Funktionalität möchten wir nun nachbauen, dass wir unser cowsay mit diesem Befehl ausführen können und das Ergebnis genauso aussehen soll wie das original cowsay aus Unix.

java cowsay 'Java rocks!'

Der Vorteil dabei ist jedoch, dass wir dieses Programm auf Windows, Linux, Mac OSX und allen anderen Betriebssystemen nutzen können, die auch von dem Java Runtime Environment unterstützt werden.
Okay, fangen wir dann mal an. Zunächst erstellen wir uns eine Klasse cowsay, die auch die main-Methode enthält:

class cowsay
{
  public static void main(String[] args)
  {
  }
}

Zunächst sollten wir klären wie wir es schaffen, dass der Text, den wir beim Aufruf des cowsay-Programms mitgeben auch in unseren Java-Code kommt. Dazu ist dieses String[] args da! Wie wir in den letzten Tutorials gelernt haben, handelt es sich hierbei um ein Array des Typs String. Darin finden wir die Argumente, die wir an unser Programm in der Konsole übergeben haben. Bei unserem cowsay brauchen wir lediglich auf args[0] zuzugreifen, denn wir übergeben nur ein Argument. Sollten wir jedoch mehrere Argumente übergeben wollen, so trennen wir diese durch ein Leerzeichen im Programmaufruf und finden diese in args[0] … args[n] wieder. Je nachdem wie viele davon wir übergeben hatten.
Ein Problem auf das wir stoßen werden, ist dass wir die Fehlermeldung “ArrayIndexOutOfBoundException” erhalten, wenn wir beim Programmaufruf keine Nachricht übergeben. Dies werden wir mit einer bedingten Anweisung lösen und eine Standardnachricht angeben.
Deshalb waren mir auch die letzten Tutorials so wichtig, bevor wir dieses hier bearbeiten konnten.
Bauen wir uns dazu nun folgenden Code:

class cowsay
{
  public static void main(String[] args)
  {
    if(args.length == 0)
    {
      args = new String[1];
      args[0] = "Ich sage nix";
    }
    //Hier geht es noch weiter
  }
}

Hier prüfen wir mit args.length == 0, ob das args Array einen Wert zugewiesen bekommen hat. Ist dies der Fall, so ist die Länge des Arrays größer 0! Sollte es nun so sein, dass keine Nachricht eingegeben wurde, definieren wir args als ein String-Array-Objekt mit einer Länge von eins. Nun speichern wir die Standardnachricht “Ich sage nix” in das Array an der Stelle 0.

Wenden wir uns jetzt der Sprechblase zu. Wir müssen dabei darauf achten, dass die Größe dieser abhängig von der Länge der eingegeben Nachricht ist. Dieses Problem werden wir mit einer Schleife lösen können. Dies zeigt uns das folgende Code-Fragment:

class cowsay
{
  public static void main(String[] args)
  {
    if(args.length == 0)
    {
      args = new String[1];
      args[0] = "Ich sage nix";
    }
    String message = args[0];
    int messageLength = message.length();   //Laenge der Nachricht
 
    /*********************************************
    *           Sprechblase erzeugen
    *********************************************/
    String top = " ";                //Obere Linie der Sprechblase
    String bottom = " ";             //Untere Linie der Sprechblase
 
    //Linke und rechte Grenze mit Nachricht der Sprechblase
    String contentAndBorders = "< " + message + " >";
 
    //Gesamte Sprechblase
    String speechBubble;  
 
    //Obere + untere Linie erzeugen
    for(int i = 1; i <= messageLength + 2; i++)
    {
      top += "_";
      bottom += "-";
    }
 
    speechBubble = top + "\n";
    speechBubble += contentAndBorders + "\n";
    speechBubble += bottom + "\n";
 
    //Jetzt folgt noch die Kuh
  }
}

Die ersten Zeilen sind die gleichen wie im obigen Code. Wir weisen der Variablen message den Inhalt des Arrays an der Stelle 0 zu, damit wir uns das Schreiben der eckigen Klammern sparen können und diese Variable einfach sprechender ist, als ein args[0].
Die Variable messageLength bekommt die Länge unserer Nachricht zugewiesen, da wir diese für die Schleife brauchen werden. Als nächstes erzeugen wir uns die Variablen top und bottom, die die Zeichen für die obere bzw. untere Linie enthalten werden. Diese bekommen jeweils zunächst ein Leerzeichen zugewiesen. Damit stellen wir sicher, dass über / unter der öffnenden spitzen Klammer keine Striche stehen werden.
Die Variable messageAndBorders enthält die Nachricht und den linken und rechten Begrenzer gefolgt von einem Leerzeichen, damit links und rechts von der Nachricht etwas Platz bleibt. – Sieht einfach besser aus. Dadurch müssen wir aber auch die Schleife um zwei Durchläufe erweitern, um dies auszugleichen. In dieser Schleife werden die Variablen top und bottom mit den entsprechenden Zeichen “_” und “-” gefüllt. Es werden so viele Zeichen erstellt wie die Nachricht – verlängert um zwei – lang ist.
Die Variable speechBubble soll die gesamte Sprechblase enthalten und bekommt deshalb top, contentAndBorders und bottom – jeweils gefolgt von einer “newline” – zugewiesen.

Jetzt fehlt uns nur noch die Kuh. Eigentlich könnten wir einfach den Code aus dem CowSay-Tutorial verwenden, denn es ändert sich hierbei nichts. Um aber so viele System.out.println zu vermeiden, speichern wir die Kuh in die kuh Variable und erstellen uns eine Variable cowsay, die die Sprechblase und die Kuh enthält, die wir dann schließlich ausgeben werden.

class cowsay
{
  public static void main(String[] args)
  {
    if(args.length == 0)
    {
      args = new String[1];
      args[0] = "Ich sage nix";
    }
    String message = args[0];
    int messageLength = message.length();   //Laenge der Nachricht
 
    /*********************************************
    *           Sprechblase erzeugen
    **********************************************/
    String top = " ";                //Obere Linie der Sprechblase
    String bottom = " ";             //Untere Linie der Sprechblase
 
    //Linke und rechte Grenze mit Nachricht der Sprechblase
    String contentAndBorders = "< " + message + " >";
 
    //Gesamte Sprechblase
    String speechBubble;
 
    //Die Kuh
    String kuh;
 
    //Die gesamte Ausgabe
    String cowsay;  
 
    //Obere + untere Linie erzeugen
    for(int i = 1; i <= messageLength + 2; i++)
    {
      top += "_";
      bottom += "-";
    }
 
    speechBubble = top + "\n";
    speechBubble += contentAndBorders + "\n";
    speechBubble += bottom + "\n";
 
    //Die Kuh erzeugen
    kuh = "       \\   ^__^" + "\n";
    kuh += "        \\  (oo)\\_______" + "\n";
    kuh += "           (__)\\       )\\/\\" + "\n";
    kuh += "               ||----w |" + "\n";
    kuh += "               ||     ||";
 
    cowsay = speechBubble + kuh;
 
    System.out.println(cowsay);
  }
}

Jetzt ist unsere Kuh eigentlich fertig und kann auch verwendet werden. Wir werden sie aber noch in späteren Tutorials umbauen. Freut euch schon mal drauf.
Wer keine Lust hat sich den Programmcode zu kopieren, kann hier die cowsay.class und cowsay.java herunterladen. Die cowsay.class kann direkt ausgeführt werden. Die cowsay.java müsste erst noch durch den Java Compiler gejagt werden.