2016-04-14 3 views
2

есть в любом случае, чтобы повторно использовать inputStream, изменив его содержимое? (Без нового утверждения).

Например, я был в состоянии что-то очень близко к моему требованию, но не достаточно

В следующем коде я использую SequenceInputStream, и каждый раз, когда я добавляю новую InputStream в этой последовательности.

Но я хотел бы сделать то же самое, используя тот же входной поток (мне все равно, какая реализация InputStream).

Я думал о API-интерфейсах mark()/reset(), но мне все равно нужно изменить содержимое для чтения.Java I/O - Повторное использование объекта InputStream

Идея, чтобы избежать новых InputStream творений из-за проблем с производительностью

 //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

'Вектор'! Мы в 21 веке! –

+1

считать 'ArrayList' вместо' Vector', вы выиграете на производительности – Andrew

+0

@AndrewTobilko вы в этом уверены? https://en.wikipedia.org/wiki/Java_performance#Escape_analysis_and_lock_coarsening специально ссылается на пример «Вектор», который не блокируется, если это необходимо в Java 6+. Конечно, это зависит от анализа побега, обнаруживающего, что блокировка не нужна; использование 'ArrayList' означает, что никакая блокировка никогда не выполняется (если только не сделано явно), поэтому у вас больше контроля над производительностью. –

ответ

1

Нет, Вы не можете перезапустить чтение входного потока после того, как она доходит до конца потока, как это однонаправленный т.е. перемещается только в одном направлении.

Но смотрите ниже ссылки, они могут помочь:

How to Cache InputStream for Multiple Use

Getting an InputStream to read more than once, regardless of markSupported()

0

Вы можете создать свою собственную реализацию (подкласс) из InputStream, который позволил бы, что вам нужно. Я сомневаюсь, что существует существующая реализация этого.

Я очень сомневаюсь, что вы получите какое-то измеримое повышение производительности, хотя в логике, например, не так много логики. FileInputStream, что вам не нужно будет выполнять в любом случае, а Java хорошо оптимизирован для сбора короткоживущих объектов, занимающихся сбором мусора.

Смежные вопросы