Programlar genellikle verileri bir dosyaya veya başka bir yere hızlı bir şekilde yazma gereksinimi içerir. Bu da şu soruları gündeme getiriyor: Bunu nasıl yapmalıyız? Hangi sınıfı seçmeliyiz? Bugün bu rol için uygun bir aday olan BufferedWriter sınıfını tanıyacağız .

Neden BufferedWriter'a ihtiyacımız var?

BufferedWriter, tamponlanmış karakterleri bir akışa yazan bir sınıftır. Fiziksel ortama erişim sayınızı azaltmanıza olanak tanır. Yani, her seferinde tek bir karakter yazmak yerine, verileri bir arabelleğe yazar ve ardından tüm karakterleri bir kerede ortama yazar.

Bu, yazma hızlarını büyük ölçüde artırır. Varsayılan arabellek boyutu 8192 karakterdir, ancak bu, yapıcıda yeni bir boyut belirtilerek değiştirilebilir:

BufferedWriter(Writer in, int sz)

Burada yapıcının ilk argümanı yazdığımız veriyi alacak olan bir akıştır. Ve sz'nin yeni tamponun boyutu olduğu ortaya çıktı .

Java ayrıca bir BufferedReader sınıfına sahiptir: verileri arabelleğe almak için kullanılır.

Bir tampon tam olarak nedir? Gerçek hayattan bir örnek alalım. Tampon, bir süpermarketteki sepet veya alışveriş sepeti gibidir. Tek bir ürünle kasaya gidip parasını ödeyip arabanızın bagajına koyup sonra başka bir ürün için geri gelmek yerine, bir alışveriş sepeti alıp içine istediğimiz her şeyi koyabilir ve sonra ödeme yapabiliriz. kasada. Bir arabellek tam olarak böyle çalışır: verileri toplar ve ardından her bir parçayı ayrı ayrı yazmak yerine her şeyi alır ve yazar.

BufferedWriter sınıfının yapıcıları ve yöntemleri

Şimdi BufferedWriter sınıfına daha yakından bakalım . Bir nesne oluşturmak için iki yapıcı vardır:

public BufferedWriter(Writer out)
public BufferedWriter(Writer out, int sz)

Her iki kurucuda da out yazılacak akıştır ve sz daha önce de belirtildiği gibi tamponun boyutudur.

BufferedWriter sınıfının ayrıca birkaç yöntemi vardır. Bugün bunlardan bazılarına daha yakından bakacağız:

yaz(char[] dizisi) arabelleğe bir karakter dizisi yazar
write(String s, int kapalı, int len) Bir dizgenin bir kısmını tampona yazar
ekle(char c) ara belleğe bir karakter yaz
append(CharSequence csq, int başlangıç, int bitiş) Bir dizinin bir kısmını tampona yazar
Yeni hat() Satır ayırıcı yazar
floş() Akışı temizler

Bir dosyaya değer yazacak bir program yazalım. İçinyazarparametre, birDosya Yazarıyapıcıya. Metin dosyaları yazmak için kullanılır ve nesneleri başlatmak için birkaç kurucuya sahiptir:

FileWriter(Dosya dosyası)
FileWriter(Dosya dosyası, boole ekleme)
FileWriter(FileDescriptor fd)
FileWriter(Dize dosyaAdı)
FileWriter(Dize dosyaAdı, boole ekleme)

Örneğimiz için, dosya adı alan bir oluşturucu kullanacağız:

try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))){

	String message = "Hello, Amigo! This is a very important message!";
	bufferedWriter.write(message);
	bufferedWritter.flush();
}
catch(IOException ex){
System.out.println(ex.getMessage());
 }

Kodumuz file.txt dosyasına str yazmak için write(String str) yöntemini kullanacaktır .

Yazmak için başka yöntemler de vardır:

  • write(char[] array ) — bu varyant bir char dizisini kabul eder ve yazar;

  • write(String s, int off, int len) — bu değişken bir s dizisi alır ; yazmaya başlanacak karakterin dizini olan bir ofset kapalı ; ve yazılacak dizenin (alt dize) uzunluğu olan len .

try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))){
	String message = "Hello, Amigo! This is a very important message!";
	bufferedWriter.write(message, 0, 11);
 	bufferedWriter.flush();

} catch(IOException ex) {
System.out.println(ex.getMessage());
}

Yönteme index 0'dan başlayarak 11 karakter yazmasını söylediğimiz için bu kod dosyaya "Hello, Amig" yazacaktır.

Kodumuzun ayrıca bir try-with kaynakları bloğu vardır:

try(BufferedWriter bufferedWritter = new BufferedWriter(new FileWriter("file.txt")))

Bu, close() yönteminin benim cihazımda otomatik olarak çağrıldığı anlamına gelir.arabelleğe alınmış yazarnesne, çünkü AutoCloseable arabirimini uygular .

Koddaki flush() yöntemi, çıktı akışını boşaltmak için kullanılır ve arabelleğe alınan tüm baytları yazılmaya zorlar . Yazma, arabelleğin temizlenmesi gerektiğini ve arabelleğe alınan baytların yazılması gerektiğini gösterdiğinden, bu çağrı olmadan gerçekleşmeyebilir.

BufferedWriter sınıfı , mesajımıza yeni bir satır ekleyen bir newLine() yöntemine de sahiptir :

try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))) {
        String message = "Hello, Amigo! This is a very important message!";
        bufferedWriter.write(message, 0, 13);
        bufferedWriter.newLine();
        bufferedWriter.write(message, 15, 33);
    } catch (IOException ex) {
        System.out.println(ex.getMessage());
    }

Dosyada şunları elde ederiz:

Merhaba Amigo!
Bu çok önemli bir mesaj!

append() yönteminin imzası şöyle görünür:

public Writer append(CharSequence csq, int start, int end)

csq eklemek için kullanılır . Burada başlangıç , ilk karakterin indeksidir ve bitiş , eklenecek dizgenin (veya alt dizginin) son karakterinin dizinidir. Dizin sonu olan karakter eklenmez.

try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))) {
    String message = "Hello, Amigo! This is a very important message!";
    bufferedWriter.append(message, 0, 7);
    bufferedWriter.flush();
} catch (IOException ex) {
    System.out.println(ex.getMessage());
}

Bu kod size şunları verecektir:

Merhaba,

Yani, append yöntemiyle, dizenin hangi bölümünün tampona ekleneceğini belirtirsiniz.

write() ve append() arasındaki farka daha yakından baktığımızda , ilk olarak ikisinin de prensipte aynı şeyi yaptığını görürüz - değerler yazarlar.

Bununla birlikte, fark, append yönteminin daha yeni olması ve bağımsız değişken olarak bir CharSequence almasıdır ve String , CharSequence öğesini uyguladığı için, append yöntemine Strings ve StringBuilders ve StringBuffers iletebiliriz . Ancak write() yöntemi yalnızca bir String kabul eder .

Şimdilik bu kadar! Bugün arabellekler, bir dosyaya ara belleğe yazmanın nasıl yapılacağı ve bunu yapmak için kullanabileceğiniz yöntemler hakkında bilgi sahibi olduk.