потоковая передача данных gtfs в режиме реального времени в удобочитаемый формат

Я пытаюсь загрузить читаемые данные gtfs в реальном времени (формат буфера протокола) с помощью Java, чтобы просмотреть их в текстовом файле.

Я попробовал несколько подходов:

Подход №1:

URL url = new URL(uri); 
byte[] buffer = new byte[4096];
InputStream is = url.openStream();
byte[] buffer = new byte[4096];
InputStream is = url.openStream();
File file = new File("c:/protobuf_data.txt");
OutputStream output = new FileOutputStream(file);
int numOfBytesReadIntoBuffer = -1;
while((numOfBytesReadIntoBuffer = is.read(buffer)) != -1){
    output.write(buffer, 0, numOfBytesReadIntoBuffer);
}

results (snippet):
099700_L..S20150102*LÊ>0L 1637 8AV/RPY!¯¬œ¥¾¬œ¥"L22S(

Подход №2 (те же результаты, что и в подходе №1): import org.apache.commons.io.IOUtils;

URL url = new URL(uri); 
InputStream is = url.openStream();
File file = new File("c:/protobuf_data.txt");
OutputStream output = new FileOutputStream(file);
byte[] bytes = IOUtils.toByteArray(is);
output.write(bytes);

Я думаю, поскольку они оба пишут в OutputStream одинаково, результаты одинаковы.

Я также попробовал предложение, найденное здесь, но в итоге получил ошибки: got-messy-code">При использовании буферов протокола Google для передачи строкового символа получен беспорядочный код

Я прочитал документы буфера протокола, но еще больше запутался. https://developers.google.com/protocol-buffers/docs/encoding

Я использовал com.sun.org.apache.xml.internal.security.utils.Base64, но получаю сообщение об ошибке. Подход №3

URL url = new URL(uri);
InputStream is = url.openStream();

File file = new File("c:/users/Workstation/protobuf_data_bytes.txt");

OutputStream output = new FileOutputStream(file);

byte[] bytes = IOUtils.toByteArray(is);
Init.init();
byte[] decoded_bytes = Base64.decode(bytes);

error:
Exception in thread "main" com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException: Error while decoding

Я также попытался использовать метод переноса java.util.Base64 для создания InputStream для декодирования потока байтов, закодированного в Base64, но данные стали еще более искаженными.


person Village Idiot    schedule 02.01.2015    source источник
comment
Буферы протокола представляют собой двоичный формат сообщения, а файл .proto описывает поля и типы данных сообщения, которое вы читаете. Поэтому вам понадобится файл определения сообщения протокола GTFS от разработчиков . google.com/transit/gtfs-realtime/gtfs-realtime-proto, в котором описывается, как кодировать и декодировать это сообщение GTFS (при условии, что я угадал правильное значение GTFS). Вам также понадобится компилятор Protocol Buffers developers.google.com/protocol-buffers/docs. /downloads, который принимает этот файл .proto в качестве входных данных и генерирует классы Java для кодирования и декодирования этого сообщения.   -  person Jamie Flournoy    schedule 03.01.2015


Ответы (2)


Спецификация GTFS-realtime теперь включает примеры кода для анализа данных GTFS-realtime на различных языках:

https://developers.google.com/transit/gtfs-realtime/code-samples

Это хорошее место для начала, когда дело доходит до синтаксического анализа данных GTFS в реальном времени на вашем любимом языке.

person Brian Ferris    schedule 05.02.2015

Как уже упоминалось, файлы gtfs-realtime являются двоичными и для их анализа требуется специальный скомпилированный код Protocol Buffer. Вы ничего не добьетесь с декодированием Base64.


Альтернативный метод (командная строка + JSON):

Однако, если вы ТОЛЬКО пытаетесь преобразовать файлы gtfs-realtime в удобочитаемый формат, я написал отдельный инструмент, который преобразует GTFS-realtime в JSON: https://github.com/harrytruong/gtfs_realtime_json

Просто скачайте (без установки) и запустите: gtfs_realtime_json <feed_url>

Вот пример вывода JSON.

person Harry Truong    schedule 25.02.2015
comment
привет, я попробовал вашу автономную утилиту на Mac OS 10.9.5, но получил -bash: ./gtfs_realtime_json: невозможно выполнить двоичный файл - person Xavier Prudent; 16.03.2017