- Konu sahibi
- #1
Java’da bir dosya oluşturmanın en güvenli ve modern yolu,
Aşağıdaki örnek, çalıştırıldığı konumdaki
Bu kodda
Önemli:
Dosyanın belirli bir klasörde oluşmasını istiyorsanız yolu açıkça belirtin:
Dosyanın boş kalmasını istemiyorsanız önce dosyayı oluşturup sonra
Bu örnekte ayrıca
Dosya mutlaka önceden oluşturulsun ve varsa üzerine yazılmasın istiyorsanız iki işlemi ayrı yapabilirsiniz:
Burada
Dosya oluşturma yöntemi, mevcut dosyanın korunup korunmayacağına göre değişir:
Bu ayrım önemlidir; çünkü “dosya yoksa oluştur” ile “mutlaka yeni dosya oluştur” aynı davranış değildir. Günlük, kayıt veya rapor dosyasına yeni satır eklemek istiyorsanız mevcut içeriğin üzerine yazmamalısınız:
İşlemden sonra
Bu kontrolün başarılı olması, uygulamanın dosyayı oluşturma yolunda bir dosya bulunduğunu gösterir; dosyanın içeriğinin doğru olduğunu veya uygulamanın daha sonra bu dosyaya erişebileceğini tek başına kanıtlamaz. İçeriği de doğrulamak istiyorsanız dosyayı
Dosya zaten var:
Üst klasör bulunamadı: Dosya yolunda klasörler belirtilmiş ancak bu klasörler yoksa önce
Erişim reddedildi: Bu durum genellikle hedef klasöre yazma izni olmadığını, yolun salt okunur olduğunu veya başka bir programın dosyayı kilitlediğini gösterir. Önce hata mesajındaki yolu
Yol yanlışsa: Göreli yol kullandığınızda dosya, kaynak kodun bulunduğu klasörde değil, Java programının çalışma dizininde oluşabilir. Mutlak yolu yazdırarak gerçek konumu görün ve gerekiyorsa
java.nio.file.Files sınıfındaki createFile() metodunu kullanmaktır. Dosyanın oluşturulacağı yolu Path ile belirtirsiniz; işlem başarılı olursa dosya diskte oluşur, dosya zaten varsa FileAlreadyExistsException alınır. Dosyayı oluşturduktan sonra aynı Path üzerinden içine veri yazabilir, okuyabilir veya dosyanın gerçekten oluştuğunu kontrol edebilirsiniz.Boş bir dosya oluşturma
Aşağıdaki örnek, çalıştırıldığı konumdaki
ornek.txt adlı boş dosyayı oluşturur:
Java:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class DosyaOlustur {
public static void main(String[] args) {
Path dosyaYolu = Path.of("ornek.txt");
try {
Path olusturulanDosya = Files.createFile(dosyaYolu);
System.out.println("Dosya oluşturuldu: " + olusturulanDosya.toAbsolutePath());
} catch (IOException e) {
System.err.println("Dosya oluşturulamadı: " + e.getMessage());
}
}
}
Bu kodda
Path.of("ornek.txt") göreli bir yol oluşturur. Göreli yol, dosyanın Java programının geçerli çalışma dizininde aranacağı anlamına gelir. Program başarıyla çalıştığında ekrana dosyanın mutlak yolu yazdırılır; böylece dosyanın hangi klasörde oluşturulduğunu görebilirsiniz.Önemli:
Files.createFile() yalnızca dosyanın kendisini oluşturur. Dosyanın bulunacağı üst klasörler yoksa klasörleri otomatik olarak oluşturmaz.Belirli bir klasörde dosya oluşturma
Dosyanın belirli bir klasörde oluşmasını istiyorsanız yolu açıkça belirtin:
Java:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class DosyaOlustur {
public static void main(String[] args) {
Path dosyaYolu = Path.of("veriler", "rapor.txt");
try {
Files.createDirectories(dosyaYolu.getParent());
Files.createFile(dosyaYolu);
System.out.println("Dosya oluşturuldu: " + dosyaYolu.toAbsolutePath());
} catch (IOException e) {
System.err.println("İşlem başarısız: " + e.getMessage());
}
}
}
Path.of("veriler", "rapor.txt") işletim sistemine uygun biçimde veriler/rapor.txt yolunu oluşturur. Files.createDirectories() eksik olan veriler klasörünü oluşturur; klasör zaten varsa hata vermeden devam eder. Ardından Files.createFile() boş rapor.txt dosyasını oluşturur.getParent() burada dosyanın üst klasörünü, yani veriler klasörünü verir. Yalnızca dosya adı kullanıldığında, örneğin Path.of("rapor.txt") yazıldığında üst klasör bulunmayabileceği için createDirectories() çağrısını koşula bağlamak gerekir. Ancak dosya yolu bir klasör içeriyorsa yukarıdaki kullanım uygundur.Dosyayı oluştururken içine metin yazma
Dosyanın boş kalmasını istemiyorsanız önce dosyayı oluşturup sonra
Files.writeString() ile metni yazabilirsiniz:
Java:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class MetinDosyasiOlustur {
public static void main(String[] args) {
Path dosyaYolu = Path.of("notlar.txt");
String icerik = "Java ile oluşturulan ilk dosya.";
try {
Files.writeString(dosyaYolu, icerik);
System.out.println("Dosya yazıldı: " + dosyaYolu.toAbsolutePath());
} catch (IOException e) {
System.err.println("Dosyaya yazılamadı: " + e.getMessage());
}
}
}
Bu örnekte ayrıca
createFile() çağrılmamıştır. Files.writeString(), dosya yoksa dosyayı oluşturur ve metni yazar. Dosya zaten varsa varsayılan davranış mevcut içeriğin üzerine yazmaktır. Bu nedenle mevcut dosyanın korunması gerekiyorsa yazma seçeneğini açıkça belirlemelisiniz.Dosya mutlaka önceden oluşturulsun ve varsa üzerine yazılmasın istiyorsanız iki işlemi ayrı yapabilirsiniz:
Java:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class YeniDosyaOlustur {
public static void main(String[] args) {
Path dosyaYolu = Path.of("sadece-yeni.txt");
try {
Files.createFile(dosyaYolu);
Files.writeString(dosyaYolu, "Bu dosya daha önce mevcut değildi.");
System.out.println("Yeni dosya oluşturuldu ve yazıldı.");
} catch (java.nio.file.FileAlreadyExistsException e) {
System.err.println("Dosya zaten var; mevcut içerik değiştirilmedi.");
} catch (IOException e) {
System.err.println("Dosya işlemi başarısız: " + e.getMessage());
}
}
}
Burada
FileAlreadyExistsException özellikle yakalanmıştır. Bu sonuç, dosyanın oluşturulamadığı anlamına gelir; ancak genel bir sistem hatası olduğu anlamına gelmez. Dosyanın zaten var olduğunu gösterir ve mevcut içerik korunur. Programın amacı mevcut dosyayı güncellemekse bu durumda writeString() veya ekleme seçeneğiyle farklı bir yol izlemelisiniz.Dosyanın durumuna göre doğru yöntemi seçme
Dosya oluşturma yöntemi, mevcut dosyanın korunup korunmayacağına göre değişir:
| İhtiyaç | Uygun işlem | Dosya zaten varsa |
|---|---|---|
| Yalnızca yeni ve boş dosya oluşturmak | Files.createFile() | FileAlreadyExistsException oluşur |
| Dosya yoksa oluşturup metin yazmak | Files.writeString() | Varsayılan olarak mevcut içerik değiştirilir |
| Mevcut metnin sonuna ekleme yapmak | StandardOpenOption.CREATE ve APPEND | İçerik korunur, yeni metin sona eklenir |
| Dosya oluşturmadan önce klasörleri hazırlamak | Files.createDirectories() | Mevcut klasörler korunur |
Java:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
public class DosyayaEkle {
public static void main(String[] args) {
Path dosyaYolu = Path.of("uygulama.log");
try {
Files.writeString(
dosyaYolu,
"Yeni kayıt\n",
StandardOpenOption.CREATE,
StandardOpenOption.APPEND
);
System.out.println("Kayıt dosyaya eklendi.");
} catch (IOException e) {
System.err.println("Kayıt eklenemedi: " + e.getMessage());
}
}
}
CREATE dosya yoksa dosyayı oluşturur, APPEND ise yeni metni mevcut içeriğin sonuna ekler. Bu kodu her çalıştırdığınızda önceki kayıtlar silinmez. Buna karşılık dosyanın her çalıştırmada baştan yazılması isteniyorsa APPEND kullanılmamalıdır.Dosyanın gerçekten oluştuğunu kontrol etme
İşlemden sonra
Files.exists() ile yol üzerinde bir dosya veya klasör bulunup bulunmadığını kontrol edebilirsiniz. Dosyanın özellikle normal bir dosya olduğunu doğrulamak için Files.isRegularFile() daha anlamlıdır:
Java:
Path dosyaYolu = Path.of("ornek.txt");
if (Files.exists(dosyaYolu) && Files.isRegularFile(dosyaYolu)) {
System.out.println("Dosya mevcut: " + dosyaYolu.toAbsolutePath());
} else {
System.out.println("Bu yolda normal bir dosya bulunamadı.");
}
Bu kontrolün başarılı olması, uygulamanın dosyayı oluşturma yolunda bir dosya bulunduğunu gösterir; dosyanın içeriğinin doğru olduğunu veya uygulamanın daha sonra bu dosyaya erişebileceğini tek başına kanıtlamaz. İçeriği de doğrulamak istiyorsanız dosyayı
Files.readString() ile okuyup beklediğiniz metinle karşılaştırmanız gerekir.Hata alırsanız neyi kontrol etmelisiniz?
Dosya zaten var:
FileAlreadyExistsException alırsanız oluşturma yolu üzerinde aynı adla bir dosya bulunuyordur. Mevcut dosyayı koruyacaksanız hatayı yakalayıp başka bir ad kullanın; üzerine yazmak veya sonuna eklemek istiyorsanız writeString() seçeneklerini amaca göre değiştirin.Üst klasör bulunamadı: Dosya yolunda klasörler belirtilmiş ancak bu klasörler yoksa önce
Files.createDirectories(dosyaYolu.getParent()) çağrısını yapın. Klasör yoluna yazma yetkiniz yoksa klasör oluşturma yine başarısız olur.Erişim reddedildi: Bu durum genellikle hedef klasöre yazma izni olmadığını, yolun salt okunur olduğunu veya başka bir programın dosyayı kilitlediğini gösterir. Önce hata mesajındaki yolu
toAbsolutePath() ile netleştirin ve uygulamanın gerçekten beklediğiniz klasöre yazmaya çalıştığını doğrulayın. Sorun izinle ilgiliyse dosyayı yazma yetkinizin bulunduğu bir klasöre taşıyın; sunucu uygulamasında ise işlemi çalıştıran kullanıcı hesabının hedef klasöre yazma iznini düzenleyin.Yol yanlışsa: Göreli yol kullandığınızda dosya, kaynak kodun bulunduğu klasörde değil, Java programının çalışma dizininde oluşabilir. Mutlak yolu yazdırarak gerçek konumu görün ve gerekiyorsa
Path.of("C:", "uygulama", "veriler", "ornek.txt") gibi açık bir yol veya yapılandırmadan gelen bir hedef kullanın. Windows yollarında ters bölü işaretlerini Java dizelerinde kaçış karakteri olarak kullanmanız gerektiğini unutmayın; Path.of() ile yol parçalarını ayrı vermek bu hatayı azaltır.