📁 File Handling, Iterator, Generics & Threads
File Handling, Iterator, Generics &: File handling bir kaynağı açıp kullanıp kapatmayı (aksi halde bellek/handle sızar), Iterator bir koleksiyonu iç yapısını bilmeden sırayla gez
File handling bir kaynağı açıp kullanıp kapatmayı (aksi halde bellek/handle sızar), Iterator bir koleksiyonu iç yapısını bilmeden sırayla gezmeyi, Generics ise tek bir kodu farklı tiplerle tip-güvenli çalıştırmayı sağlar — tıpkı bir kasadan belge alıp iş bitince kilitlemek, bir tur rehberinin kitapları raf düzenini ezberlemeden sırayla göstermesi ve tek bir kalıbın hem `List ` hem `List ` dökebilmesi gibi. Peki Generics olmadan `Object` kullanıp her şeyi tutabiliyorken neden `List ` gibi tip parametresine ihtiyaç var? Çünkü `Object` ile listeye yanlış tip koyabilirsin ve hata ancak çalışma zamanında `ClassCastException` olarak patlar; Generics bunu derleme zamanında imkânsız kılar. Bu, Java'nın statik tip gücüdür; Python'ın tip ipuçları (type hints) opsiyoneldir ve çalışma zamanında zorlamaz, TypeScript'in generic'leri ise Java'ya en yakın modeldir. QA mühendisi için üçü de güvenilirlik sağlar: test raporunu dosyaya yazarken kaynağı kapatmazsan uzun koşumda handle sızması testleri bozar, Generics ise bir test-data util'ine yanlış tip veri geçmeni derleme zamanında engelleyerek çalışma zamanında ortaya çıkan sinsi flaky hataları önler.
File Oluşturma ve Yazma
java.nio.file.Files — modern dosya API
Micro Lab: Kod yazma
TODO satirini beklenen cozumdeki kritik satirla degistir. Bu gercek runtime degil; amac dogru yapinin yazilmasini kontrollu olarak pekistirmek.
Files.write() ile Files.writeString(APPEND) Arasındaki Fark Neden Önemli?
`Files.write(path, List.of(...))` dosyayı YOKSA oluşturur, VARSA baştan ÜZERİNE yazar — bu, bir test raporunu SIFIRDAN başlatmak için doğru seçimdir.
Files.writeString(path…
`Files.writeString(path, "...", APPEND)` ise MEVCUT içeriği SİLMEDEN sona ekler — sürekli büyüyen bir log dosyasına satır eklemek için budur.
Files.exists(path) ve…
`Files.exists(path)` ve `Files.deleteIfExists(path)` sırayla çağrılır çünkü VAR OLMAYAN bir dosyayı silmeye çalışmak (`Files.delete()` ile) `NoSuchFileException` FIRLATIR — `deleteIfExists` bu riski ortadan kaldırır.
Properties.load(new…
`Properties.load(new FileInputStream(...))` bir `.properties` dosyasını key-value ÇİFTLERİ olarak okur — QA konfigürasyonunda `base.url` gibi ortam-bağımlı değerleri KODA gömmeden yönetmenin standart yoludur.
Files.readAllLines, BufferedReader