java中使用protobuf总结

news/2024/3/29 20:20:42/文章来源:https://blog.csdn.net/hsy12342611/article/details/129268584

基本没怎么接触过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://www.luyixian.cn/news_show_75619.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI/CV大厂笔试LeetCode高频考题之基础核心知识点

AI/CV互联网大厂笔试LeetCode高频考题之基础核心知识点算法复习1、二叉树的遍历2、回溯算法3、二分搜索4、滑动窗口算法题5、经典动态规划6、动态规划答疑篇6.1、总结一下如何找到动态规划的状态转移关系7、编辑距离8、戳气球问题9、最长公共子序列 Longest Common Subsequence…

系统性能测试指标

性能测试的目的 1.评估系统的能力&#xff0c;测试中得到的负荷和响应时间数据可以被用于验证所计划的模型的能力&#xff0c;并帮助作出决策。 2.识别体系中的弱点&#xff1a;受控的负荷可以被增加到一个极端的水平&#xff0c;并突破它&#xff0c;从而修复体系的瓶颈或薄…

兴达易控Modbus转Profinet网关将丹佛斯变频器接入西门子1200PLC配置案例

案例简介&#xff1a; 本案例是兴达易控Modbus转Profinet网关连接丹佛斯变频器在西门子1200PLC程序控制实例&#xff0c;实现对变频器频率读写&#xff0c;及工作模式切换。 用到的设备为西门子1200PLC一台&#xff0c;丹佛斯变频器一台,兴达易控Modbus转Profinet网关一个 Modb…

OSPF -- (开放式最短路径优先协议)(公共协议)

OSPF -- &#xff08;开放式最短路径优先协议&#xff09;&#xff08;公共协议&#xff09; 1、属性&#xff1a;无类别链路状态IGP协议 无类别&#xff1a;更新携带精确掩码 链路状态&#xff1a;共享拓扑&#xff08;共享LSA&#xff09;本地计算路由IGP&#xff1a; 基于…

读取/etc/profile时发现错误:

读取/etc/profile时发现错误&#xff1a; /etc/profile:行XX&#xff1a;***************** /etc/profile:行XX&#xff1a;***************** 今天遇到这个错误&#xff0c;发现是首行被我编辑时删错了一个符号导致报错&#xff0c;导致每次开机都会报这个文件错误&#xff0…

SpringBoot解决跨域方式

跨域是指在 Web 应用中&#xff0c;一个服务器资源或应用访问另一个服务器资源或应用的资源时候。由于浏览器的同源策略&#xff0c;一般情况下同一个域中的网站或应用可以互相访问资源&#xff0c;但跨域访问会被浏览器拒绝。浏览器出于安全考虑&#xff0c;会限制跨域访问&am…

Jmeter性能测试 入门

Jmeter是一款优秀的开源测试工具&#xff0c; 是每个资深测试工程师&#xff0c;必须掌握的测试工具&#xff0c;熟练使用Jmeter能大大提高工作效率。 熟练使用Jmeter后&#xff0c; 能用Jmeter搞定的事情&#xff0c;你就不会使用LoadRunner了。 我将会覆盖Jmeter的各个功能…

亿发软件:钉钉移动ERP业务在线,审批、管理更方便!

钉钉系统是企业级智能移动办公平台&#xff0c;平台覆盖大中小微各量级企业&#xff0c;帮助中国企业移动办公管理。企业无需复杂的部署操作&#xff0c;在对应的功能制定流程和相关负责人即可。 亿发企业ERP管理系统于2022年与钉钉系统做了对接&#xff0c;提供一站式的企业管…

大数据系统重点

第一章 大数据计算系统概述 1 大数据计算框架概述 计算框架: 一种抽象&#xff0c;在其中提供相应的通用功能供用户编写代码以实现具体功能&#xff0c;从而形成面向应用的软件。 大数据计算框架&#xff1a;面向大数据的计算框架。 Hadoop Hadoop的运行过程 Hadoop的详细…

腾讯云轻量应用服务器和云服务器CVM有什么区别?

腾讯云新推出的轻量应用服务器Lighthouse和原来的CVM云服务器有什么区别&#xff1f;轻量应用服务器Lighthouse是一种易于使用和管理、适合承载轻量级业务负载的云服务器&#xff0c;主要用于Web网站应用&#xff0c;轻量服务器使用及后期运维更加简单方便&#xff1b;云服务器…

