Я использую 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-й поток ввода только один раз.
Я проверил, что я получаю несколько потоков в перечислении.
Было бы здорово, если бы кто-то помог мне понять, что здесь происходит.
Да. Я считаю, что это так. Я просто экспериментировал с имеющимися. Похоже, что он возвращает доступный поток потоком, т. Е. Если у нас есть 3 потока, первый раз он вернет доступный() счет только первого потока. И похоже, что ниже по течению от моего кода, который потребляет объект InputReader, прямо вызывает доступность() для извлечения этих байтов. Это кажется мне неправильным. Я приложу обновление, когда найду больше. – Abhishek
Он даже не обязан это делать. Если вы ожидаете, что он вернет общую длину всех потоков, это неправильное использование, которое специально предупреждается в Javadoc. Существует очень мало правильных вариантов использования 'available().' Не используйте его. – EJP
Согласен. Мне довелось проверить библиотеку ниже по течению, которая использует это. Позвольте мне предложить изменить его так, чтобы он не использовался(). Благодарю. – Abhishek