Soru BufferedOutputStream'in amacı nedir?


BufferedOutputStream'in amacı, bunu kullanırken performans kazancı mı merak ediyorum?


17
2018-04-06 05:22


Menşei


Büyük miktarda veri parçaları yazıyorsanız, örn. 8K veya daha fazla, performansa biraz zarar verebilir (bir BufferedOutputStream bir BufferedOutputStream etrafında sarılacak gibi) - Peter Lawrey


Cevaplar:


İşte hat BufferedOutputStream API'sı:

Sınıf bir tamponlanmış çıktı akışı uygular. Böyle bir çıktı akışını kurarak, bir uygulama temel çıktı akışına byte yazabilir olmadan her bir byte için yazılı sisteme çağrı yapılmasına sebep olur.

Tampon içindeki işlemlerin çoğunu altta yatan sisteme çağrı yapmadan yapabilir.

Örneğin, dosyaya yazmayı düşünün: arabellek olmaksızın, her bayt için bir sistem çağrısı yapmak zorundadır, ki bu açıkça yavaştır.


16
2018-04-06 05:26



"arabellek olmadan, her bir bayt için sabit diske erişmesi gerekir" ifadesi büyük olasılıkla yanlıştır - Raedwald
@Raedwald bundan emin değilim. Java API'dan "OutputStream'in yazma yöntemi, yazılacak her bir bayt üzerindeki bir argümanın yazma yöntemini çağırır. Alt sınıflar, bu yöntemi geçersiz kılacak ve daha verimli bir uygulama sağlamaya teşvik edilecektir." - akgren_soar
Tek bir bayt çıktı yöntemini çağırmak, tek bir disk yazmasına neden olmaz. İşletim sistemi arabellek yazacak. - Raedwald
@Raedwald, var "sahip" değil, ama "olabilir". - bvdb
Java tamponlu çıktı akışının tam amacı, disk I / O basıncını azaltmak değil, çok maliyetli olan write () syscall çağrısının sıklığını azaltmaktır. OS sayfası önbelleğinin varlığı nedeniyle, tamponlanmış çıktı akışını kullanarak performansta büyük bir fark yoktur. - ryan_tu


Adından da anlaşılacağı gibi, BufferOutputStream dahili bir arabellek (byte[]) Her bir küçük yazının içeriklerinin ilk kopyalanması. Altta yatanlara yazılır. OutputStream arabellek dolduğunda veya akış temizlendiğinde veya akış kapatıldığında. Her yazım işlemi için altta yatan (nispeten büyük) sabit bir yük varsa, bu büyük bir fark yaratabilir. OutputStream, için olduğu gibi FileOutputStream (bir işletim sistemi çağrısı yapmalı) ve birçok sıkıştırılmış akış.

Aynı zamanda, birçok akış tabanlı kitaplık kendi tamponlarını (XML ve JSON yazarları gibi) kullanır ve BufferedOutputStream hiçbir fayda sağlamaz. Fakat kendi ek yükü nispeten düşüktür, bu yüzden fazla risk yoktur.


8
2018-04-06 05:28





BufferedOutputStream, bir arabelleğe yazılacak değerleri depolayarak ve arabellek dolduğunda veya flush () yöntemi çağrıldığında aslında bunları yazarak verimliliği arttıran çıktı veri arabelleği sağlar.


3
2018-04-06 05:27





Java BufferedOutputStream sınıfı, bir çıkış akışının tamponlanması için kullanılır. Verileri depolamak için dahili olarak arabellek kullanır. Verileri doğrudan bir akışa yazmaktan daha fazla verimlilik katıyor. Yani, performansı hızlı hale getirir.


0
2017-07-25 06:35