java中使用protobuf总结

article/2025/8/30 8:06:58

基本没怎么接触过java编程,别的团队发过来一个用java编写的存储pb的文件,让拆分和解析,硬着头皮做一下,在此将步骤做个记录:

  1. 下载安装protobuf

https://github.com/protocolbuffers/protobuf/tags?after=v3.6.1.2

  1. 编译protoc解释器

tar -zxvf protobuf-all-3.6.1.tar.gz 
cd protobuf-3.6.1/
sudo ./autogen.sh
sudo ./configure
sudo make
sudo make check
sudo make install
sudo ldconfig  
  1. 定义接口

syntax = "proto3";
package com.union.fun;message Metric {string name = 1;string type = 2;float value = 3;repeated string tags = 4;}
  1. 生成java语言的接口文件

protoc -I=/home/tiger/java_protobuf --java_out=/tiger/java_protobuf metric.proto

  1. 安装jdk8

sudo apt-get update

sudo apt-get install openjdk-8-jdk

  1. 安装maven

wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz
tar -zvxf apache-maven-3.5.2-bin.tar.gz
复制到/opt/目录
cp apache-maven-3.5.2-bin.tar.gz /opt
设置环境变量
打开/etc/profile,配置PATH变量
sudo vim /etc/profile
export  MAVEN_HOME=/opt/apache-maven-3.5.2
export PATH=$MAVEN_HOME/bin:$PATH
  1. 生成protobuf对应jar包

cd protobuf-3.6.1/java

测试maven

mvn test

打包生成jar文件

mvn package

protobuf-java-3.6.1.jar文件 在 core/target目录

protobuf-java-util-3.6.1.jar文件 在 util/target目录

  1. 生成java接口

protoc -I=/home/tiger/java_protobuf --java_out=/tiger/java_protobuf metric.proto

  1. 代码编写

