我正在尝试使用 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,结果是相同的。
我也尝试了这里找到的建议,但我最终得到了错误: 当使用谷歌协议缓冲区传输字符串字符时,代码混乱
我通读了协议缓冲区文档,但我更加困惑。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 方法创建一个 InputStream 来解码 Base64 编码的字节流,但数据变得更加混乱。