Я просто настраиваю новый проект Java, который будет (возможно, не совсем уверен) сейчас использовать буфер протокола Google.Я новичок в этом API, поэтому я начал с очень простого теста.Тест, чей результат, честно говоря, действительно разочаровал меня.Почему этот очень простой код не работает?
var output = new ByteArrayOutputStream();
Message.Echo.newBuilder().setMsg("MSG1?").build().writeTo(output);
System.out.println("output.length " + output.toByteArray().length);
Message.Echo.newBuilder().setMsg("MSG2!!").build().writeTo(output);
System.out.println("output.length " + output.toByteArray().length);
var input = new ByteArrayInputStream(output.toByteArray());
System.out.println("input.available " + input.available());
System.out.print(Message.Echo.parseFrom(input));
System.out.println("input.available " + input.available());
System.out.print(Message.Echo.parseFrom(input));
Приведенный выше код выдает следующий вывод:
output.length 7
output.length 15
input.available 15
msg: "MSG2!!"
input.available 0
Он полностью пропускает первые сообщения или, скорее, кажется,«перезаписать» его каким-либо образом, так как все 15 байтов считываются.Кроме того, он не блокируется при втором вызове, учитывая, что больше нет байтов для чтения.
Однако изменение двух строк чтения на:
System.out.print(Message.Echo.parseFrom(input.readNBytes(7)));
System.out.print(Message.Echo.parseFrom(input.readNBytes(15-7)));
правильно печатает два сообщения.Я использую Kubuntu 18.04 с JDK 11. Я что-то упустил действительно важное (не упомянутое в официальном руководстве) или это ошибка?
Это файл .proto:
syntax = "proto3";
package ...;
option java_package = "...";
option java_outer_classname = "Message";
message Echo {
string msg = 1;
}