当前位置: 首页 > news >正文

Android JNI C++读写本地文件

文章目录

  • 小结
  • Android JNI使用C++
  • Android JNI读写本地文件
    • 有关权限
    • 创建文件夹
    • 访问 /storage/emulated/0/
    • 访问/data/data/example.jniwritefile/
    • 时间戳
    • Can't determine type for tag
  • 参考

小结

进行Android JNI C++读写本地文件,取得了想要的效果。

Android JNI使用C++

对于Android的本地文件的操作,由于涉及到安全问题,并不是十分直接。
具体创建Andriod JNI应用,可以参考CSDN: android studio 3.2 使用jni 和 Add C and C++ code to your project

Android JNI读写本地文件

有关权限

要使用Android JNI读写本地文件,首先需要解决权限和授权的问题。否则会出现各种各样的错误。我碰到的有errno = 2 (No such file or directory) 和 errno = 13 (Permission denied),具体错误码如下:

errno错误码:
errno0 :     Successerrno1 :     Operation not permittederrno2 :     No such file or directoryerrno3 :     No such processerrno4 :     Interrupted system callerrno5 :     Input/output errorerrno6 :     No such device or addresserrno7 :     Argument list too longerrno8 :     Exec format errorerrno9 :     Bad file descriptorerrno10 :    No child processeserrno11 :    Resource temporarily unavailableerrno12 :    Cannot allocate memoryerrno13 :    Permission deniederrno14 :    Bad addresserrno15 :    Block device requirederrno16 :    Device or resource busyerrno17 :    File existserrno18 :    Invalid cross-device linkerrno19 :    No such deviceerrno20 :    Not a directoryerrno21 :    Is a directoryerrno22 :    Invalid argumenterrno23 :    Too many open files in systemerrno24 :    Too many open fileserrno25 :    Inappropriate ioctl for deviceerrno26 :    Text file busyerrno27 :    File too largeerrno28 :    No space left on deviceerrno29 :    Illegal seekerrno30 :    Read-only file systemerrno31 :    Too many linkserrno32 :    Broken pipeerrno33 :    Numerical argument out of domainerrno34 :    Numerical result out of rangeerrno35 :    Resource deadlock avoidederrno36 :    File name too longerrno37 :    No locks availableerrno38 :    Function not implementederrno39 :    Directory not emptyerrno40 :    Too many levels of symbolic linkserrno41 :    Unknown error 41errno42 :    No message of desired typeerrno43 :    Identifier removederrno44 :    Channel number out of rangeerrno45 :    Level 2 not synchronizederrno46 :    Level 3 haltederrno47 :    Level 3 reseterrno48 :    Link number out of rangeerrno49 :    Protocol driver not attachederrno50 :    No CSI structure availableerrno51 :    Level 2 haltederrno52 :    Invalid exchangeerrno53 :    Invalid request descriptorerrno54 :    Exchange fullerrno55 :    No anodeerrno56 :    Invalid request codeerrno57 :    Invalid sloterrno58 :    Unknown error 58errno59 :    Bad font file formaterrno60 :    Device not a streamerrno61 :    No data availableerrno62 :    Timer expirederrno63 :    Out of streams resourceserrno64 :    Machine is not on the networkerrno65 :    Package not installederrno66 :    Object is remoteerrno67 :    Link has been severederrno68 :    Advertise errorerrno69 :    Srmount errorerrno70 :    Communication error on senderrno71 :    Protocol errorerrno72 :    Multihop attemptederrno73 :    RFS specific errorerrno74 :    Bad messageerrno75 :    Value too large for defined datatypeerrno76 :    Name not unique on networkerrno77 :    File descriptor in bad stateerrno78 :    Remote address changederrno79 :    Can not access a needed sharedlibraryerrno80 :    Accessing a corrupted sharedlibraryerrno81 :    .lib section in a.out corruptederrno82 :    Attempting to link in too manyshared librarieserrno83 :    Cannot exec a shared librarydirectlyerrno84 :    Invalid or incomplete multibyte orwide charactererrno85 :    Interrupted system call should berestartederrno86 :    Streams pipe errorerrno87 :    Too many userserrno88 :    Socket operation on non-socketerrno89 :    Destinationaddress requirederrno90 :    Message too longerrno91 :    Protocol wrong type for socketerrno92 :    Protocol not availableerrno93 :    Protocol not supportederrno94 :    Socket type not supportederrno95 :    Operation not supportederrno96 :    Protocol family not supportederrno97 :    Address family not supported byprotocolerrno98 :    Address already in useerrno99 :    Cannot assign requested addresserrno100 :   Network is downerrno101 :   Network is unreachableerrno102 :   Network dropped connection onreseterrno103 :   Software caused connection aborterrno104 :   Connection reset by peererrno105 :   No buffer space availableerrno106 :   Transport endpoint is alreadyconnectederrno107 :   Transport endpoint is notconnectederrno108 :   Cannot send after transportendpoint shutdownerrno109 :   Too many references: cannot spliceerrno110 :   Connection timed outerrno111 :   Connection refusederrno112 :   Host is downerrno113 :   No route to hosterrno114 :   Operation already in progresserrno115 :   Operation now in progresserrno116 :   Stale NFS file handleerrno117 :   Structure needs cleaningerrno118 :   Not a XENIX named type fileerrno119 :   No XENIX semaphores availableerrno120 :   Is a named type fileerrno121 :   Remote I/O errorerrno122 :   Disk quota exceedederrno123 :   No medium founderrno124 :   Wrong medium typeerrno125 :   Operation cancelederrno126 :   Required key not availableerrno127 :   Key has expirederrno128 :   Key has been revokederrno129 :   Key was rejected by serviceerrno130 :   Owner diederrno131 :   State not recoverableerrno132 :   Operation not possible due toRF-killerrno133 :   Unknown error 133errno134 :   Unknown error 134errno135 :   Unknown error 135errno136 :   Unknown error 136errno137 :   Unknown error 137errno138 :   Unknown error 138errno139 :   Unknown error 139