HelloWorld.java

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.nio.ByteBuffer;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.io.FileWriter;
import java.io.Writer;import com.union.fun.MetricOuterClass;public class HelloWorld {private static String currentPath = "";private static String strFileName = "testData.log";private static String strFileNameCatalog = "testData_Catalog.txt";private static File outputFile = null;private static FileOutputStream fileOutputStream = null;private static File outputCatalogFile = null;private static PrintWriter outputCatalogFileWriter = null;private static void savetestDataCatalog(String catalog) {try {if (!outputCatalogFile.getParentFile().exists()) {outputCatalogFile.getParentFile().mkdirs();System.out.println("savetestDataCatalog 1");}if (!outputCatalogFile.exists()) {outputCatalogFile.createNewFile();System.out.println("savetestDataCatalog 2");}if (outputCatalogFileWriter == null) {outputCatalogFileWriter = new PrintWriter(outputCatalogFile);System.out.println("savetestDataCatalog 3");}outputCatalogFileWriter.print(catalog);//System.out.println(catalog);} catch (Exception e) {e.printStackTrace();}}private static void savetestData(MetricOuterClass.Metric testData) {try {if (!outputFile.getParentFile().exists()) {outputFile.getParentFile().mkdirs();System.out.println("savetestData 1");}if (!outputFile.exists()) {outputFile.createNewFile();System.out.println("savetestData 2");}if (fileOutputStream == null) {fileOutputStream = new FileOutputStream(outputFile, true);System.out.println("savetestData 3");}testData.writeDelimitedTo(fileOutputStream);} catch (Exception e) {e.printStackTrace();}}private static void showUseMethod() {System.out.println("check totoal pb frame use param: {-i} {file}");System.out.println("cut pb use param: {-c} {file} {startpos} {endpos}");}private static void showPbTotalFrame(String inputFile) {File file = null;if (file == null) {file = new File(inputFile);}if (!file.exists()) {System.out.println(inputFile + " not exists !");return;}if (outputCatalogFile.exists()) {outputCatalogFile.delete();}if (!outputCatalogFile.getParentFile().exists()) {outputCatalogFile.getParentFile().mkdirs();}try {if (!outputCatalogFile.exists()) {outputCatalogFile.createNewFile();}} catch (IOException e) {e.printStackTrace();return;}try {outputCatalogFileWriter = new PrintWriter(outputCatalogFile);} catch (FileNotFoundException ex) {ex.printStackTrace();return;}int iNormal = 0;try (FileInputStream fileInputStream = new FileInputStream(file)) {while (fileInputStream.available() != 0) {MetricOuterClass.Metric mWorldPackage =MetricOuterClass.Metric.parseDelimitedFrom(fileInputStream);//iTotal++;if (mWorldPackage == null) {//System.out.println("mWorldPackage == null");continue;}//System.out.println("strTimeStamp = " + strTimeStamp);//System.out.println("strSub = " + strSub);/*String currentTime = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss").format(millTimeStamp);if (!strSub.isEmpty()) {currentTime += ".";currentTime += strSub;}iNormal++;  String strItem = String.format("%d %s %s\r\n", iNormal, strTimeStamp, currentTime);*///System.out.println(currentTime);iNormal++; int size = mWorldPackage.getSerializedSize(); String strItem = String.format("%d %d\r\n", iNormal, size);savetestDataCatalog(strItem); }} catch (IOException e) {System.out.println("IOException:" + e);e.printStackTrace();} finally {}outputCatalogFileWriter.close();System.out.println(String.format("total frame: %d", iNormal));}private static void cutPbFrame(String inputFile, int fromPos, int toPos) {File file = null;if (file == null) {file = new File(inputFile);}if (!file.exists()) {System.out.println(inputFile + " not exists !");return;}if (outputFile.exists()) {outputFile.delete();}int iPos = 0;try (FileInputStream fileInputStream = new FileInputStream(file)) {while (fileInputStream.available() != 0) {MetricOuterClass.Metric mWorldPackage =MetricOuterClass.Metric.parseDelimitedFrom(fileInputStream);if (mWorldPackage == null) {System.out.println("mWorldPackage == null");continue;}iPos++;//notifyVehicleDataChanged(mWorldPackage);//SystemClock.sleep(SLEEP_TIME);//int size = mWorldPackage.getSerializedSize();//ByteBuffer byteBuffer = ByteBuffer.allocateDirect(size);//System.out.println(size);if (iPos >= fromPos && iPos <= toPos) {savetestData(mWorldPackage);}}} catch (IOException e) {System.out.println("IOException:" + e);e.printStackTrace();} finally {}}public static void main(String[] args) {System.out.println("======  Welcome to using anp2 pb cutting tool ==========");//System.out.println(args.length);//System.out.println(args);/*System.out.println(System.getProperty("user.dir"));HelloWorld user = new HelloWorld();System.out.println(user.getClass().getResource("").getPath());System.out.println(user.getClass().getResource("/").getPath());System.out.println(user.getClass().getResource("./").getPath());*/if (args.length < 2) {showUseMethod();return;}String inputFile = args[1];String filePriPath = "";String outputDataFile = "";String outputDataCatalogFile = "";String[] split = inputFile.split("\\\\");if (split.length > 1) {System.out.println("windows platfoem");String fileName = split[split.length - 1];filePriPath = inputFile.replace(fileName, "");//System.out.println(fileName);//System.out.println(filePriPath);currentPath = System.getProperty("user.dir") + "\\";outputDataFile = currentPath + "output\\" + strFileName;outputFile = new File(outputDataFile);outputDataCatalogFile = currentPath + "output\\" + strFileNameCatalog;outputCatalogFile = new File(outputDataCatalogFile);            try {outputCatalogFileWriter = new PrintWriter(outputCatalogFile);} catch (FileNotFoundException ex) {ex.printStackTrace();return;}}else {System.out.println("linux platfoem");split = inputFile.split("/");String fileName = split[split.length - 1];filePriPath = inputFile.replace(fileName, "");//System.out.println(fileName);//System.out.println(filePriPath);currentPath = System.getProperty("user.dir") + "/";outputDataFile = currentPath + "output/" + strFileName;outputFile = new File(outputDataFile);outputDataCatalogFile = currentPath + "output/" + strFileNameCatalog;outputCatalogFile = new File(outputDataCatalogFile);}System.out.println("user.dir is: " + currentPath);if (args[0].equals("-i")) {System.out.println("you input file is: " + inputFile);System.out.println("output file is: " + outputDataCatalogFile);showPbTotalFrame(inputFile);return;} else {if (args.length < 4) {showUseMethod();return;}}System.out.println("output file is: " + outputDataFile);int startPos = Integer.parseInt(args[2]);int endPos = Integer.parseInt(args[3]);System.out.println(String.format("you input file is: %s, start pos is: %d, end pos is: %d", inputFile, startPos, endPos));cutPbFrame(inputFile, startPos, endPos);}
}
  1. 编译执行

javac -encoding UTF-8 -classpath .:./protobuf-java-3.6.1.jar:./protobuf-java-util-3.6.1.jar -d . HelloWorld.java

编译后代码结构如下:

java -classpath .:./protobuf-java-3.6.1.jar:./protobuf-java-util-3.6.1.jar HelloWorld -i testData.log

运行结果如下:

解析得到文件中每个PB顺序号和占用字节数


http://chatgpt.dhexx.cn/article/eIg1lnLo.shtml

相关文章

protobuf 详解

protobuf简介 Protobuf是Protocol Buffers的简称&#xff0c;它是Google公司开发的一种数据描述语言&#xff0c;是一种轻便高效的结构化数据存储格式&#xff0c;可以用于结构化数据串行化&#xff0c;或者说序列化 。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议…

protobuf介绍和语法

目录 前言 语法 标识符 字段 字段类型 proto2和proto3区别 前言 Protobuf即Protocol Buffers&#xff0c;是Google公司开发的一种跨语言和平台的序列化数据结构的方式&#xff0c;是一个灵活的、高效的用于序列化数据的协议。 与XML和JSON格式相比&#xff0c;pr…

Protobuf:一种更小、更快、更高效的协议

C/CLinux服务器开发/后台架构师知识体系 Protobuf介绍 Protobuf (Protocol Buffers) 是谷歌开发的一款无关平台&#xff0c;无关语言&#xff0c;可扩展&#xff0c;轻量级高效的序列化结构的数据格式&#xff0c;用于将自定义数据结构序列化成字节流&#xff0c;和将字节流反…

win10商店打不开_win10应用商店闪退是咋回事呢

win10虽然具有闪电般的开机速度&#xff0c;并且还新增了很多功能。但比较是全新的操作系统&#xff0c;所以难免会存在一些故障&#xff0c;这里小编就给大家讲讲win10应用商店闪退打不开怎么解决。 方法一 1&#xff0c;首先&#xff0c;打开开始菜单&#xff0c;进入设置&am…

电脑安装Linux闪退,win10系统运行内置Linux系统闪退如何处理

我们在win10系统电脑的使用中&#xff0c;有小伙伴在Linux系统的使用中出现了问题&#xff0c; win10系统运行内置Linux系统闪退的情况出现了&#xff0c;这是什么原因导致的呢&#xff0c;我们在win10系统运行内置Linux系统闪退如何处理&#xff0c;今天小编就来跟大家分享一下…

Java版mc闪退_本文传授win10运行mc闪退的具体操作对策

我们在使用电脑的时候遇到了win10运行mc闪退问题确实比较难受&#xff0c;要是你的电脑技术没有达到一定的水平&#xff0c;可能就不能解决这个win10运行mc闪退的情况。我们应当如何处理这个问题呢&#xff1f;小编先给大伙说说简单的措施&#xff1a;1、确保电脑中安装了 .NET…

(2022.5.27)【Win10】Windows10重置后微软商店闪退打不开、图片闪退打不开、UWP应用闪退打不开——可能的解决方案

更新日志 20220609 增加注意事项 注意事项 经过多为网友的反馈&#xff0c;目前这个方法是无法直接解决微软商店打不开的问题。因此&#xff0c;基于我目前的了解&#xff08;6月9日&#xff09;&#xff0c;如果大家遇到这个问题&#xff0c;真的只能重新 U 盘安装系统了。…

win10内置计算机和天气闪退,win10系统中天气闪退怎么办?Win10天气应用闪退问题解决方法...

win10系统中天气闪退怎么办&#xff1f;最近有部分用户在安装了win10系统后发现自带的天气应用出现闪退的情况&#xff0c;点击天气应用&#xff0c;发现它启动了很久&#xff0c;然后就自动关闭了。之后再点击天气应用就闪退&#xff0c;打不开。而尝试打开别的应用却可以正常…

解决WIN10下应用商店不能用,闪退的情况

解决WIN10下应用商店不能用,闪退的情况 先说下我的情况,也是博主手贱,经常看PC上的某个文件或者程序不顺眼的话就会想办法把它干掉,为此重装过几次系统… 这一次是装了win10的周年更新后,烦人的cortana,onedrive等一些我不想要的APP又回来了,在暴力清理这些APP的时候,需要特殊…

win10java闪退怎么办_Win10应用打不开或闪退怎么办?解决方案在此

可能有一些用户升级Win10之后遇到了应用商店、应用打不开或闪退的问题&#xff0c;此时可尝试通过下面的一些方法来解决。 1、点击任务栏的搜索(Cortana小娜)图标&#xff0c;输入Powershell&#xff0c;在搜索结果中右键单击Powershell&#xff0c;选择“以管理员身份运行”。…

win10的c语言程序闪退,Win10专业版软件打不开闪退怎么办?

现在用到最多的Win10系统是Win10专业版&#xff0c;用户重装Win10专业版系统的目的就是为了解决电脑遇到的问题&#xff0c;然而重装系统后还是会出现许许多多的问题&#xff0c;比如说部分软件打不开了&#xff0c;闪退的问题。如果您也遇到了相同的问题&#xff0c;下面就是小…

win10安装虚拟机闪退_win10应用商店战争机器4闪退,无法运行。

创建日期 2018/01/07 win10应用商店战争机器4闪退&#xff0c;无法运行。 日志名称: System 来源: Microsoft-Windows-DistributedCOM 日期: 2018-01-07 14:05:10 事件 ID: 10001 任务类别: 无 级别: 错误 关键字:…

右击计算机管理打开会闪退,win10应用商店为什么会闪退 win10应用商店出故障怎么修复...

win10系统有个应用商店&#xff0c;在商店里用户可以下载一些软件应用&#xff0c;很多用户反馈win10应用商店老是闪退&#xff0c;重启也没有用&#xff0c;这该怎么办&#xff1f;下面小编为大家科普下win10应用商店闪退的解决方案&#xff0c;希望可以帮助到大家。 win10应用…

win10的c语言程序闪退,win10内置应用出现闪退怎么回事? win10打开应用总闪退的解决方法...

Windows10操作系统新增加很多实用的功能&#xff0c;对大家操作电脑有很大帮助。Win10专业版系统自带有相机功能、地图功能、时钟功能&#xff0c;同时还有一个应用商店功能&#xff0c;有的小伙伴说打开内置应用时出现闪退&#xff0c;究竟是哪里出现问题&#xff1f;针对此问…

win10的c语言程序闪退,win10 1909系统出现应用闪退如何解决

许多用户在升级更新到win10 1909版本系统之后&#xff0c;反映说遇到这样一个问题&#xff0c;就是使用应用的时候会出现闪退的现象&#xff0c;该怎么处理呢&#xff0c;下面给大家带来win10 1909系统出现应用闪退的解决措施。 一、重装应用 将闪退的应用卸载之后重新安装一下…

Window10 应用商店闪退问题

新装win10后打开应用商店&#xff0c;搜索软件直接闪退&#xff0c;查看了网上前人留下的经验发现还是没有解决问题&#xff0c;后来点开了电脑的设置 默认是选中第二项&#xff0c;点击第一项后&#xff0c;应用商店可以使用了 当然选中开发人员模式应用商店也是可以使用的

Win10应用商店、应用打不开或闪退的解决方法

越来越多小伙伴都将系统升级成Win10正式版了,win10功能强大令不少朋友感到非常满意,但也有一些朋友升级后却遇到了一些问题,比如应用商店、应用打不开或闪退的问题,今天快启动小编就跟大家介绍Win10应用商店、应用打不开或闪退的解决方法。 1、点击任务栏的搜索(Cortana小娜…

WIN10应用商店(MicrosoftStore)闪退解决方法!!!

本文参考了&#xff1a; CSDN博主「DreamOneDay」的文章https://blog.csdn.net/zyhj2010/article/details/52232749知乎作者千千之雪的文章https://www.zhihu.com/question/31001796/answer/1099015956 本方法适用于&#xff1a;更改过C:\ProgramFiles\WindowsApps权限的用户 如…

win10应用及应用商店闪退有效解决办法

近日遇到win10应用及应用商店闪退问题&#xff0c;在网上找寻各种方法&#xff0c;最终解决&#xff0c;记录下来&#xff0c;供以后查询。 方法 1/步骤1 1、在任务栏的搜索框中输入“Powershell”&#xff0c;然后在搜索结果中找到windows Powershell 鼠标右键单击并选择“以…

第6集丨JavaScript 使用原型(prototype)实现继承——最佳实战3

目录 一、原型继承与属性拷贝1.1 功能说明1.2 功能测试 二、多重继承2.1 功能实现2.2 功能测试 三、寄生式继承四、构造器借用4.1 简单实现4.2 进化版4.2.1 功能实现4.2.2 案例测试 五、借用构造器和原型复制六 综合案例6.1 需求说明6.2 代码实现 一、原型继承与属性拷贝 1.1 功…