java中使用protobuf总结

news2025/1/16 17:02:39

基本没怎么接触过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.coloradmin.cn/o/378918.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python大数据培训班特色优势及工作方向

Python大数据培训班有多个大数据培训班类型&#xff0c;同时也包括训练营、学徒班、就业班等。 具体班型&#xff1a; 大数据挖掘与人工智能&#xff08;大数据分析&#xff09;学徒班、大数据应用开发学徒班 大数据挖掘与人工智能&#xff08;大数据分析&…

网络安全从入门到精通:30天速成教程到底有多狠?你能坚持下来么?

毫无疑问&#xff0c;网络安全是当下最具潜力的编程方向之一。对于许多未曾涉足计算机编程的领域「小白」来说&#xff0c;深入地掌握网络安全看似是一件十分困难的事。至于一个月能不能学会网络安全&#xff0c;这个要看个人&#xff0c;对于时间管理不是很高的&#xff0c;肯…

DDOS攻击和CC攻击分别是什么?

CC攻击其实是DDOS攻击的一种。CC攻击的前身CC攻击的前身是一个名为Fatboy攻击程序&#xff0c;而之所以后来人们会成为CC&#xff0c;是因为DDOS攻击发展的初期阶段&#xff0c;绝大部分DDOS攻击都能被业界熟知的“黑洞”&#xff08;collapsar&#xff0c;一种安全防护产品&am…

生成和查看dump文件

在日常开发中&#xff0c;即使代码写得有多谨慎&#xff0c;免不了还是会发生各种意外的事件&#xff0c;比如服务器内存突然飙高&#xff0c;又或者发生内存溢出(OOM)。当发生这种情况时&#xff0c;我们怎么去排查&#xff0c;怎么去分析原因呢&#xff1f; 1. 什么是dump文…

云服务器迁移 (全网最省钱最详细攻略)

0x00 背景服务器续费比较贵&#xff0c;由于旧的云服务器用的时间比较长&#xff0c;上面部署的应用&#xff0c;环境复杂、数据多&#xff0c;在新的服务器部署比较麻烦&#xff0c;所以想到把服务器环境制作成镜像。新服务器的选择上&#xff0c;我这里选择的天翼云服务器&am…

IGKBoard(imx6ull)-PWM编程蜂鸣器编程控制

文章目录1- PWM介绍2- PWM使能&#xff08;1&#xff09;添加配置&#xff08;2&#xff09;export、unexport与npwm属性文件&#xff08;3&#xff09;duty_cycle、enable和period属性文件3- PWM测试编程&#xff08;1&#xff09;PWM8管脚连接&#xff08;2&#xff09;流程介…

京东JDBook笔记本怎么安装Win10系统使用?

京东JDBook笔记本怎么安装Win10系统使用&#xff1f;有用户使用的京东JDBook笔记本电脑系统是Win7系统的&#xff0c;最近想要去将系统升级到Win10来使用。那么如何将Win7的系统重装Win10呢&#xff1f;以下为大家带来详细的操作步骤图文教程。 准备工作&#xff1a; 1、U盘一个…

视频和视频帧:FFMPEG CPU解码API介绍

写在前面本文将介绍的如何用FFMPEG API做视频解码。视频解码&#xff0c;是将压缩后的视频&#xff08;压缩格式如H264&#xff09;通过对应解码算法还原为YUV视频流的过程&#xff1b;在计算机看来&#xff0c;首先输入一段01串&#xff08;压缩的视频&#xff09;&#xff0c…

用 @types 前缀的包是什么?有什么用?

前言 解决过 TypeScript 的项目大概都是从两个方向&#xff0c;Vue3 方向和 React Native 方向&#xff0c;而在 React Native 方向上我经常会遇到一个烦人的错误 Could not find a declaration file for module ‘juejin-type-study’. ‘d:/fe-project/nodejs/types-study/n…

看懂这篇文章-你就懂了信息安全的密码学

