Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
fejin

Чтение из потока

27.03.2013, 18:30. Показов 3799. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Программированием на java занялся недавно и столкнулся со следующей проблемой которую не удается разрешить.

Суть следующая, я запускаю поток в котором запускается процесс - это команда ping с параметром -t. т.е. пинг идет постоянно.

Дальше методом raeadLine класс BufferedReader считывается ответ этой команды в строку. Производится анализ строки (был ли получен ответ, время мс, но интересует на данный момент только вопрос достижтмости) и результат должен записывается в лог файл. Причем записываться должен в случае смены события. В частности если хост пропал, т.е. пинг потерялся, в лог пишется что DOWN, если пинг появился то UP.

реализованно это следующим способом:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
File aFile = new File(inPath);                                               // inPath - путь к лог файлу
String[] command = new String[]{ "ping ","-t ",strIpAddress};  // strIpAddress - адрес пингуемой машины 
 
ProcessBuilder pb = new ProcessBuilder(command);
 
Process process = pb.start();
 
BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream()));
 
while ((s = stdInput.readLine()) != null) {
 
    String str = new String(s.getBytes("Cp1251"),"Cp866");  //преобразование строки
 
    FileWriter file = new FileWriter(aFile, true);
 
    SimpleDateFormat formatDate = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
    String date = formatDate.format(new Date());
 
    if (str.indexOf("Ответ") != -1) {
 
        hostStateNew1 = true;
        hostStateOld = hostStateNew1;
        System.out.println(strIpAddress+" is UP "+date);
           }
 
    if (!hostStateNew1 && hostStateOld) {
 
           file.write("запись в лог файл DOWN");
           }
 
    if (hostStateNew1 && !hostStateOld) {
 
           file.write("запись в лог файл UP");
           }
 
        while ((s = stdError.readLine()) != null) { 
        System.out.println(s);
    }
 
    stdInput.close();
    file.close();
 
}
Так вот проблема следующая. Данные не записываются в лог файл. Такое впечатление что идет постоянное чтение из потока, но так как окончания потока данных нет, то и запись не производиться. Если убрать "-t" или поставить ограниченно количество пингов, то запись происходит. Как я понимаю спустя то время, как пройдут все пинги.

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

Спасибо.


P.S.: да я знаю что есть isReachable, но он работает через Ж, периодически давая ложные данные. в частности падение канала в то время как достижимость до хоста есть.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.03.2013, 18:30
Ответы с готовыми решениями:

Чтение из символьного потока
Необходимо написать метод чтения данных из символьного потока (с консоли). Я создаю поток: BufferedReader inputStream = new...

чтение объекта апплетами из потока
Здравствуйте! У меня такая проблема: существуют сервлет и два апплета. Сервлет читает из базы и передает информацию в поток в виде объекта....

Чтение из входящего потока и запись в исходящий файловый поток
Здравствуйте ! Подскажите, пожалуйста ошибку. Вообщем, на вход прилетает массив url-адресов, к которым нужно подконнектиться и прочитать...

5
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
27.03.2013, 19:01
делайте на потоке периодически flush()
0
fejin
28.03.2013, 14:01
Какой поток сбрасывать? В BufferedReader нет метода flush(), а вот в BufferedWriter есть. Но мне необходимо сбрасывать именно поток чтения ответов команды ping. А вот запись в файл даже не буферизируется, т.к. таких записей может быть 1-2 в день, нет необходимости буферизировать поток записи в файл.
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
28.03.2013, 15:15
тогда не читайте readLine, читайте побайтно и валите в файл
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Inet4Address;
import java.net.InetAddress;
 
public class PingLogger {
 
    public void logPing(InetAddress inetAddress, File log) throws IOException {
        String ip = inetAddress.getHostAddress();
        String[] command = new String[] { "ping", "-c", "300", ip };
        ProcessBuilder pb = new ProcessBuilder(command);
        Process process = pb.start();
        InputStream in = process.getInputStream();
 
        OutputStream out = new FileOutputStream(log);
        int len = 0;
        byte[] buf = new byte[1024];
        int counter = 0;
        while ((len = in.read(buf)) != -1) {
            out.write(buf, 0, len);
            if (counter++ % 10 == 0) {
                filePrinter(log);
            }
        }
        in.close();
        out.close();
 
    }
 
    public void filePrinter(File f) {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(f));
            String line = null;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
 
    static class Test {
        public static void main(String[] args) throws Exception {
            File log = new File("log.txt");
            log.createNewFile();
            new PingLogger().logPing(Inet4Address.getLocalHost(), log);
 
        }
    }
 
}
0
 Аватар для tabber
37 / 41 / 3
Регистрация: 10.10.2010
Сообщений: 364
28.03.2013, 22:09
мне немного не ясно как вы синхронизируете этот процесс с получением его потока вывода.
по идее до получения этого потока и тем более до по пытки прочения чего либо из него, программа ping уже может, что-то успеть вывести. Или это как-то кешируется или буферизируеться классом Process?
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
29.03.2013, 00:57
Цитата Сообщение от tabber Посмотреть сообщение
Или это как-то кешируется или буферизируеться классом Process?
Процесс создаёт потоки in, out, err до запуска пинга и подключает их к запуску пинга, поэтому ни один бит не потеряется
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.03.2013, 00:57
Помогаю со студенческими работами здесь

По нажатию на кнопку из другого потока, нужно чтобы 2 потока останавливались
Есть 2 потока, в которых в цикле выполняется метод Thread.sleep(200); По нажатию на кнопку из другого потока, нужно чтобы эти 2 потока...

Многопоточность: вызвать метод главного потока из второстепенного потока
Здравствуйте. Эта тема всеми избита, знаю. Но у меня очень ограничено время, поэтому рискую и пишу вопрос тут: Пишу приложение...

Чтение чисел из файла. Чтение после конца потока невозможно
Товарищи, помогите. В Pascal'e я не силен, так что не бейте меня ногами, но есть задача: написать обычную программу для расчета некоторых...

Чтение потока
Доброго времени суток. Есть FileStream. Как читать его, "пока не достигнут конец потока"? Св-ва или метода, отвечающего за это я не...

Чтение потока
Получаю в строку string HTML-код таким образом WebRequest req =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru