Java Bilgileri | Bölüm 3

MegaCrafter

Obsidyen Madencisi
Mesajlar
1,419
En iyi cevaplar
0
Beğeniler
1,542
Puanları
3,070
Yeniden merhaba. Bu bölümde söz verdiğim gibi bazı anahtar kelimeleri, nasıl dosya oluşturulabileceğini, nasıl ona yazı yazılabileceğini, nasıl ondan yazı okunabileceğini ve nasıl bilgisayardan herhangi bir dosya açabileceğimizi göstereceğim. Başlayalım...

synchronized: Bu biraz komplike bir işlem. Multi-threading denilen bir şey için kullanılıyor. Belki Thread.sleep(zaman) metodunu görmüşsünüzdür. Oradaki Thread bir class. Thread dediğimiz şey bir işlemdir. Mesela bir Minecraft'ı ele alalım. Aynı anda birkaç işlemin ayrı ayrı çalışması gerekiyor. Mesela Multiplayer'da her bir oyuncu bir işlemdir. Arkada çalan müzik bir işlemdir. Blokları kırdığınızda efektler çıkması bir işlemdir. Bunların hepsini ayrı ayrı çalıştırmak istersek Thread kullanırız. Bu anahtar kelime de, bir metodu sadece bir Thread'in kullanmasını sağlar. Eğer Thread ile hiçbir alakanız yoksa bunu anlamaya çalışmayın. Anlatması biraz zor. Daha sonra anlatmaya çalışırım.

interface: Bu interface'lerin neredeyse hiç anlaşılmadığını biliyorum. Her yerde değişik anlatımlar mevcut. Ama ben size en iyi açıklamayı yapmaya çalışıcam. Öncelikle bunun kullanıldığı tek yer, birçok class'ın aynı metoda sahip olmasını sağlamaktır. Şöyle anlatayım: Mesela siz Oyuncu, Bloklar ve Canavarlar için 3 class oluşturdunuz. Bunların hepsinde de Tanımla() metodu olduğunu düşünün.

enum: Bunu anlatmayı istemezdim aslında. Çünkü pek bir değeri yok. Ne işinizi kolaylaştırır ne de zorlaştırır. Neyse. Enum denilen şey de bir kategoridir. Mesela siz araba çeşitlerini yapabilirsiniz. Şu şekilde:
Kod:
enum arabaÇeşidi {
    FORD_FOCUS, VOLKSWAGEN, HONDAI
}
Bu tanımdan sonra da şöyle kullanılabilir:
Kod:
public String yazıOlarak(arabaÇeşidi arçeş) {
    switch (arçeş) {
        case arabaÇeşidi.FORD_FOCUS:
            return "Ford Focus";
        // Devam ediyor işte
    }
}
Yani eğer kodunuzu düzenlemek isterseniz veya anlaşılır hale getirmek isterseniz kullanabilirsiniz. Ben kullanmam :D

abstract: Bu da interface'in biraz daha gelişmiş hali. Interface içinde hiçbir metodu tanımlayamazsınız. Ama abstract class'larda bazı metodları tanımlayabilir bazılarını tanımlamayabilirsiniz. Yine yukarıdaki Oyuncu, Blok ve Canavar örneğini ele alalım:
Kod:
abstract class oyunObjesi {
    public static abstract void tanımla(); // Abstract metod

    public static String döndür() { // Abstract olmayan metod
        return "Hiçbir şey";
    }
}
İşte bunun gibi. Tabi aslında metod için kullanılmaz bu. Daha çok constructor tanımlayabilmek için kullanılır. Bir gün işinize yararsa anlarsınız.

annotation: İşte en çok sıkıntı oluşturan şey. Bunu neredeyse kimse tam anlayamıyor. Zaten anlamanıza gerek yok. Sadece @Override annotation'unu anlatıp geçeceğim. Çünkü anlatması biraz zor bir konu ve haliyle anlaşılması da. Kafaları çok yormak istemiyorum. Öncelikle "Override" kelimesi üstüne yazmak anlamına gelmez. İşlevi aynıdır aslında ama aynı anlamda değiller. Override, geçersiz kılmak anlamındadır. Mesela yukarıdaki oyunObjesi abstract class'ındaki "döndür()" metodunu bir class'a göre ayarlamak istediniz. O zaman şöyle yaparsınız:
Kod:
@Override
public static String döndür() {
    return "Başka bir şey"
}
Burada @Override, oyunObjesi içindeki döndür() metodunu geçersiz kılar ve yerine bu metodu yazar. Yani ben oyunObjesi.döndür() yazarsam, sadece bu metod bana "Başka bir şey" yazısını döndürür. Amaç da bu zaten. Şimdilik boşverin.

