Komut Satırı Argümanları
Bir programa çalışırken dışarıdan veri vermenin en temel yolu komut satırı argümanlarıdır. main metodunun String[] args parametresi, programı başlatırken verdiğin değerleri taşır. Komut satırı araçları (CLI), betikler…
Komut Satırı Argümanları
Bir programa çalışırken dışarıdan veri vermenin en temel yolu komut satırı argümanlarıdır.
main metodunun String[] args parametresi, programı başlatırken verdiğin değerleri taşır.
Komut satırı araçları (CLI), betikler ve toplu işler (batch jobs) bu mekanizmayla yapılandırılır.
Not: Bu portal programları argümansız çalıştırır (
args.length == 0). Bu yüzden örnekler hem gerçekargs'ı kontrol eder hem de örnek bir diziyle ayrıştırmayı gösterir.
main(String[] args)
public static void main(String[] args) { ... }
java Program a b c komutunda args = ["a", "b", "c"] olur.
Önemli: C/C++'ın aksine, Java'da
argsprogram adını içermez — ilk eleman doğrudan ilk gerçek argümandır.
Argümanlar her zaman String'tir; sayı gerekiyorsa dönüştürürsün:
int yas = Integer.parseInt(args[1]);
Örnek 1 (./Ornek1.java) argümanları gezer, sayıya çevirir ve eksik argüman kontrolünü gösterir
(bu kontrol şarttır: eksik argüman ArrayIndexOutOfBoundsException, hatalı sayı
NumberFormatException atar).
Bayrak ve seçenek ayrıştırma
Gerçek CLI araçları üç tür argüman alır:
| Tür | Örnek | Anlamı |
|---|---|---|
| Bayrak (flag) | -v, --verbose | Değersiz; var/yok (aç/kapa) |
| Seçenek (option) | --cikti rapor.txt | Anahtar + değer |
| Konumsal (positional) | girdi.txt | Sırasıyla anlamlı |
Basit bir ayrıştırıcı elle yazılabilir: -- ile başlayanlar seçenek (sonraki eleman değeri),
tek - bayrak, gerisi konumsal. Örnek 2 (./Ornek2.java) bunu uygular ve bir Map'e doldurur.
Üretimde: CLI kütüphaneleri
Elle ayrıştırma küçük araçlar için yeterlidir; ama karmaşık CLI'lerde (otomatik yardım metni, tip dönüşümü, zorunlu/opsiyonel doğrulama, alt komutlar) kütüphane kullanılır:
- picocli (en popüler, anotasyon tabanlı, Spring Boot ile iyi çalışır)
- JCommander, Apache Commons CLI
@Command(name = "araç") class Arac implements Runnable { @Option(names = "--cikti") String cikti; @Parameters String girdi; public void run() { ... } }
Argümanların alternatifleri
Komut satırı argümanları tek yol değildir; yapılandırma için ayrıca:
- Ortam değişkenleri (
System.getenv) — konteyner dünyasında yaygın. - Sistem özellikleri (
-Dkey=value,System.getProperty) — topic 74. - Yapılandırma dosyaları (
.properties/.yml) — Spring Boot.
Genelde bunlar bir öncelik sırasıyla birleştirilir (argüman > env > dosya > varsayılan).
Özet
main(String[] args) ile programa dışarıdan veri vermeyi; argümanların String olduğunu, program
adını içermediğini ve eksik/hatalı argüman kontrolünün gerekliliğini (Örnek 1); bayrak/seçenek/
konumsal argüman ayrıştırmayı (Örnek 2) öğrendik; üretimde CLI kütüphanelerini ve argümanların
yapılandırma alternatiflerini gördük. Sırada, metotsuz "etiketleyen" arayüzler: Marker
Interface.
▶ Kod Örnekleri(2)
Ornek1
çalıştırılabilir1// Ornek1: Komut satırı argümanları — main(String[] args).
2// (Portal argümansız çalıştırır; bu yüzden örnek bir args dizisiyle de gösteriyoruz.)
3// Gerçekte: java Ornek1 ada 30 istanbul -> args = ["ada","30","istanbul"]
4// Çalıştırma: java Ornek1.java
5public class Ornek1 {
6
7 public static void main(String[] args) {
8 // args: programa komut satırından geçilen String dizisi (program adı DAHİL DEĞİL).
9 System.out.println("Gerçek argüman sayısı: " + args.length);
10 if (args.length == 0) {
11 System.out.println("(Portal argümansız çalıştırır; örnek bir dizi ile devam ediyoruz.)");
12 } else {
13 for (int i = 0; i < args.length; i++) System.out.println(" args[" + i + "] = " + args[i]);
14 }
15
16 // Simüle edilmiş argümanlar:
17 String[] ornekArgs = { "ada", "30", "istanbul" };
18 System.out.println("\nÖrnek args = [ada, 30, istanbul]:");
19 islet(ornekArgs);
20
21 // Eksik argüman kontrolü (gerçek programlarda şart):
22 System.out.println("\nEksik argümanla:");
23 islet(new String[]{ "burak" });
24
25 System.out.println("""
26
27 --- Komut satırı argümanları ---
28 main(String[] args): program çalıştırılırken verilen argümanlar bu diziye gelir.
29 'java Program a b c' -> args = ["a","b","c"] (program adı dahil değildir, C'den farklı olarak).
30 Argümanlar her zaman String'tir; sayı gerekiyorsa Integer.parseInt ile çevir.
31 MUTLAKA uzunluk/format kontrolü yap (eksik argüman -> ArrayIndexOutOfBounds; hatalı sayı -> NumberFormatException).""");
32 }
33
34 static void islet(String[] args) {
35 if (args.length < 3) {
36 System.out.println(" Eksik argüman! Beklenen: <ad> <yas> <sehir> (verilen: " + args.length + ")");
37 return;
38 }
39 String ad = args[0];
40 int yas = Integer.parseInt(args[1]); // String -> int
41 String sehir = args[2];
42 System.out.println(" " + ad + ", " + yas + " yaşında, " + sehir + "'de.");
43 }
44}Ornek2
çalıştırılabilir1// Ornek2: Bayrak/seçenek (flag/option) ayrıştırma — --ad değer, -v gibi.
2// Çalıştırma: java Ornek2.java
3import java.util.HashMap;
4import java.util.Map;
5
6public class Ornek2 {
7
8 public static void main(String[] args) {
9 // Gerçek CLI araçları gibi: --çıktı dosya.txt --tekrar 3 -v girdi.txt
10 String[] ornek = { "--cikti", "rapor.txt", "--tekrar", "3", "-v", "girdi.txt" };
11 System.out.println("Argümanlar: " + String.join(" ", ornek));
12
13 Map<String, String> secenekler = new HashMap<>();
14 java.util.List<String> serbest = new java.util.ArrayList<>();
15 boolean ayrintili = false;
16
17 for (int i = 0; i < ornek.length; i++) {
18 String a = ornek[i];
19 if (a.equals("-v")) {
20 ayrintili = true; // değersiz bayrak (flag)
21 } else if (a.startsWith("--")) {
22 String anahtar = a.substring(2);
23 String deger = (i + 1 < ornek.length) ? ornek[++i] : ""; // sonraki = değer
24 secenekler.put(anahtar, deger); // --anahtar değer
25 } else {
26 serbest.add(a); // konumsal (positional) argüman
27 }
28 }
29
30 System.out.println("\nSeçenekler (--): " + secenekler);
31 System.out.println("Bayrak -v (ayrıntılı): " + ayrintili);
32 System.out.println("Serbest argümanlar: " + serbest);
33 System.out.println("Tekrar sayısı (int): " + Integer.parseInt(secenekler.getOrDefault("tekrar", "1")));
34
35 System.out.println("""
36
37 --- Bayrak/seçenek ayrıştırma ---
38 CLI araçları üç tür argüman alır:
39 bayrak (flag): -v, --verbose (değersiz, var/yok)
40 seçenek (option): --cikti dosya.txt (anahtar + değer)
41 konumsal (positional): girdi.txt (sırasıyla anlamlı)
42 Basit ayrıştırma elle yazılabilir; karmaşık CLI için picocli, JCommander, Apache Commons CLI
43 gibi kütüphaneler (otomatik yardım, tip dönüşümü, doğrulama) tercih edilir.""");
44 }
45}