【数据结构(四)】树

文章目录树1 树的基本概念1.1 树的定义1.2 基本术语1.3 数的性质2 二叉树的概念2.1 二叉树的定义与特性2.1.1 定义2.1.2 二叉树的性质2.2 几种特殊的二叉树2.2.1 满二叉树2.2.2 完全二叉树2.3 二叉树的存储结构2.3.1 顺序存储2.3.2 链式存储3 二叉树的遍历和线索二叉树3.1 二叉…

敏捷-期末

什么是敏捷开发&#xff1f; 敏捷开发(Agile Development)是一种以人为核心、迭代、循序渐进的开发方法。 怎么理解呢&#xff1f;它不是一门技术&#xff0c;它是一种开发方法&#xff0c;也就是一种软件开发的流程&#xff0c;它会指导我们用规定的环节去一步一步完成项目的开…

二叉树路径查找

题目描述&#xff1a;给定一棵二叉树(结构如下)&#xff0c;其中每个节点值为整数。给定一个值 K&#xff0c;求所有满足如下条件的路径并将路径上节点的值打印出来&#xff1a; 1、路径方向必须向下&#xff0c;即只能从父节点指向子节点 2、路径并不是必须从根节点开始或在叶…

一起玩转开源数据库!OceanBase DevCon 之开源生态全景解析

​ 2023 年 3 月 25 日&#xff0c;首次 OceanBase 开发者大会将在北京举办&#xff0c;OceanBase 首席科学家阳振坤与 OceanBase CTO 杨传辉领携众多技术专家&#xff0c;将与开发者共同探讨单机分布式、云原生、HTAP 等数据库前沿趋势&#xff0c;OceanBase 开源技术全景生…

【安卓】安卓设备实现wifi display解决方案

看文章前&#xff0c;我们需要知道的几个概念&#xff1a; 1、Wifi Direct技术&#xff1b; 2、Wifi Display技术&#xff1b; 3、Miracast标准&#xff1b; 安卓手机用户都知道我们的安卓手机有一个wifi直连功能&#xff0c;在点击设置–》WIFI–》更多Wifi设置–》Wifi直连&a…

【Linux】操作系统与Linux — Linux概述、组成及目录结构

目录 一、什么是操作系统&#xff1f;都有那些&#xff1f; 二、Linux概述 三、Linux组成 三、Linux目录结构 四、Linux目录结构 &#x1f49f; 创作不易&#xff0c;不妨点赞&#x1f49a;评论❤️收藏&#x1f499;一下 一、什么是操作系统&#xff1f;都有那些&#x…

Linux | 1. 挂载新硬盘与磁盘管理

如有错误&#xff0c;恳请指出。 1. Ubuntu挂载新硬盘 查看磁盘状态&#xff1a;sudo fdisk -l 1&#xff09;为新硬盘分区 使用 fdisk 指令对 /dev/sdb 进行分区操作&#xff1a;sudo fdisk /dev/sdb。进入分区工具后&#xff0c;我们可以输入 m 看指令说明&#xff0c;注意…

SQL数据库权限管理-10个数据库角色

为便于管理数据库中的权限&#xff0c;SQL 数据库提供了服务器角色、数据库角色、用户等来划分不同用户拥有的权限差异。今天给大家介绍数据库角色对应的权限。 数据库级角色 存在两种类型的数据库级角色&#xff1a; 数据库中预定义的“固定数据库角色”可以创建的“用户定…

New Bing怼人、说谎、PUA,ChatGPT已经开始胡言乱语了

最近&#xff0c;来自大洋彼岸那头的ChatGPT科技浪潮席卷而来&#xff0c;微软将chatGPT整合搜索引擎Bing开启内测后&#xff0c;数百万用户蜂拥而至&#xff0c;都想试试这个「百事通」。 赶鸭子上架&#xff0c;“翻车”了&#xff1f; 但短短上线十几天&#xff0c;嵌入了…

架构篇之如何画出优秀的架构图(二)

今天是架构篇的第二篇文章,跟大家聊聊如何画出好的架构图。 一、架构图分类 1、业务架构 a. 定义:描述系统对用户提供了什么业务功能。 b. 使用场景: 产品规划业务给高P汇报