我正在尝试使用Java下载可读的gtfs实时数据(协议缓冲区格式),以便我可以在文本文件中查看它。
我尝试了几种方法:
方法#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,结果是一样的。
我也尝试了这里的建议,但我最终得到了错误: When using google protocol buffers to transfer String character,got messy code
我通过协议缓冲区文档阅读但我更加困惑。 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的wrap方法创建一个用于解码Base64编码字节流的InputStream,但数据更加严重。
答案 0 :(得分:1)
GTFS-realtime规范现在包含用于以各种语言解析GTFS实时数据的代码示例:
https://developers.google.com/transit/gtfs-realtime/code-samples
在用您喜欢的语言解析GTFS实时数据时,这是一个很好的起点。
答案 1 :(得分:1)
正如其他人提到的,gtfs-realtime文件是二进制文件,需要特殊的协议缓冲区编译代码才能解析。你无法使用Base64解码。
然而,如果您只是尝试将gtfs-realtime文件解析为人类可读的格式,我编写了一个独立的工具,将GTFS-realtime转换为JSON:https://github.com/harrytruong/gtfs_realtime_json < / p>
只需下载(无安装),然后运行:gtfs_realtime_json <feed_url>