Java Getriebe

Java und NetBeans

Eingabedatei per Kommandozeile

Jeder Java Programmierer wird früher oder später über das eine Argument der main Methode stolpern. Dieses seltsame Feld von Strings. Kommandozeileargumente steht dann in irgendwelchen Handbüchern oder Tutorials.

Allerdings bekommen die meisten Benutzer eines aktuellen Betriebssystems von einer Kommandozeile nichts mit. Doppelklick auf das Programmicon und schon ist die bunte Oberfläche da. Doppelklick auf das Word Dokument und schon wird selbiges in der passenden Anwendung gestartet. Aber genau diese Aktion des Betriebsystems macht nichts anderes wie jemand, der in einer Konsole oder Eingabeaufforderung eine Zeile eingibt. Man sieht es nur nicht direkt. Es wird das Kommando eingegeben, welches ein Programm startet und diesem Programm den Dateinamen des gewünschten Dokuments mit gibt.

Diese „Mitgift“ wird vom Betriebssystem automatisch verwaltet, wenn eine Verknüpfung mit einer Dateiendung erstellt wird. Aber auch in der IDE kann man diese Argumente der Kommandozeile einstellen:

In Eclipse ist der Reiter „Arguments“ in den „Debug Configurations“ für diese Information zuständig. Einfach die Parameter im Feld „Program arguments“ in der gleichen Weise eingeben, wie es auch in der Konsole geschehen würde. Argumente mit Leerzeichen müssen also auch hier in Anführungszeichen gesetzt werden. In NetBeans ist die Kommandozeile in der Kategorie „Run“ in den Properties des Projekts zu finden. Dort gilt es die Daten im Feld „Arguments“ einzugeben. Auch hier nach den bekannten Regeln.

Für beide IDEs gilt: Das Startverzeichnis der Anwendung ist das Projektverzeichnis des „Hauptprojekts“. Werden also relative Pfade angegeben sind diese immer relativ zum Projektverzeichnis anzugeben.

Wofür brauche ich das?

Ein beliebter Fehler bei Programmieranfängern ist es eine Datei in der Daten zum Testen enthalten sind einfach mit dem kompletten Pfad in einem FileReader oder ähnlichem zu stecken:

1
2
3
4
5
6
7
8
public class Main
{
  public static void main(String[] args)
  {
    Scanner daten = new Scanner("C:\\projekte\\meinprojekt\\eingabe.dat");
  [...]
  }
}

Eine Vorgehensweise, die zumindest schnell zum gewünschten „Ergebnis“ führt. Allerdings verdammt schlechter Stil. Mit dem Wissen von weiter oben ließe sich das ganze auch etwas eleganter schreiben:

1
2
3
4
5
6
7
8
9
10
11
12
public class Main
{
  public static void main(String[] args)
  {
    if(args.length == 0)
    {
      System.err.println("Keine Datei angegeben.");
    }
    Scanner daten = new Scanner(args[0]);
    [...]
  }
}

Die kleine if Abfrage zu Beginn verhindert hässliche NullPointerExceptions und weißt auch gleich noch mal darauf hin, was falsch gelaufen ist. Den Dateinamen können wir jetzt einfach in den entsprechenden Stellen der IDE eintragen und können ihn sogar ziemlich schnell ändern ohne auch nur ein Zeichen im Quelltext ändern zu müssen.

Dieses Vorgehen ist übrigens unbedingt erforderlich für das Programm, welches während der „Großen Prog“ geschrieben wird. Der geforderte „Batch Modus“ übergibt der Reihe nach die Testdateien an das Programm. Wäre ziemlich nervig, wenn diese Dateinamen „hartkodiert“ im Quelltext stehen.

One Response to Eingabedatei per Kommandozeile

  1. Will Pastel says:

    What gorgeous website and I really like the way in which you author your particular articles.