Czasem zachodzi potrzeba przekazania informacji do programu w momencie jego uruchomienia (linia poleceń), bądź sięgnięcia z programu do zasobów środowiska systemu operacyjnego celem sprawdzenia np.: gdzie znajduje się katalog użytkownika, bądź w jakim systemie operacyjnym uruchomiony jest program. Tutaj przydaje się poniżej zamieszczona wiedza.
Spis treści
Pobieranie wartości zmiennych środowiskowych
Celem pobrania zmiennych środowiskowych możemy zastosować metodę .getProperty() obiektu System tak jak w poniższym przykładzie:
public class PoleceniaSystemowe { public static void main(String[] args) { System.out.println(System.getProperty("user.dir")); System.out.println(System.getProperty("user.home")); System.out.println(System.getProperty("os.version")); System.out.println(System.getProperty("os.name")); } }
Jak widać po efektach działania wyświetla informacje o systemie, które możemy wykorzystać w naszym programie celem dostosowania go do konkretnego środowiska.
Lista ciągów (kluczy) dla metody getProperty wygląda następująco:
- os.version : wersja systemu operacyjnego
- os.name : nazwa systemu operacyjnego
- os.arch : architektura systemu operacyjnego
- java.compiler : nazwa używanego kompilatora
- java.ext.dirs : dostępne ścieżki rozszerzeń
- java.library.path : ścieżki dostępu do bibliotek
- path.separator : separator ścieżki (w Windows to zazwyczaj “;”)
- file.separator : separator ścieżki dostępu do pliku (w Windows to zazwyczaj “\”)
- user.dir : aktywna ścieżka (aktywny katalog)
- user.name : nazwa konta użytkownika
- java.vm.version : wersja implementacji JVM
- java.vm.name : nazwa implementacji JVM
- java.home : katalog w którym zainstalowano Java
- java.runtime.version : wersja JVM
Przekazywanie parametrów do programu
Czasem chcielibyśmy uruchomić program i od razu w sposób nie interaktywny (odpytywany), a wsadowy (batch) podać dane na których program mógłby pracować i wykonać niezbędne operacje.
Inicjując pracę naszego programu z linii poleceń moglibyśmy go uruchomić wpisując:
java.exe -jar PoleceniaSystemowe.jar Ala="Ala" ma=true kota=1
Pracując jednakże w środowisku programistycznym NetBeans musimy zasymulować taki sposób uruchamiania w konfiguracji.
Następnie, upewniając się, że mamy wybrany właściwy plik z “Main Class” wpisujemy argumenty z jakimi ma być uruchamiany:
Użycie tego w programie jest już banalnie proste. Pewnie zauważyliście konstrukcję metody main, gdzie w jej argumentach jest umieszczona tablica Stringów?! Jeśli tak, to możecie się już domyślić, że w tej tablicy umieszczone są wszystkie argumenty podane w linii uruchomienia naszego programu rozdzielone delimiterem w postaci spacji ” “. Przykład takiego programu sprawdzającego argumenty z linii poleceń i jego działania jest umieszczony poniżej:
Listing zawartości katalogu plików
Często także potrzeba sprawdzić jakie pliki istnieją w bieżącym katalogu roboczym np. w celu wybrania jednego z nich do odczytu. Można skorzystać z metody .list() klasy File aby zbudować tablicę Stringów zawierającą nazwy plików.
void listuj(String nazwa) { String[] pliki; File file = new File(nazwa); pliki = file.list(); for(String s:pliki) System.out.println(s); }
Czasem jednak ta informacja jest niewystarczająca. Wtedy dobrze jest wiedzieć w jaki sposób można uruchomić polecenie systemowe. Taka operacja wymaga powiązania kilku procesów ze sobą, ale nie jest niczym szczególnym. Przykład programu uruchamiającego polecenie systemowe dir jest zamieszczony poniżej:
import java.io.IOException; import java.io.InputStream; import java.util.Scanner; public class PoleceniaSystemowe { public static void main(String[] tabA) { Runtime t=Runtime.getRuntime(); // <-- przypisujemy uchwyt egzekucyjny // obecnego procesu (działania programu) try { InputStream is=t.exec("cmd /c dir").getInputStream(); // <-- przechwytujemy wynik // wykonania komendy (exec) // jako strumień wejściowy Scanner sc=new Scanner(is); // <-- strumień wejściowy terminujemy // w obiekcie klasy Scanner while (sc.hasNextLine()) System.out.println(sc.nextLine()); // <-- czytamy całą // (i wypisujemy) // zawartość bufora } catch (IOException ex) { System.err.println("Wystąpił błąd operacji...");} } }
W wyniku działania powyższego programu uzyskujemy:
W ten sam sposób możemy uruchamiać inne polecenia systemowe, a wynik ich działania odbierać jak wyżej.
Kod wyjścia z programu
Standardowo, po linii polityki twórców języka Java, kodem wyjścia z programu jest kod “0” – czyli wyjście bez błędu. Tym niemniej czasem (szczególnie przy przetwarzaniu typu łańcuchowego1kiedy jeden program uruchamia kolejny, a status jego zakończenia zwracany jest właśnie za pomocą kodu wyjścia) jest ważne, aby program pomimo, że zakończy się bez błędu, zwrócił oczekiwaną wartość wyjścia. Można tego dokonać na dwa sposoby:
import java.lang.Runtime; public class KodWyjscia { public static void main(String[] args) { //Korzystając z klasy Runtime Runtime t=Runtime.getRuntime(); t.exit(201); } }
public class KodWyjscia { public static void main(String[] args) { //Korzystając z metody exit() obiektu System System.exit(203); } }
Wtedy program zakończy się z sztucznie zgłoszonym błędem, którego kod może nieść ważną informację do programu nadrzędnego z którego uprzednio nasz program został uruchomiony.