![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
У меня есть одна готовая программа, которая принимает текстовые данные в виде InputStream. Я смотрел код -- внутри она от этого InputStream in формирует new BufferedReader(new InputStreamReader(in)) и потом для получившегося вызывает readLine.
У меня есть вторая программа, которая выдаёттекстовые данные в виде строк String. Мне надо подать выход второй программы на вход первой. Я подумал, что смогу завернуть вторую программу в класс extends InputStream (реализовав метод read) и всё получится. Написал так:
Я думал, что встретив символ новой строки, обёртки потока прекратят чтение до следующего вызова readLine. Но не тут-то было. Судя по отладчику, после того, как этот метод возвращает символ новой строки, он вызывается снова и снова, а возврата из метода readLine не происходит. Судя по всему, какой-то промежуточный слой занимается буферизацией, то есть, где-то считывает, скажем, 1024 символа и уж потом собирается вернуть первую строку. Вопрос -- как этого избежать? Как сделать, чтобы readLine возвращал строки в той же разбивке, в которой я их формирую? Добавлено через 10 минут и 56 секунд P.S. Забыл сказать, что переменная buffer определена так: private StringBuilder buffer = new StringBuilder(); (это член класса, в который я заворачиваю выдающую программу) Это сообщение отредактировал(а) Dims - 18.9.2009, 19:27 |
|||
|
||||
| ivg |
|
|||
![]() Autonomous R&D ![]() ![]() Профиль Группа: Участник Сообщений: 686 Регистрация: 8.2.2006 Где: Екатеринбург Репутация: 33 Всего: 81 |
Код, который принимает вывод у второй программы и запихивает в буфер?
Вобщем решение такое: в топку буфер, первая программа сразу читает вывод второй, т. к. read() - блокирующий вызов. Все нюансы такого чтения в этом самом наследнике InputStream. ? |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Полностью код выглядит так:
Здесь видно, что для получения строки, я должен сделать сначала Result result = recognizer.recognize() а потом result.getBestFinalResultNoFiller() И я получу строку. Как мне это направить на вход? |
|||
|
||||
| ivg |
|
|||
![]() Autonomous R&D ![]() ![]() Профиль Группа: Участник Сообщений: 686 Регистрация: 8.2.2006 Где: Екатеринбург Репутация: 33 Всего: 81 |
Да по всякому можно.
Как то так. Надо ещё определится с концом вывода второй программы. |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Чем это принципиально отличается от того, что у меня? Наверняка то же самое будет происходить.
|
|||
|
||||
| ivg |
|
|||
![]() Autonomous R&D ![]() ![]() Профиль Группа: Участник Сообщений: 686 Регистрация: 8.2.2006 Где: Екатеринбург Репутация: 33 Всего: 81 |
Я предполагал, что вывод второй программы существует в виде InputStream. Во вторых не надо содержимое буфера сдвигать каждый раз. В третьих - если метод recognizer.recognize(); не блокирующий - то код выше тоже в топку и искать способы синхронизации в выводом второй программы. |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
||||
|
||||
| ivg |
|
|||
![]() Autonomous R&D ![]() ![]() Профиль Группа: Участник Сообщений: 686 Регистрация: 8.2.2006 Где: Екатеринбург Репутация: 33 Всего: 81 |
||||
|
||||
| Dims |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Не понимаю, какую это может иметь роль? Функция возвращает строку -- работай с этой строкой. Почему работа происходит неправильно? Я переписал метод вот так (пока фиг с ним со StringBuilder):
а вызов происходит вот так
и я вижу, что сперва выводится куча раз line added in read и только потом начинает выводиться Hello World! Как от этого избавиться? |
||||||
|
|||||||
| Akeem |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 14.7.2006 Где: Киев/Украина Репутация: нет Всего: 3 |
А не проще ли будет сделать как советует сан?
и дальше передавать его. Ну если уж очень сильно хочется, то есть класс StringBufferInputStream -- но он после 1.4.2 обьявлен Deprecated
Это сообщение отредактировал(а) Akeem - 19.9.2009, 09:50 -------------------- Мир огромен и мы только муравьи в нём! (С) formicha |
||||
|
|||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Может и проще, но мне теперь уже непонятна логика происходящего и хочется разобраться.
Если я в качестве потока использую System.in, то всё работает как надо, то есть, readLine читает из потока только одну строку и сразу же её возвращает, как только встретился символ новой строки. Если же я в качестве входного потока даю свой поток, то почему-то readLine не останавливается на первом символе НС, а продолжает читать дальше, пока не заполнит буфер. Естественно, возвращает он в обоих случаях только одну первую строку, но считывает в разных случаях разное. Мне непонятно, почему. И как я могу воспроизвести поведение System.in в своём классе. |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Разобрался.
|
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |