2016-04-14 11 views
2

içeriğini değiştirerek bir inputStream'i yeniden kullanmak için zaten var mı? (Yeni ifade olmadan). Örneğin

, çok benim yakın gereksinim, ama SequenceInputStream kullanıyorum Aşağıdaki kodda

yeterli değil ve her şey o dizisine yeni bir InputStream ekliyorum şey başardı.

Ancak aynı inputStream (InputStream uygulamasının hangisi olduğu umurumda değil) kullanarak aynı şeyi yapmak istiyorum.

Mark()/reset() API'lerini düşündüm, ancak okunacak içeriği değiştirmem gerekiyor.Java I/O - InputStream Nesnesini Yeniden Kullan

yeni inputStream kreasyonlarını önlemek için bir fikir çünkü tek yönlü olarak, yani olduğu gibi

 //Input Streams 
    List<InputStream> inputStreams = new ArrayList<InputStream>(); 
    try{ 
     //First InputStream 
     byte[] input = new byte[]{24,8,102,97}; 
     inputStreams.add(new ByteArrayInputStream(input)); 

     Enumeration<InputStream> enu = Collections.enumeration(inputStreams); 
     SequenceInputStream is = new SequenceInputStream(enu); 

     byte [] out = new byte[input.length]; 
     is.read(out); 

     for (byte b : out){ 
      System.out.println(b);//Will print 24,8,102,97 
     } 

     //Second InputStream 
     input = new byte[]{ 4,66}; 
     inputStreams.add(new ByteArrayInputStream(input)); 
     out = new byte[input.length]; 
     is.read(out); 

     for (byte b : out){ 
      System.out.println(b);//will print 4,66 
     } 
     is.close(); 
    }catch (Exception e){// 
    } 
+0

'Vector'! 21. yüzyıldayız! –

+1

'Vector' yerine' ArrayList 'düşünün, bu performanstan kazanacaksınız – Andrew

+0

@AndrewTobilko bundan emin misiniz? https://en.wikipedia.org/wiki/Java_performance#Escape_analysis_and_lock_coarsening, Java 6+ 'da gerekmedikçe kilitlenmeyen' Vector 'örneğini özellikle belirtir. Tabi ki bu, kilitlemenin gereksiz olduğunu tespit eden kaçış analizine dayanır; 'ArrayList' kullanarak, hiçbir kilitleme yapılmadığı anlamına gelir (açıkça yapılmadıkça), böylece performans üzerinde daha fazla kontrole sahip olursunuz. –

cevap

0

Sen ne gerektirir izin verecek InputStream kendi uygulaması (alt sınıf) yaratabilir. Bunun mevcut bir uygulaması olduğundan şüpheliyim.

Bu konuda ölçülebilir bir performans artışı elde edeceğinizden kuşkuluyum. Ancak, örn. FileInputStream, yine de performans göstermeniz gerekmeyecek ve Java, kısa ömürlü nesneleri çöp toplama için çok iyi optimize etti.