一、前言一个信息系统缺少不了信息安全模块&#xff0c;今天就带着大家全面了解并学习一下信息安全中的密码学知识&#xff0c;本文将会通过案例展示让你了解抽象的密码学知识&#xff0c;阅读本文你将会有如下收获&#xff1a; 熟悉现代密码学体系包含的主流密码技术 掌握Base…

SignalR 实时通讯

SignalR 实时通讯1.SignalR1.1.SignalR 简介1.2.SignalR 功能1.3.传输1.4.中心2.服务器2.1.配置中心2.2.上下文对象2.3.客户端对象2.4.创建2.5.中心功能实现4.客户端6.案例演示&#xff08;DotNet 客户端&#xff09;1.SignalR 1.1.SignalR 简介 SignalR 是一个开放源代码库&a…

内容感知、AI融合:让实景三维看山是山,看水是水

实景三维具备还原客观物理世界的优势性&#xff0c;但也正由于部分真实性的欠缺备受争议。这是因为传统的三维建模软件大多基于像元的匹配与计算的逻辑&#xff0c;对地物进行无差别的重建处理&#xff0c;最终生成的模型看起来扭曲怪异、残缺变形。常见的模型缺陷有&#xff1…

2022 OpenCV Spatial AI大赛前三名项目分享,开源、上手即用,优化了OAK智能双目相机的深度效果。

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查看首发地址链接。 ▌前言 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是助手…

深圳居住证申领指南

打开广东政务服务网&#xff0c;在首页搜索【深圳经济特区居住证申领】在搜索结果中可以发现有如下链接&#xff0c;点击在线办理 会转到登陆界面&#xff0c;直接使用个人登录并用微信扫描登录 根据提示进行手机登录验证。 完成登录认证之后会自转到深圳经济特区居住证申领界…

二分查找由浅入深--算法--java

二分查找写在开头算法前提&#xff1a;算法逻辑算法实现简单实现leftright可能超过int表示的最大限度代码分析和变换更多需求&#xff1a;求索引最小的值java二分API应用基础题思考难度方法写在开头 二分查找应该是算比较简单的这种算法了&#xff0c;我本以为还可以。但有时候…

Word处理控件Aspose.Words功能演示:使用 Java 比较 MS Word 文档

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c; Aspose API支持流行文件格式处…

动态规划初阶-爬楼梯问题

示例1&#xff1a; 输入&#xff1a;cost [10,15,20] 输出&#xff1a;15 解释&#xff1a;你将从下标为 1 的台阶开始。 - 支付 15 &#xff0c;向上爬两个台阶&#xff0c;到达楼梯顶部。 总花费为 15 。示例2&#xff1a; 输入&#xff1a;cost [1,100,1,1,1,100,1,1,10…

使用Docker安装MongoDB,整合SpringBoot

使用Docker安装MongoDB MongoDB 和 MySQL 都是常用的数据库管理系统&#xff0c;但它们的设计目标不同&#xff0c;因此在某些方面的性能表现也有所不同。 MongoDB 是一个文档型数据库&#xff0c;它采用了面向文档的数据模型&#xff0c;支持动态查询和索引&#xff0c;适合…

Docker部署实战

文章目录Docker部署应用准备制作容器镜像启动容器上传镜像docker exec数据卷&#xff08;Volume&#xff09;声明原理实践Docker部署 应用准备 这一次&#xff0c;我们来用 Docker 部署一个用 Python 编写的 Web 应用。这个应用的代码部分&#xff08;app.py&#xff09;非常…

【同步、共享和内容协作软件】上海道宁与​ownCloud让您的团队随时随地在任何设备上轻松处理数据

ownCloud是 一款开源文件同步、共享和 内容协作软件 可让团队随时随地 在任何设备上轻松处理数据 ownCloud开发并提供 用于内容协作的开源软件 使团队能够轻松地无缝 共享和处理文件 而无需考虑设备或位置 开发商介绍 ownCloud成立于2010年&#xff0c;是一个托管和同…