SORU
7 Mayıs 2011, CUMARTESİ


Nasıl bir İnputStream clone?

Bazı işlemleri yapmak için bir yöntem önünden geçtiğim bir İnputStream. Diğer bir yöntem, aynı İnputStream kullanacağım, ama ilk işledikten sonra, İnputStream görünür yöntemi içinde kapatılacak.

Bu İnputStream onu kapatır bu yöntemi göndermek için klon nasıl yapabilirim? Başka bir çözüm var mı?

EDİT: İnputStream harici bir yöntemdir kapatan yöntemlerden bir lib. Ben kapanış değil tek bir kontrol var.

private String getContent(HttpURLConnection con) {
    InputStream content = null;
    String charset = "";
    try {
        content = con.getInputStream();
        CloseShieldInputStream csContent = new CloseShieldInputStream(content);
        charset = getCharset(csContent);            
        return  IOUtils.toString(content,charset);
    } catch (Exception e) {
        System.out.println("Error downloading page: "   e);
        return null;
    }
}

private String getCharset(InputStream content) {
    try {
        Source parser = new Source(content);
        return parser.getEncoding();
    } catch (Exception e) {
        System.out.println("Error determining charset: "   e);
        return "UTF-8";
    }
}

CEVAP
7 Mayıs 2011, CUMARTESİ


Eğer tüm istediğin okuyun aynı bilgileri birden fazla kez, ve giriş verilerinin yeterince küçük uygun bellek, kopyalama veri InputStream ByteArrayOutputStream.

Sonra bayt ilişkili dizi elde edilir ve pek çok "gibi" ByteArrayInputStreams. klonlanmış gibi açabilirsiniz

ByteArrayOutputStream baos = new ByteArrayOutputStream();

// Fake code simulating the copy
// You can generally do better with nio if you need...
// And please, unlike me, do something about the Exceptions :D
byte[] buffer = new byte[1024];
int len;
while ((len = input.read(buffer)) > -1 ) {
    baos.write(buffer, 0, len);
}
baos.flush();

// Open new InputStreams using the recorded bytes
// Can be repeated as many times as you wish
InputStream is1 = new ByteArrayInputStream(baos.toByteArray()); 
InputStream is2 = new ByteArrayInputStream(baos.toByteArray()); 

Ama eğer gerçekten özgün akış açık tutmak için yeni veri almak gerekiyorsa, o zaman close() Bu harici bir yöntem izlemek ve bir şekilde adlı önlemek gerekir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kingsimba357

    Kingsimba357

    7 NİSAN 2008
  • Murray Winiata

    Murray Winia

    2 ŞUBAT 2009
  • SignatureSeries

    SignatureSer

    24 Aralık 2006