Bei Programmausführung args übergeben

codepanda

Neues Mitglied
Hallo,

ich habe bald eine Prüfung und es wurde angedeutet, dass beim Programmstart Parameter zu übergeben sind und diese auch ordentlich weiterverarbeitet werden sollen.

Grundsätzlich wird verlangt, ein Programm zu schreiben, dass Dateien einliest (xml/html/csv oÄ), verarbeitet (sortieren/filtern), und dannach ausgibt (xml/html/csv).

Im Terminal wird dann ein Befehl mindestens so aussehen:
Bash:
java -jar MeinProgramm.jar --input=C:\Pfad\zum\InputFile.csv --output=C:\Prad\zum\OutputFile.html
Möchte man zB (angenommen wir haben eine Musikdatenbank) nach Genre sortieren:
Bash:
java -jar MeinProgramm.jar --input=C:\Pfad\zum\InputFile.csv --output=C:\Prad\zum\OutputFile.html --genre=Rock
Oder zB per Erscheinungsjahr:
Bash:
java -jar MeinProgramm.jar --input=C:\Pfad\zum\InputFile.csv --output=C:\Prad\zum\OutputFile.html --yearFrom=1980 --yearTo=2000
Falscheingaben müssen abgefangen werden, dH dem User soll die möglichkeit gegeben werden etwaige Falscheingaben (zB --gnre statt --genre) auszubessern, ohne, dass man das Programm neu im Terminal starten muss.
Auch die Reihenfolge der Args soll dem User beliebig überlassen werden, also zB auch:
Bash:
java -jar MeinProgramm.jar --genre=Rock --input=C:\Pfad\zum\InputFile.csv --yearFrom=1980 --output=C:\Prad\zum\OutputFile.html --yearTo=2000
Ich bin kein totaler Anfänger mehr, aber ich komm da irgendwie nicht auf eine anständige Lösung.

Java:
public static void main(String[] args) {

  final String inputFlag = "--input";
  final String outputFlag = "--output";

  String inputFileLocation = null;
  String outputFileLocation = null;

  if (args.length >= 1) {
    for (String arg : args) {
      String[] test1 = arg.split("=");

      if (test1[0].equals(inputFlag)) {
        inputFileLocation = test1[1];
        System.out.println("Input: " + test1[1]);
      }
      if (test1[0].equals(outputFlag)) {
        outputFileLocation = test1[1];
        System.out.println("Output: " + test1[1]);
      }
    }
  }
...wenn ich nun ne zB xml mit 10 verschiedenen Elementen habe, wird der Code so erstens unsauber und zweitens bin ich mir sicher, dass es dafür einen vernünftigen Weg geben muss. Kann man da mit switch/case inkl enums oder ner HashMap was machen? ...wenn ja, wie würdet ihr an die Sache rangehen?

Mir muss hier selbstverständlich niemand etwas vorprogrammieren, ich wäre schon sehr dankbar wenn ihr den Weg beschreiben würdet, den ihr da gehen würdet.

Danke im Vorraus.

LG
CodePanda
 

Eldarius

Neues Mitglied
Um einen mehrfach Durchlauf der args wirst nicht herum kommen . Ich würde dann mit einem switch/case arbeiten um die Erkennung der Optionen zu gewährleisten und Fehler per default abfangen und den Benutzer wieder ins Terminal schicken.

Falscheingaben müssen abgefangen werden, dH dem User soll die möglichkeit gegeben werden etwaige Falscheingaben (zB --gnre statt --genre) auszubessern, ohne, dass man das Programm neu im Terminal starten muss.
das ist meiner Meinung nach gerade bei Optionen (--xyz) schwierig . Lieber dem Benutzer mitteilen das die Option falsch ist und ihm eine Hilfe Seite zeigen wie die Optionen richtig geschrieben werden .
Das gleiche Problem hast du auch bei den Angaben C:\Prad\zum\OCutputFile.html denn du müsstest jeden Fehler
den ein DAU machen könnte kennen !
In diesem Fall würde ich halt testen ob die Datei vorhanden ist oder bzw. angelegt werden kann .
Sollte es nicht der Fall sein dem Benutzer eine entsprechende Fehler Meldung ausgeben und ab mit ihm ins Terminal :D .

Ich bin der Meinung das man dem Benutzer nicht alles abnehmen kann und Fehler halt bestraft werden :D .
Alles andere ist für mich Unsinn und erfordert nur riesigen Programmcode den man sich sparen kann.

mfg.Eldarius
 

Mat

Aktives Mitglied
Wenn das nicht für eine Prüfungsvorbereitung wäre, hätte ich Konfigurationsobjekte oder sowas empfohlen. Also eine Klasse oder Enum gibt die gültigen Optionen vor und ein Parser nimmt einfach alle args-Paare oder Flags entgegen, übernimmt die bekannten args, setzt Standardwerte für die fehlenden args ein und lehnt unbekannte args mit aussagekräftigen Fehlermeldungen ab oder ignoriert sie. Sowas kann man auch mit Konfigurationsdateien kombinieren.

Aber gewöhne dir lieber die von @Eldarius empfohlene switch-case Lösung an. Sonst kommst du in der Prüfung nicht mit der Zeit aus.
 
Oben Unten