Dosya oluşturma, açma, yazı yazma ve yazı okuma
Bazen bu olaylar gerekli olabilir. Önce oluşturmaya bakalım. 2 Seçeneğiniz var. Ya klasör oluşturursunuz ya da dosya oluşturursunuz. İkisi farklı şeylerdir. İkisini de göstereyim:
Kod:
File klasör = new File("C:/Klasör");
File dosya = new file ("C:/Dosya"); // Dosya.txt, Dosya.pdf, Dosya.dll falan da yazabilirsiniz. Dosyalarda uzantı olabilir.
File çokluklasör = new File("C:/Klasör1/Klasör2");

klasör.mkdir();
dosya.createNewFile();
çokluklasör.mkdirs();
Kısaca klasör oluşturmak için mkdir(), dosya oluşturmak için createNewFile(), klasör içinde klasör oluşturmak için mkdirs() kullanıyoruz. Bu arada createNewFile() metodu IOException verebilir. Çünkü bazı yerlerde dosya oluşturmaya erişiminiz olmaz. System32 klasörü gibi (virüs yapmayın diye :D)


Silmek için de isim.delete(); metodunu kullanabilirsiniz. Bu da yine IOException döndürebilir. Sistem dosyalarını silmeyin diye.

Herhangi bir dosya veya klasörü açmak için ise Desktop kullanabiliriz.
Kod:
File dosya = new File("Dosyanın konumu");
Desktop.getDesktop().open(dosya);
Desktop dediğine bakmayın. Desktop ile alakası bile yok.


Şimdi bir dosyadan yazıyı okuyalım. Bunu Reader ile yapıyorlar normalde. Ama ben en son denediğimde çalışmadı. Daha iyi bir yol buldum ben de :D
Kod:
File dosya = new File("C:/dosya.txt");
Scanner sc = new Scanner(dosya);
String yazı = (sc.hasNextLine()) ? sc.nextLine() : ""; // Eğer satır varsa o satıra eşitle yoksa bir şey yapma
Evet. Bu kadar basit :D "yazı" değişkenimiz artık dosyamızın ilk satırına eşit. Artık istediğinizi yapabilirsiniz. Tabi bu sadece ilk satır için geçerli. Eğer isterseniz ikinci bir değişken oluşturup bir sonraki satırı da ona ayarlayabilirsiniz.


Şimdi ise dosyaya yazı yazalım:
Kod:
String yazılacakYazı = "Yazılacak bu";
File dosya = new File("C:/dosya.txt");
Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(dosya), "utf-8")); 
    // Burada utf-8 nasıl yazılacağını belirtir. Siz utf-8 deyip geçin. 
    // Arapça veya Çince yazı yazmadığınız sürece çalışacaktır :D
writer.write(yazılacakYazı);
writer.close(); // Bu önemli. Bunu yapmazsanız bir dahaki yazacağınız yazı bu dosyada yazana eklenir.
Bu IOException döndürebilir. Yine sistem dosyalarını baştan yazmayın diye. try-catch ile de siz çevrelersiniz :D


Process oluşturma (Komut İstemcisi)
Bazen komut istemcisi ile ilgili şeyler yapmanız gerekebilir. Mesela bir dosyayı gizlemek gibi. Bunun için Runtime'ı kullanacağız.
Kod:
Process pr = Runtime.getRuntime().exec("Komut");
assert pr != null; // Anlatıcam
pr.waitFor(); // Bunu yazdığımızda işlem hemen gerçekleşir. Yazmazsak işlemin bitmesini bekler.
Mesela biz bir dosyayı gizlemek istiyoruz. Hemen yapalım:
Kod:
Process pr = Runtime.getRuntime().exec("attrib +H C:/dosya.txt"); // Komut İstemcisi'nde dosya gizleme komutu
assert pr != null;
pr.waitFor();

Şimdi de yeni bir şey çıktı. Assert. Nedir bu assert? Aslında burada şu demek oluyor: "Eğer pr null'a eşit değilse hata verme. Ama null ise hata ver." Kısaca pr'nin null olmadığına emin oluyoruz. Yoksa waitFor() metodu çalışamaz. Karşılaştırma yapalım:
Kod:
// assert olmasaydı şöyle yapardık
if (pr == null) {
    // Hata vericek işte. Anlayın siz
} else {
    pr.waitFor();
}

// assert'i çevirirsek
assert (şart);
if (!şart) throw new AssertionError();
// Bu ikisi aynı işlevdedir.

Evet. Yine bir bölümün daha sonundayız. İleriki bölüm için aklımda bir plan yok. Belki Swing özelliklerine geçerim. (Yani JFrame, JButton falan)
Umarım yardımcı olur. İyi öğrenmeler :)
 


Son düzenleme:

Ardart

Kızıltaş Madencisi
Mesajlar
550
En iyi cevaplar
0
Beğeniler
763
Puanları
1,180
BeQeN qEçç
güzel konu olmuş, beyandım, anlatımların da iyi, tebrükler :alkış:
 

Üst