Java: как собрать входящие фрагменты данных в правильно завершенные строки для последующего анализа? - PullRequest
2 голосов
/ 01 октября 2010

Я только что присоединился к StackOverflow после того, как нашел много хороших ответов здесь в прошлом.Вот мой первый вопрос:

РЕДАКТИРОВАТЬ: я чувствую себя плохо ... мой первый вопрос к StackOverflow оказался "погоня за дикой гуся".Проблема в data , а не в коде, читающем данные.Я искал решение не в том месте!Я объясню в комментарии ниже.

Пожалуйста, не обращайте внимания на этот вопрос.

В моем приложении данные поступают фрагментарно (это последовательные данные).Я хочу передать данные в метод, который будет их анализировать.Но я только хочу пройти по правильно завершенным линиям.Строки будут оканчиваться на '\ r' (возвращаемый символ).Иногда приходит фрагмент данных, имеющий несколько завершенных строк.Но иногда приходит фрагмент данных, у которого еще нет терминатора (терминатор прибудет позже).

Моя цель - иметь возможность отправлять только правильно завершенные строки (полные строки) в dataProcessor.logSerialData,(Код работает без этого требования, но я мог бы написать намного более чистый код, если бы мог выполнить это требование. Логика синтаксического анализа - здесь не показана - было бы легче поддерживать.)

Вот мой код, которыйРАБОТАЕТ (но не соответствует моему новому требованию):

case SerialPortEvent.DATA_AVAILABLE:
            try
            {
                int len = -1;
                while ((len = in.read(readBuffer)) > 0)
                {
                    if (len > 0)
                    {
                        String s = new String(readBuffer, 0, len);
                        if (dataProcessor != null)
                        {
                            dataProcessor.logSerialData(s);
                        }
                        else
                        {
                            Logger.log("ERROR: packetReceiver is null");
                        }
                    }
                }
            }
            catch (IOException ex)
            {
                Logger.log(ex);
                return;
            }

Вот пример одной из многих вещей, которые я пробовал, но НЕ работает.Это как-то вызывает ошибки в потоке данных.

private static final String REGEX = ".*\\r";
private Pattern p = Pattern.compile(REGEX);

public void serialEvent(SerialPortEvent e)
{
    byte[] readBuffer = new byte[11000];//tried many values for buffer size

    switch (e.getEventType())
    {
        case SerialPortEvent.DATA_AVAILABLE:
            try
            {
                int len = -1;
                while ((len = in.read(readBuffer)) > 0)
                {
                    if (len > 0)
                    {
                        String input = new String(readBuffer, 0, len);
                        Matcher m = p.matcher(input);
                        int count = 0;
                        while (m.find())
                        {
                            count++;
                            String terminatedLine = m.group();
                            if (!terminatedLine.isEmpty())
                            {
                                completedLines.add(terminatedLine);
                            }
                        }
                    }
                }
            }
            catch (IOException ex)
            {
                Logger.log(ex);
                return;
            }
            for (String line : completedLines)
            {
                dataProcessor.logSerialData(line);
            }

Есть предложения?(На самом деле, есть идеи, почему новый код вносит ошибки в поток данных? Каждый вариант рабочего кода, который я пробовал, работает неправильно. Я пробовал методы регулярных выражений и не-регулярных выражений и любые другие вещи. Единственный код, которыйworks - это рабочий пример, показанный выше. Последовательная обработка данных кажется очень сложной! Я мог бы использовать некоторую помощь.

Ответы [ 3 ]

0 голосов
/ 01 октября 2010

Можно обернуть InputStream в Reader в BufferedReader и прочитать строки из этого?

0 голосов
/ 03 октября 2010

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

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

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

Извините за поддельный вопрос.

0 голосов
/ 01 октября 2010

Это должно работать по мере необходимости.

private String remains = "";
...

int len = -1;
while ((len = in.read(readBuffer)) > 0) {
    if (len > 0) {
        String input = remains + new String(readBuffer, 0, len);
        Matcher m = p.matcher(input);
        int last = 0;
        while (m.find()) {
            String terminatedLine = m.group();
            last = m.end(0);
            if (!terminatedLine.isEmpty()) completedLines.add(terminatedLine);
        }
        remains = input.substring(last);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...