# Aufruf in Konsole mit beliebig vielen Argumenten?



## sunfy (5. Okt 2007)

Hallo,
ich hab da mal ne Frage.
Ich rufe ein Programm über die Konsole auf und übergebe diverse Parameter.

bsp.:

```
java test Parameter1 Parameter2
```

die Parameter lese ich dann in Java aus.


```
public static void main(String args[])
   String Param1 = args[1];
   String Param2 = args[2];
   String Param3 = args[3];
...
```

Soweit ist noch alle klar.
Doch was ist wenn ich eine Liste von Werten übergeben will, 
von denen ich vorher nicht weiß, wieviele es sind.

bsp. wenn ich eine Namensliste übergeben will:


```
java test Parameter1 Parameter2 hans peter fritz
```

die Namen sollen dann in einer ArrayList gespeichert werden.
In welcher Form muss ich die Namen dann übergeben?
Muss man vor die Namen dann ein "-" setzen?
Was bewirkt das Minus und wie lese ich das dann aus?

Gruß Sunfy


----------



## JPKI (5. Okt 2007)

Hö? Was für'n Minuszeichen?? Wenn du die Parameter alle in eine ArrayList einfügen willst:

```
public static void main(String args[]) {

 ArrayList<String>  list = new ArrayList<String>();

  for (int i = 0; args == null || i < args.length; i++)
   list.add(args[i]);
}
```


----------



## sunfy (5. Okt 2007)

mit dem Minus meinte ich etwas in der Art:


```
java Parameter1 Parameter2 -peter -hans -fritz Parameter3
oder
java Parameter1 Parameter2 -peter -hans -fritz -paul -gustav Parameter3
```

Damit dann alle Namen im Parameter2 drin sind, und ich den Parameter3 nicht mit in den Namen habe.
Aber wahrscheinlich ist es doch einfacher, wenn man die Namen ans Ende setzt und dann mir der for-Schleife alle einliest.


----------



## JPKI (5. Okt 2007)

Es gab da doch so 'ne ganz praktische API... Dem Objekt gab man den String-Array der main() und konnte dann ganz fein nach Parametern sortieren und die Werte auslesen...

Vielleicht fällt's mir später nochmal ein  ???:L


----------



## sunfy (5. Okt 2007)

ne, mit APIs etc. wird das zu komplex.

da ich das Programm mit

```
java programm start parameter1 parameter2 ...
```
aufrufe und das Programm startet dann einen Thread, der die eigentliche Berechnung durchführt.
Hat den Vorteil, dass das Programm mit

```
java programm stop
```
den Thread auch wieder beenden kann, oder mit

```
java programm status
```
verschiedene Statistiken ausgibt.

Und beim Aufruf des Threads muss ich halt immer die Argumente mit übergeben.

Ich werde die Parameter jetzt einfach mit einer Schleife auslesen. Das wird das einfachste sein.
Dachte nur, dass es da vielleicht eine Möglichkeit gäbe mit "-parameter" schon ein Array als Argument übergeben zu bekommen.
sodass dann 
	
	
	
	





```
args[2] == {hans, peter, fritz}
```
 wäre.

Thnx Sunfy


----------



## Murray (5. Okt 2007)

sunfy hat gesagt.:
			
		

> ```
> java programm start parameter1 parameter2 ...
> ```
> aufrufe und das Programm startet dann einen Thread, der die eigentliche Berechnung durchführt.
> ...


Das wird so einfach nicht funktionieren, denn mit jedem Aufruf des Java-Interpreters erzeugst du eine neue VM. Und ein Programm kann nicht auf einen Thread zugreifen, der in einer anderen VM läuft. Oder ist die Java-Anwendung nur quasi das Interface für eine als Dienst laufende Anwendung, die die Fäden zusammenhält? Das wäre natürlcih eine andere Liga...


----------



## tuxedo (5. Okt 2007)

Die Api für die Sache mit den Argumenten hießt glaube ich "getopt" oder so .. Die Jungs von jsresources.org haben die immer mal wieder benutzt.

- Alex


----------



## sunfy (5. Okt 2007)

ja genau.
Ist etwas komplizierter das alles zu erklären.
Aus jeden Fall läuft das schon alles, hab nur vergessen eine ParameterList mit zu übergeben.