有关权限的问题的具体解决办法可能参考此篇文章:CSDN: Android文件读写权限 fopen errno=13

默认设置是App可以访问本应用所在的目录, 例如/data/data/example.jniwritefile/,这里example.jniwritefile是应用名字。但是要访问其它存储,需要考虑到权限问题。

权限的问题的解决办法是在AndroidManifest.xml加了几个文件操作权限,并在application中加入了android:requestLegacyExternalStorage="true",文件具体如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" tools:ignore="ProtectedPermissions" /><uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"tools:ignore="ScopedStorage" /><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.JNIWriteFile"android:requestLegacyExternalStorage="true"tools:targetApi="31"><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><meta-dataandroid:name="android.app.lib_name"android:value="" /></activity></application></manifest>

以下Java代码是在应用启动时开启弹窗让用户确认开启权限。


@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);verifyStoragePermission(this);...此处省略...}private static final int REQUEST_EXTERNAL_STORAGE = 1;private static String[] PERMISSIONS_STORAGE = {"android.permission.READ_EXTERNAL_STORAGE","android.permission.WRITE_EXTERNAL_STORAGE"};public void verifyStoragePermission(Activity activity){try{int permission = ActivityCompat.checkSelfPermission(activity,"android.permission.WRITE_EXTERNAL_STORAGE");if(permission!= PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(activity,PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);}}catch (Exception e){e.printStackTrace();e.printStackTrace();}}

创建文件夹

mkdir函数需要包括头文件:#include <sys/stat.h>,参考CSDN: 文件编程:创建目录mkdir()函数,具体C代码如下:

