2015-04-28 2 views
2

Я использую SequenceInputStream для объединения нескольких потоков в один поток. Я на JDK8. Ниже приведен код.Конструктор SequenceInputStream только выбирает первый входной поток и игнорирует остальное

private InputStream mergeInputStreams(final Map<String, InputStream> fileAssets, final JSONObject json) throws Exception { 

    final List<InputStream> listStreams = new ArrayList<InputStream>(); 

    listStreams.add(stringToStream(HEADER)); 
    addToList(json, listStreams); 

    listStreams.add(stringToStream(HEADER_2)); 
    addToList(fileAssets.get(FILE_2), listStreams, true); 

    listStreams.add(stringToStream(HEADER_3)); 
    addToList(fileAssets.get(FILE_3), listStreams, false); 

    return new SequenceInputStream(Collections.enumeration(listStreams)); 
} 

private void addToList(final InputStream inputStream, List<InputStream> listStreams, final boolean delimiter) throws Exception { 
    final byte[] input = byteArrayFromStream(inputStream); 
    listStreams.add(intToStream(input.length)); 
    listStreams.add(new ByteArrayInputStream(input)); 
    if (delimiter) { 
     listStreams.add(stringToStream("\n")); 
    } 
} 

private void addToList(final JSONObject json, final List<InputStream> listStreams) throws Exception { 
    final String jsonString = json.toString(); 
    listStreams.add(intToStream(jsonString.length())); 
    listStreams.add(stringToStream(jsonString)); 
} 

Проблема, которую я имею, я всегда получаю первый поток из SequenceInputStream объекта т.е. я просто получить строку HEADER. Я попробовал несколько вариантов, в том числе

new SequenceInputStream(listStreams.get(9), listStreams.get(9)); 

В приведенном выше примере, я пытаюсь объединить тот же вход в два раза. Тем не менее, я все еще получаю 9-й поток ввода только один раз.

Я проверил, что я получаю несколько потоков в перечислении.

Было бы здорово, если бы кто-то помог мне понять, что здесь происходит.

ответ

1

Он будет читать первый поток до конца потока, затем второй и т. Д. Возможно, это не то, что вы ожидаете? Это также означает, что вы не можете предоставить один и тот же поток дважды, поскольку он будет уже полностью прочитан при первом использовании.

Я не вижу, какие конструкторы имеют к этому отношение.

+0

Да. Я считаю, что это так. Я просто экспериментировал с имеющимися. Похоже, что он возвращает доступный поток потоком, т. Е. Если у нас есть 3 потока, первый раз он вернет доступный() счет только первого потока. И похоже, что ниже по течению от моего кода, который потребляет объект InputReader, прямо вызывает доступность() для извлечения этих байтов. Это кажется мне неправильным. Я приложу обновление, когда найду больше. – Abhishek

+1

Он даже не обязан это делать. Если вы ожидаете, что он вернет общую длину всех потоков, это неправильное использование, которое специально предупреждается в Javadoc. Существует очень мало правильных вариантов использования 'available().' Не используйте его. – EJP

+0

Согласен. Мне довелось проверить библиотеку ниже по течению, которая использует это. Позвольте мне предложить изменить его так, чтобы он не использовался(). Благодарю. – Abhishek

0

Вот что мы имеем:

  1. Создать sequenceinputstream объект 's' от 'п' потоков
  2. загрузки 's' в S3, используя внешнюю библиотеку. lib.uploadToS3 (ы)

Вопрос: Библиотека третьей стороны uploadToS3 (поток) вызов был использование stream.available(), чтобы инициализировать массив буфера, и он заполнял его из потока и загрузки.

Похоже, что SequenceInputStream.available() (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/io/SequenceInputStream.java) возвращает доступные() из текущего потока, итерации. например в контексте lib.uploadToS3() он использовал доступный() из самого первого потока в последовательности.

Что мы исправили: Мы исправили библиотеку использовать IOUtils.copy() вместо того, чтобы писать код копирования, которая опирается на имеющийся().

+0

Молодец. Я по-прежнему считаю невероятным, что люди будут использовать 'available()' за то, что Javadoc говорит вам не использовать его. – EJP

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