Muss jetzt nur nochmal schauen, wie ich die Parameter am besten durchreiche.

Gruß Sunfy


----------



## tuxedo (5. Okt 2007)

Schau mal hier: http://www.urbanophile.com/~arenn/hacking/download.html#getopt


----------



## sunfy (5. Okt 2007)

werds mir mal anschauen.

Dank euch.
Gruß sunfy


----------



## NTB (5. Okt 2007)

Wie wäre es, wenn Du es so machst:


```
java programm -parms1 val1 val2 val3  -parms2 val4 -parms3 val5 val6 val7
```

D.h. es gibt für die jeweilige Gruppe einen "switch" hinter dem die Argumente kommen.

Ich meine mich zu erinnern, dass mir hier im Forum mal der Link zu einem Jakarta Commons Projekt zur Auswertung der Übergabeparameter geschickt wurde.

/Tante Edit hat mal nachgeschaut:
http://commons.apache.org/cli/


----------



## Leroy42 (6. Okt 2007)

JPKI hat gesagt.:
			
		

> ```
> public static void main(String args[]) {
> 
> ArrayList<String>  list = new ArrayList<String>();
> ...



args==null???

Kann das denn überhaupt vorkommen, wenn nicht gerade diese
main-Methode _selbst_ via Java aufgerufen wird?  ???:L 

Außerdem meintest du bestimmt


```
for (int i = 0; args != null && i < args.length; i++)
```


----------



## sunfy (6. Okt 2007)

also es läuft inzwischen alles so wie ich will.
Hab die einfachste Variante aufgegriffen und meine Parameter variabler Anzahl ans Ende gesetzt und dann mit einer Schleife ausgelesen.


```
public class WorkThread extends Thread{
		private String args[];
		
		public WorkThread(String args[]){
			this.args = args;
		}

		public void run(){
			
			List<String> lva2List = new ArrayList<String>();
			for (int i = 8; args == null || i < args.length; i++) 
				lva2List.add(args[i]); 
usw...
```


Die Variante von NTB ist sicherlich schöner, aber ich habs jetzt mal unschön mit der Schleife gelöst.


Vielen Dank euch allen.
Gruß Sunfy


----------



## Leroy42 (6. Okt 2007)

```
for (int i = 8; args == null || i < args.length; i++)
```

Erstens stört mich die festverdrahtete *8*.
Zweitens lies dir bitte mal meinen zuvor geposteten Beitrag durch...


----------



## sunfy (6. Okt 2007)

ja die 8 ist plöd, kannst aber erstmal nicht ändern.

Bei der Nicht-Abbruchbedingung hast du Recht, da war ein Denkfehler drin, so ist es richtig.

```
args != null && i < args.length;
```

Thnx Sunfy


----------



## Leroy42 (6. Okt 2007)

Gut erkannt!

Ich warte nur noch darauf, dass JPKI seinen Irrtum zugibt.

Aber auch

```
for (int i = 8; args != null && i < args.length; i++) 
            lva2List.add(args[i]);
```

bereitet mir (nicht verwöhnt durch heutige Prozessorleistungen)
zumindest _Bauchgrummeln_

Ich (persönlich) würde das verändern in

```
if (args != null)
              for (int i = 8; i < args.length; i++) 
                  lva2List.add(args[i]);
```

Dann wäre ich wirklich _befriedigt_


----------



## sunfy (6. Okt 2007)

ok, ich ändere es dir zuliebe um. =)


----------



## Leroy42 (6. Okt 2007)

sunfy hat gesagt.:
			
		

> ok, ich ändere es dir zuliebe um. =)



Na, das nenn' ich mal 'n nettes Samstagabend-Geschenk
von Dir!

Danke!  :toll:


----------



## JPKI (7. Okt 2007)

Leroy42 hat gesagt.:
			
		

> Gut erkannt!
> 
> Ich warte nur noch darauf, dass JPKI seinen Irrtum zugibt.


Ok, Leroy, wenn's dich befriedigt :roll: :
Ich habe mich geirrt!
So. Auch Hobbyprogrammierer sind nur Menschen. [ausrede]Außerdem liegen die Null und die Eins auf meiner Tastatur so dicht nebeneinander, deshalb hab ich == und nicht != geschreiben :wink: [/ausrede]


----------