//方便用日志查看#define LOG_D(...)  __android_log_print(ANDROID_LOG_DEBUG, "jni", __VA_ARGS__)...
省略
...int errNum = 0;if(0 == access(WriteFileFolder,0)) {//目录存在} else{if(0 == mkdir(WriteFileFolder,777)) {}else {LOG_D("open fail errno = %d, reason = %s", errNum, strerror(errNum));}}
...

访问 /storage/emulated/0/

/storage/emulated/0/是可以通过Android手机文件应用/文件浏览器进行访问的。
首先,需要获取获取手机内部存储卡的根目录,Java代码获取比较方便,这里使用Android ndk来获取。
参考CSDN: Android ndk获取手机内部存储卡的根目录 和 CSDN: Android Native APP开发笔记:文件存储与访问 ,代码如下:

    //get the external file directoryjclass envcls = env->FindClass("android/os/Environment"); //获得类引用if (envcls == nullptr) return 0;//找到对应的类,该类是静态的返回值是FilejmethodID id = env->GetStaticMethodID(envcls, "getExternalStorageDirectory", "()Ljava/io/File;");//调用上述id获得的方法,返回对象即File file=Enviroment.getExternalStorageDirectory()//其实就是通过Enviroment调用 getExternalStorageDirectory()jobject fileObj = env->CallStaticObjectMethod(envcls,id);//通过上述方法返回的对象创建一个引用即File对象jclass flieClass = env->GetObjectClass(fileObj); //或得类引用//在调用File对象的getPath()方法获取该方法的ID,返回值为String 参数为空jmethodID getpathId = env->GetMethodID(flieClass, "getPath", "()Ljava/lang/String;");//调用该方法及最终获得存储卡的根目录jstring pathStr = (jstring)env->CallObjectMethod(fileObj,getpathId);const char* pathStrC = env->GetStringUTFChars(pathStr,NULL);char WriteFileFolder[100];sprintf(WriteFileFolder, "%s/DocumentTest", pathStrC);

以下代码实现了在前面创建的 /storage/emulated/0/DocumentTest目录下创建5个文件,目录是放在以上所获取的变量WriteFileFolder里的,文件名以JohnTest开头,以时间戳来命名的TXT文件,创建文件后写入This is test to write to file! Timestamp:并加上时间戳。

FILE *dumpFile = NULL;for (int j = 0; j < 5; j++) {time_t currentTime;struct tm *sCurrentTime;time(&currentTime); /*获取time_t类型当前时间*/LOG_D("Current time = %s", ctime(&currentTime));putenv("TZ=Asia/Singapore");//sCurrentTime = gmtime(&currentTime);sCurrentTime = localtime(&currentTime);char dumpfileName[100];sprintf(dumpfileName, "%s/JohnTest%04d%02d%02d%02d%02d%02d.txt",WriteFileFolder,sCurrentTime->tm_year + 1900,sCurrentTime->tm_mon + 1,sCurrentTime->tm_mday,sCurrentTime->tm_hour,sCurrentTime->tm_min,sCurrentTime->tm_sec);dumpFile = fopen(dumpfileName, "w+");char rpucData[100];sprintf(rpucData, "This is test to write to file! Timestamp: %s", ctime(&currentTime));if (dumpFile == NULL) {int errNum = 0;errNum = errno;LOG_D("open fail errno = %d, reason = %s", errNum, strerror(errNum));} else {fwrite(rpucData, sizeof(char), (unsigned) strlen(rpucData), dumpFile);fclose(dumpFile);}}

程序运行后会在相应的目录里写入5个TXT文件,并写入相应的内容。

访问/data/data/example.jniwritefile/

访问/data/data/example.jniwritefile/ 并不需要申请权限,类似以上程序,只需要进行以下修改:

...
省略
...sprintf(dumpfileName, "/data/data/example.jniwritefile/JohnTest%04d%02d%02d%02d%02d%02d.txt",sCurrentTime->tm_year + 1900,sCurrentTime->tm_mon + 1,sCurrentTime->tm_mday,sCurrentTime->tm_hour,sCurrentTime->tm_min,sCurrentTime->tm_sec);dumpFile = fopen(dumpfileName, "w+");

时间戳

有关时间戳的问题可以参考CSDN: C语言应用(1)——Unix时间戳和北京时间的相互转换 , cppreference.com: gmtime, gmtime_r, gmtime_s 和 CSDN: c++ 时间类型详解 time_t

这里使用了localtime函数,注意localtimegmtime的时差,例如新加坡/北京时间与GMT时间隔了8个小时。

        putenv("TZ=Asia/Singapore");//sCurrentTime = gmtime(&currentTime);sCurrentTime = localtime(&currentTime);

Can’t determine type for tag

参考Can’t determine type for tag macro name=“m3_comp_assist_chip_container_shape”>?attr/shapeAppearanceCornerSmall
这个问题在build.gradle(:app)里通过修改几个版本号解决,我使用了以下版本:

dependencies {implementation 'androidx.appcompat:appcompat:1.4.0'implementation 'com.google.android.material:material:1.6.0'implementation 'androidx.constraintlayout:constraintlayout:2.1.4'testImplementation 'junit:junit:4.13.2'androidTestImplementation 'androidx.test.ext:junit:1.1.3'androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

参考

C library function - fopen()
CSDN: android通过JNI用C/C++创建本地文件
CSDN: android studio 3.2 使用jni
CSDN Android JNI读取本地文件和读取文件并且写入其他文件
Stackoverflow: Android NDK fopen returns error 2 “No such file or directory” on a file I know exits
Stackoverlfow: Write file to location other than SDcard using Android NDK?
Stackoverlfow: File Operations in Android NDK
CSDN: Android Native APP开发笔记:文件存储与访问
Add C and C++ code to your project
Can’t determine type for tag macro name=“m3_comp_assist_chip_container_shape”>?attr/shapeAppearanceCornerSmall
CSDN: c++ 时间类型详解 time_t
cppreference.com: gmtime, gmtime_r, gmtime_s
CSDN: Android文件读写权限 fopen errno=13
CSDN: C语言应用(1)——Unix时间戳和北京时间的相互转换
CSDN: Android ndk获取手机内部存储卡的根目录
CSDN: 文件编程:创建目录mkdir()函数

相关文章:

Android JNI C++读写本地文件

文章目录小结Android JNI使用CAndroid JNI读写本地文件有关权限创建文件夹访问 /storage/emulated/0/访问/data/data/example.jniwritefile/时间戳Cant determine type for tag参考小结 进行Android JNI C读写本地文件&#xff0c;取得了想要的效果。 Android JNI使用C 对于…...

图形化深度学习开发平台PaddleStudio(代码开源)

目录一、PaddleStudio概述二、环境准备2.1 安装PaddlePaddle2.2 安装依赖库三、基本使用介绍3.1 启动3.2 快速体验3.2.1 下载示例项目3.2.2 训练3.2.3 评估3.2.4 测试3.2.5 静态图导出四、数据集格式4.1 图像分类4.2 目标检测4.3 语义分割4.4 实例分割五、趣味项目实战&#xf…...

【力扣-LeetCode】1138. 字母板上的路径-C++题解

1138. 字母板上的路径难度中等98收藏分享切换为英文接收动态反馈我们从一块字母板上的位置 (0, 0) 出发&#xff0c;该坐标对应的字符为 board[0][0]。在本题里&#xff0c;字母板为board ["abcde", "fghij", "klmno", "pqrst", &quo…...

基于Java+SpringBoot+Vue前后端分离酒店管理系统设计与实现

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建、毕业项目实战、项目定制✌ 博主作品&#xff1a;《微服务实战》专栏是本人的实战经验总结&#xff0c;《S…...

【软考系统架构设计师】2022下综合知识历年真题

【软考系统架构设计师】2022下综合知识历年真题 【2022下架构真题第01题&#xff1a;绿色】 01.云计算服务体系结构如下图所示&#xff0c;图中①、②、③分别与SaaS、PaaS、Iaas相对应&#xff0c;图中①、②、③应为( ) A.应用层、基础设施层、平台层 B.应用层、平台层、基础…...

【计组】理解Disruptor--《计算机组成原理》(十五)

Disruptor 的开发语言&#xff0c;并不是很多人心目中最容易做到性能极限的 C/C&#xff0c;而是性能受限于 JVM 的 Java。其实只要通晓硬件层面的原理&#xff0c;即使是像 Java 这样的高级语言&#xff0c;也能够把 CPU 的性能发挥到极限。 一、Padding Cache Line&#xff…...

Windows11 安装Apache24全过程

Windows11 安装Apache24全过程 一、准备工作 1、apache-httpd-2.4.55-win64-VS17.zip - 蓝奏云 2、Visual Studio Code-x64-1.45.1.exe - 蓝奏云 二、实际操作 1、将下载好的zip文件解压放到指定好的文件夹。我的是D:\App\PHP下 个人习惯把版本号带上。方便检测错误。 2…...

1302机器翻译(队列)

目录 题目描述 提示 解题思路 代码部分 题目描述 小晨的电脑上安装了一个机器翻译软件&#xff0c;他经常用这个软件来翻译英语文章。 这个翻译软件的原理很简单&#xff0c;它只是从头到尾&#xff0c;依次将每个英文单词用对应的中文含义来替换。对于每个英文单词&#…...

AcWing、第 90 场周赛:4806. 首字母大写、4807. 找数字、4808. 构造字符串(C++)

目录 4806. 首字母大写 题目描述&#xff1a; 实现代码&#xff1a; 4807. 找数字 题目描述&#xff1a; 实现代码&#xff1a; 回溯&#xff08;超时&#xff09;&#xff1a; 原理思路&#xff1a; 贪心&#xff1a; 原理思路&#xff1a; 4808. 构造字符串 问题…...

跟同事杠上了,Apache Beanutils为什么被禁止使用?

收录于热门专栏Java基础教程系列&#xff08;进阶篇&#xff09; 在实际的项目开发中&#xff0c;对象间赋值普遍存在&#xff0c;随着双十一、秒杀等电商过程愈加复杂&#xff0c;数据量也在不断攀升&#xff0c;效率问题&#xff0c;浮出水面。 问&#xff1a;如果是你来写…...

Golang 模糊测试的使用

一 背景 在 Go 1.18 中,Go 语言新增模糊测试(Fuzzing)。Fuzzing,又叫fuzz testing,中文叫做模糊测试或随机测试。其本质上是一种自动化测试技术,更具体一点,它是一种基于随机输入的自动化测试技术,常被用于发现处理用户输入的代码中存在的bug和问题。模糊测试和常规的功能…...

RSA公钥加密机制跨语言应用实战

在公钥密码学中(也称为非对称密码学)&#xff0c;加密机制依赖于两个密钥&#xff1a;公钥和私钥。公钥用于加密消息&#xff0c;而只有私钥的所有者才能解密消息。实际应用中通常需要对公钥和私钥进行序列化&#xff0c;然后分发密钥实现在不同场景、不同语言环境中使用。本文…...

P7面试送命题

面试总结&#xff0c;对标市场P7。什么叫送命题&#xff0c;一道题回答不上来面试直接挂的题目。JVM 运行时数据区域内存回收机制GC root有哪些volatile原理synchronize原理JDK 集合家族介绍HashMap原理ConcurrentHashMap原理Thread生命周期ThreadPoolExecutor生命周期、实例化…...

零信任-微软零信任介绍(2)

微软零信任是什么&#xff1f; Microsoft Zero Trust 是一种安全架构&#xff0c;旨在在没有信任任何设备、用户或网络的情况下保护网络。这种架构使用多重验证和分段技术&#xff0c;以确保每个请求和资源的安全性。 零信任不假定任何内部用户或设备是安全的&#xff…...

C++中对象调用成员函数this指针的作用

C中对象调用成员函数this指针的作用 Sales_data total;//定义对象 total.isbn();//调用对象中的成员函数isbn成员函数isbn()通过一个名为this的额外隐式参数来访问调用它的对象total。当我们调用一个成员函数时&#xff0c;用请求该函数的对象地址初始化this。 例如&#xff0…...

JavaScript------数组

目录 一、简介 1、什么是数组&#xff1f; 2、创建数组 3、数组的数据类型 4、向数组中添加元素 5、读取数组中的元素 6、实例属性&#xff1a;length 二、遍历数组 方式一&#xff1a;for循环 方式二&#xff1a;for...of 三、数组方法&#xff08;常用&#xff09…...

迷宫《1》

一天蒜头君掉进了一个迷宫里面&#xff0c;蒜头君想逃出去&#xff0c;可怜的蒜头君连迷宫是否有能逃出去的路都不知道。看在蒜头君这么可怜的份上&#xff0c;就请聪明的你告诉蒜头君是否有可以逃出去的路。输入格式第一行输入两个整数 &#xfffd;n 和 &#xfffd;m&#x…...

剑指 Offer 20. 表示数值的字符串

剑指 Offer 20. 表示数值的字符串 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。 数值&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; 若干空格 一个 小数 或者 整数 &#xff08;可选&#xff09;一个 ‘e’ 或 ‘…...

阻抗匹配之反射波形测量

稍微接触过高速信号的朋友&#xff0c;一定对阻抗匹配和信号反射都有所了解&#xff0c;甚至可以按照公式&#xff0c;把反射波形一路推导出来。但是&#xff0c;纸上得来终绝浅&#xff0c;绝知此事要躬行。 今天&#xff0c;我们就来实测一下信号反射波形&#xff0c;测试环…...

微信小程序 java家校通Springboot中小学家校联系电子作业系统

小程序前端框架&#xff1a;uniapp 小程序运行软件&#xff1a;微信开发者 后端技术:javaSsm(SpringSpringMVCMyBatis)vue.js 后端开发环境:idea/eclipse 数据库:mysql 通过对各种资料的收集&#xff0c;了解到“校讯通”是联系社会的窗口&#xff0c;是实现家校联系工作和学校…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)

第一篇&#xff1a;Liunx环境下搭建PaddlePaddle 3.0基础环境&#xff08;Liunx Centos8.5安装Python3.10pip3.10&#xff09; 一&#xff1a;前言二&#xff1a;安装编译依赖二&#xff1a;安装Python3.10三&#xff1a;安装PIP3.10四&#xff1a;安装Paddlepaddle基础框架4.1…...