2013-07-05 6 views
14

diğer akışlarına kıyasla avantajları ve kullanım ne vardır.Java: FilterInputStream Ben inputStream</em>, <em>FileInputStream</em>, <em>ByteArrayInputStream</em> ve bunların kullanım (çok çıkış akışları) oldukça açık görünüyor nasıl <em>okuma oldum

  • diğer akışı sınıflara kıyasla kullanmanın avantajı nedir: Ben mücadele ediyorum ne

    FilterInputStream & FilterOutputStream kullanımını anlamaktır?

  • Ne zaman kullanmalıyım?
  • Lütfen teorik bir açıklama ve temel bir örnek verin. yapıcı protected olduğu

cevap

18

FilterInputStream Bu sınıf genişletilmelidir the Decorator pattern.

bir örneğidir. Türetilmiş sınıf ek özellikler ekleyecektir, ancak yine de InputStream'un temel arayüzünü ortaya çıkarır. Örneğin, BufferedInputStream bir BufferedInputStream, okuma verilerini daha hızlı yapmak için temel giriş akışının tamponlanmasını sağlar ve DigestInputStream, tüketildiği haliyle bir şifreleme karması bilgisini hesaplar.

Bunu, InputStream veya OutputStream API'ye bağlı olarak varolan kodlara işlevsellik eklemek için kullanırsınız. Örneğin, verileri OutputStream'a kaydeden bir kitaplık kullandığınızı varsayalım. Veriler çok büyüyor, bu yüzden sıkıştırma eklemek istiyorsunuz. Veri kalıcılık kitaplığını değiştirmek yerine, uygulamanızı şu anda oluşturduğu akışı "ZipOutputStream" ile "çözer" şeklinde değiştirebilirsiniz. Kütüphane, sıkıştırmayı olmayan eski sürümü kullandığı gibi akışı kullanacaktır.

+0

Tamam, ancak BufferedInputStream ve DigestInputStream aslında temel akışla bir şeyler yapar. FilterInputStream ne yapar? – ed22

3

Veri akışını dekore etmek istediğinizde bunları kullanırsınız.

Bu akış sınıfı örneklerinin kendilerini başka bir akış örneğinin etrafına sardıklarını (bunlardan birinin alt sınıfının başka bir alt sınıfı olsun) ekleyeceğini ve bazı özellik eklediğini, biraz işlem eklediğini, verilerin geçtiği sırada bazı değişiklikler yaptıklarını unutmayın. Örneğin, bazı akışlardan tüm çoklu alanları kaldırmak isteyebilirsiniz. Kendi FilterInputStream alt sınıfınızı yapar ve read() yöntemini geçersiz kılarsınız. Ben alt sınıfta yöntemi için bazı sorta-java tüm ayrıntıları rahatsız edecek ama burada değilim:

private boolean lastWasBlank = false; 
public int read() { 
    int chr = super.read(); 
    if (chr == ' ') { 
     if (lastWasBlank) { 
      return read(); 
     } else { 
      lastWasBlank = true; 
     } 
    } else { 
     lastWasBlank = false; 
    } 
    return chr; 
} 

Gerçek hayatta, olur muhtemelen çok diğer iki read() yöntemlerle karışıklık.

Diğer kullanımlar: akışı iki şekilde ele alınır okunduğunu böylece

  • Günlüğü herşeyi akışına
  • akan 'tee' programı çoğaltın.
  • Windows, Mac ve Unix/Linux biçimleri arasındaki satır sonlarını dönüştürme
  • Modemler veya seri bağlantı noktaları veya kablosuz ağ bağlantıları gibi yavaş iletim yöntemlerini simüle etmek için gecikmeler ekleyin.
+0

FilterInputStream, verileri filtreleyen ve "işaret", "kullanılabilir" vb. Doğru bir şekilde destekleyen bir akışı gerçekleştirmeye yardımcı olmak için hiçbir şey yapmaz. Giriş akışı düzenleyicisinin gerçekten uygulanmasına yardımcı olacak bir temel sınıftan haberiniz var mı? –

İlgili konular