flutter获取手机中的系统路径信息

https://www.bilibili.com/video/BV1wE421g7sw

获取系统中的路径
在这里插入图片描述

获取系统中的路径,并在这个路径中创建一个文本文件【str.txt】
然后进行写入【str.txt】
再读取这个文件【str.txt】
在这里插入图片描述

手机没有开通root权限无法看到写入到【应用程序文档目录】路径中的文件

用来存储是相对安全的

其他应用也无法查看,只有该应用才能读写

在这里插入图片描述

应用程序支持目录:
系统不会清除这个目录,
我不想给用户看的目录
删除应用时才会消失
应用程序文档目录:
只能由该应用访问的文件
系统不会清除这个目录,
我不想给用户看的目录
删除应用时才会消失

1:怎么创建一个组件用于显示

随便创建个手脚架

import 'dart:io';import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Path Provider',theme: ThemeData(primarySwatch: Colors.blue,),home: const MyHomePage(title: 'Path Provider'),);}
}

2 主要内容

1:   定义一个变量值【_tempDirectory】,用来存储路径,因为这个路径最终是通过io库来获取的,所以定义的变量类型为:Future<Directory?>?
2:   定义一个方法【_requestTempDirectory】,触发后是对变量值【_tempDirectory】进行赋值,赋值后会进行重构组件
3:  定义一个按钮来触发【_requestTempDirectory】方法,
4:  定义一个FutureBuilder来进行构建,构建的值来源于【_tempDirectory】变量,构建的组件【_buildDirectory】Futurebuild会立即构建,等待值改变后触发会重新构建
5:  定义【_buildDirectory】组件的构建内容

3:定义这个触发与显示的组件

// MyHomePage是一个有状态的组件,它显示了如何获取和显示不同目录的路径
class MyHomePage extends StatefulWidget {// 构造函数,接收一个标题const MyHomePage({super.key, required this.title});// 标题是一个必填参数final String title;State<MyHomePage> createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {// 定义MyHomePage的状态// 定义多个Future对象来存储获取目录的结果// 为什么要把变量定义在这里?Future<Directory?>? _tempDirectory;// 获取future中的快照数据,进行判断// 这个snapshot有4个值【1AsyncSnapshot.withError 2AsyncSnapshot.nothing() 3AsyncSnapshot.waiting() 4AsyncSnapshot.withData】// 对这个异步数据快照进行判断// 当异步操作完成时=ConnectionState.done// 判断(snapshot.hasError)与(snapshot.hasData)与【特殊】// 分别对应不同的数据构建// 最后返回1个组件去进行渲染Widget _buildDirectory(BuildContext context, AsyncSnapshot<Directory?> snapshot) {// 根据snapshot的状态和数据构建不同的Text小部件Text text = const Text('');if (snapshot.connectionState == ConnectionState.done) {if (snapshot.hasError) {text = Text('Error: ${snapshot.error}');} else if (snapshot.hasData) {text = Text('path: ${snapshot.data!.path}');} else {text = const Text('路径不可用');}}return Padding(padding: const EdgeInsets.all(16.0), child: text);// 添加内边距并返回Text}// 请求获取临时目录的方法// 调用getTemporaryDirectory方法// _requestTempDirectory函数,当调用时,会触发获取临时目录的操作// setState 是一个由 Flutter 框架提供的方法,用于通知框架小部件树中的状态已发生变化,需要重新构建。这是更新 UI 的一种机制。// 在 setState 的闭包中,我们执行异步操作来获取临时目录。// _tempDirectory 是一个 Future 类型的变量,它将存储 getTemporaryDirectory() 方法的返回值。// getTemporaryDirectory() 是 path_provider 包中的方法,它返回一个 Future<Directory?> 对象,该对象将在异步操作完成后提供临时目录的信息。void _requestTempDirectory() {setState(() {_tempDirectory = getTemporaryDirectory();});}Widget build(BuildContext context) {// 重写build方法来构建UIreturn Scaffold(appBar: AppBar(title: Text(widget.title),),body: Center(//child: ListView(children: <Widget>[Column(children: <Widget>[// 第一个子组件:Padding// 使用Padding小部件为内部组件添加内边距// 设置四周的内边距为16.0逻辑像素// 使用ElevatedButton小部件创建一个凸起的按钮// 为按钮设置一个点击事件处理函数// 设置按钮的文字,使用const修饰因为它不会改变Padding(padding: const EdgeInsets.all(16.0),child: ElevatedButton(onPressed: _requestTempDirectory,child: const Text('获取临时目录',),),),// 第二个子组件:FutureBuilder// 使用FutureBuilder小部件来根据Future的状态构建不同的UI// future属性设置为我们之前定义的_tempDirectory变量// 回去获取这个_tempDirectory的变量,然后返回// builder属性设置为我们自定义的_buildDirectory方法FutureBuilder<Directory?>(future: _tempDirectory, builder: _buildDirectory,),],),],),),);}
}

path_provider 官方案例-汉化注释代码


import 'dart:io';import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Path Provider',theme: ThemeData(primarySwatch: Colors.blue,),home: const MyHomePage(title: 'Path Provider'),);}
}// MyHomePage是一个有状态的组件,它显示了如何获取和显示不同目录的路径
class MyHomePage extends StatefulWidget {// 构造函数,接收一个标题const MyHomePage({super.key, required this.title});// 标题是一个必填参数final String title;@overrideState<MyHomePage> createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {// 定义MyHomePage的状态// 定义多个Future对象来存储获取目录的结果// 为什么要把变量定义在这里?Future<Directory?>? _tempDirectory;Future<Directory?>? _appSupportDirectory;Future<Directory?>? _appLibraryDirectory;Future<Directory?>? _appDocumentsDirectory;Future<Directory?>? _appCacheDirectory;Future<Directory?>? _externalDocumentsDirectory;Future<List<Directory>?>? _externalStorageDirectories;Future<List<Directory>?>? _externalCacheDirectories;Future<Directory?>? _downloadsDirectory;// 获取future中的快照数据,进行判断// 这个snapshot有4个值【1AsyncSnapshot.withError 2AsyncSnapshot.nothing() 3AsyncSnapshot.waiting() 4AsyncSnapshot.withData】// 对这个异步数据快照进行判断// 当异步操作完成时=ConnectionState.done// 判断(snapshot.hasError)与(snapshot.hasData)与【特殊】// 分别对应不同的数据构建// 最后返回1个组件去进行渲染Widget _buildDirectory(BuildContext context, AsyncSnapshot<Directory?> snapshot) {// 根据snapshot的状态和数据构建不同的Text小部件Text text = const Text('1');if (snapshot.connectionState == ConnectionState.done) {if (snapshot.hasError) {text = Text('Error: ${snapshot.error}');} else if (snapshot.hasData) {text = Text('path: ${snapshot.data!.path}');} else {text = const Text('路径不可用');}}return Padding(padding: const EdgeInsets.all(16.0), child: text);// 添加内边距并返回Text}// 构建外部存储目录列表显示的WidgetWidget _buildDirectories(BuildContext context, AsyncSnapshot<List<Directory>?> snapshot) {// 根据snapshot的状态和数据构建不同的Text小部件Text text = const Text('1');if (snapshot.connectionState == ConnectionState.done) {if (snapshot.hasError) {text = Text('Error: ${snapshot.error}');} else if (snapshot.hasData) {final String combined =snapshot.data!.map((Directory d) => d.path).join(', ');text = Text('paths: $combined');} else {text = const Text('path unavailable');}}return Padding(padding: const EdgeInsets.all(16.0), child: text);}// 请求获取临时目录的方法// 调用getTemporaryDirectory方法// _requestTempDirectory函数,当调用时,会触发获取临时目录的操作// setState 是一个由 Flutter 框架提供的方法,用于通知框架小部件树中的状态已发生变化,需要重新构建。这是更新 UI 的一种机制。// 在 setState 的闭包中,我们执行异步操作来获取临时目录。// _tempDirectory 是一个 Future 类型的变量,它将存储 getTemporaryDirectory() 方法的返回值。// getTemporaryDirectory() 是 path_provider 包中的方法,它返回一个 Future<Directory?> 对象,该对象将在异步操作完成后提供临时目录的信息。void _requestTempDirectory() {setState(() {_tempDirectory = getTemporaryDirectory();});}// 其他请求目录的方法,例如请求应用文档目录、支持目录等// ... 其他请求目录的方法 ...void _requestAppDocumentsDirectory() {setState(() {_appDocumentsDirectory = getApplicationDocumentsDirectory();});}void _requestAppSupportDirectory() {setState(() {_appSupportDirectory = getApplicationSupportDirectory();});}void _requestAppLibraryDirectory() {setState(() {_appLibraryDirectory = getLibraryDirectory();});}void _requestAppCacheDirectory() {setState(() {_appCacheDirectory = getApplicationCacheDirectory();});}void _requestExternalStorageDirectory() {setState(() {_externalDocumentsDirectory = getExternalStorageDirectory();});}void _requestExternalStorageDirectories(StorageDirectory type) {setState(() {_externalStorageDirectories = getExternalStorageDirectories(type: type);});}void _requestExternalCacheDirectories() {setState(() {_externalCacheDirectories = getExternalCacheDirectories();});}void _requestDownloadsDirectory() {setState(() {_downloadsDirectory = getDownloadsDirectory();});}@overrideWidget build(BuildContext context) {// 重写build方法来构建UIreturn Scaffold(appBar: AppBar(title: Text(widget.title),),body: Center(//child: ListView(children: <Widget>[Column(children: <Widget>[// 第一个子组件:Padding// 使用Padding小部件为内部组件添加内边距// 设置四周的内边距为16.0逻辑像素// 使用ElevatedButton小部件创建一个凸起的按钮// 为按钮设置一个点击事件处理函数// 设置按钮的文字,使用const修饰因为它不会改变Padding(padding: const EdgeInsets.all(16.0),child: ElevatedButton(onPressed: _requestTempDirectory,child: const Text('获取临时目录',),),),// 第二个子组件:FutureBuilder// 使用FutureBuilder小部件来根据Future的状态构建不同的UI// future属性设置为我们之前定义的_tempDirectory变量// 回去获取这个_tempDirectory的变量,然后返回// builder属性设置为我们自定义的_buildDirectory方法FutureBuilder<Directory?>(future: _tempDirectory, builder: _buildDirectory,),],),Column(children: <Widget>[Padding(padding: const EdgeInsets.all(16.0),child: ElevatedButton(onPressed: _requestAppDocumentsDirectory,child: const Text('获取应用程序文档目录',),),),FutureBuilder<Directory?>(future: _appDocumentsDirectory,builder: _buildDirectory,),],),Column(children: <Widget>[Padding(padding: const EdgeInsets.all(16.0),child: ElevatedButton(onPressed: _requestAppSupportDirectory,child: const Text('获取应用程序支持目录',),),),FutureBuilder<Directory?>(future: _appSupportDirectory,builder: _buildDirectory,),],),Column(children: <Widget>[Padding(padding: const EdgeInsets.all(16.0),child: ElevatedButton(onPressed:Platform.isAndroid ? null : _requestAppLibraryDirectory,child: Text(Platform.isAndroid? '应用程序库目录不可用': '获取应用程序库目录',),),),FutureBuilder<Directory?>(future: _appLibraryDirectory,builder: _buildDirectory,),],),Column(children: <Widget>[Padding(padding: const EdgeInsets.all(16.0),child: ElevatedButton(onPressed: _requestAppCacheDirectory,child: const Text('获取应用程序缓存目录',),),),FutureBuilder<Directory?>(future: _appCacheDirectory,builder: _buildDirectory,),],),Column(children: <Widget>[Padding(padding: const EdgeInsets.all(16.0),child: ElevatedButton(onPressed: !Platform.isAndroid? null: _requestExternalStorageDirectory,child: Text(!Platform.isAndroid? '外部存储不可用': '获取外部存储目录',),),),FutureBuilder<Directory?>(future: _externalDocumentsDirectory,builder: _buildDirectory,),],),Column(children: <Widget>[Padding(padding: const EdgeInsets.all(16.0),child: ElevatedButton(onPressed: !Platform.isAndroid? null: () {_requestExternalStorageDirectories(StorageDirectory.music,);},child: Text(!Platform.isAndroid? '外部目录不可用': '获取外部存储目录',),),),FutureBuilder<List<Directory>?>(future: _externalStorageDirectories,builder: _buildDirectories,),],),Column(children: <Widget>[Padding(padding: const EdgeInsets.all(16.0),child: ElevatedButton(onPressed: !Platform.isAndroid? null: _requestExternalCacheDirectories,child: Text(!Platform.isAndroid? '外部目录不可用': '获取外部缓存目录',),),),FutureBuilder<List<Directory>?>(future: _externalCacheDirectories,builder: _buildDirectories,),],),Column(children: <Widget>[Padding(padding: const EdgeInsets.all(16.0),child: ElevatedButton(onPressed: Platform.isAndroid || Platform.isIOS? null: _requestDownloadsDirectory,child: Text(Platform.isAndroid || Platform.isIOS? '下载目录不可用': '获取下载目录',),),),FutureBuilder<Directory?>(future: _downloadsDirectory,builder: _buildDirectory,),],),],),),);}
}

怎么才能查看到这个写入的文件?

我在这个应用中写了写入文件的操作
但是我无法打开这个安卓中的路径,因为需要root手机才能打开

I/flutter (32505): Directory: '/data/user/0/com.example.shop/app_flutter'
I/flutter (32505): 已经写入
'/data/user/0/com.example.shop/app_flutter/str.txt'

没【root】时,查看这个目录的权限是没有的
在这里插入图片描述

在手机中写入json文件txt文件等等
flutter中进行安卓手机写入文件操作
在安卓手机中创建文件并写入

// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.// ignore_for_file: public_member_api_docsimport 'dart:io';import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Path Provider',theme: ThemeData(primarySwatch: Colors.blue,),home: const MyHomePage(title: 'Path Provider'),);}
}// MyHomePage是一个有状态的组件,它显示了如何获取和显示不同目录的路径
class MyHomePage extends StatefulWidget {// 构造函数,接收一个标题const MyHomePage({super.key, required this.title});// 标题是一个必填参数final String title;@overrideState<MyHomePage> createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {// 定义MyHomePage的状态// 定义多个Future对象来存储获取目录的结果// 为什么要把变量定义在这里?Future<Directory?>? _tempDirectory;Future<Directory?>? _appSupportDirectory;Future<Directory?>? _appLibraryDirectory;Future<Directory?>? _appDocumentsDirectory;Future<Directory?>? _appCacheDirectory;Future<Directory?>? _externalDocumentsDirectory;Future<List<Directory>?>? _externalStorageDirectories;Future<List<Directory>?>? _externalCacheDirectories;Future<Directory?>? _downloadsDirectory;// 获取future中的快照数据,进行判断// 这个snapshot有4个值【1AsyncSnapshot.withError 2AsyncSnapshot.nothing() 3AsyncSnapshot.waiting() 4AsyncSnapshot.withData】// 对这个异步数据快照进行判断// 当异步操作完成时=ConnectionState.done// 判断(snapshot.hasError)与(snapshot.hasData)与【特殊】// 分别对应不同的数据构建// 最后返回1个组件去进行渲染Widget _buildDirectory(BuildContext context, AsyncSnapshot<Directory?> snapshot) {// 根据snapshot的状态和数据构建不同的Text小部件Text text = const Text('1');if (snapshot.connectionState == ConnectionState.done) {if (snapshot.hasError) {text = Text('Error: ${snapshot.error}');} else if (snapshot.hasData) {text = Text('path: ${snapshot.data!.path}');} else {text = const Text('路径不可用');}}return Padding(padding: const EdgeInsets.all(16.0), child: text);// 添加内边距并返回Text}// 构建外部存储目录列表显示的WidgetWidget _buildDirectories(BuildContext context, AsyncSnapshot<List<Directory>?> snapshot) {// 根据snapshot的状态和数据构建不同的Text小部件Text text = const Text('1');if (snapshot.connectionState == ConnectionState.done) {if (snapshot.hasError) {text = Text('Error: ${snapshot.error}');} else if (snapshot.hasData) {final String combined =snapshot.data!.map((Directory d) => d.path).join(', ');text = Text('paths: $combined');} else {text = const Text('path unavailable');}}return Padding(padding: const EdgeInsets.all(16.0), child: text);}// 请求获取临时目录的方法// 调用getTemporaryDirectory方法// _requestTempDirectory函数,当调用时,会触发获取临时目录的操作// setState 是一个由 Flutter 框架提供的方法,用于通知框架小部件树中的状态已发生变化,需要重新构建。这是更新 UI 的一种机制。// 在 setState 的闭包中,我们执行异步操作来获取临时目录。// _tempDirectory 是一个 Future 类型的变量,它将存储 getTemporaryDirectory() 方法的返回值。// getTemporaryDirectory() 是 path_provider 包中的方法,它返回一个 Future<Directory?> 对象,该对象将在异步操作完成后提供临时目录的信息。void _requestTempDirectory() {setState(() {_tempDirectory = getTemporaryDirectory();});}// 其他请求目录的方法,例如请求应用文档目录、支持目录等// ... 其他请求目录的方法 ...void _requestAppDocumentsDirectory() {setState(() {_appDocumentsDirectory = getApplicationDocumentsDirectory();});}void _requestAppSupportDirectory() {setState(() {_appSupportDirectory = getApplicationSupportDirectory();});}void _requestAppLibraryDirectory() {setState(() {_appLibraryDirectory = getLibraryDirectory();});}void _requestAppCacheDirectory() {setState(() {_appCacheDirectory = getApplicationCacheDirectory();});}void _requestExternalStorageDirectory() {setState(() {_externalDocumentsDirectory = getExternalStorageDirectory();});}void _requestExternalStorageDirectories(StorageDirectory type) {setState(() {_externalStorageDirectories = getExternalStorageDirectories(type: type);});}void _requestExternalCacheDirectories() {setState(() {_externalCacheDirectories = getExternalCacheDirectories();});}void _requestDownloadsDirectory() {setState(() {_downloadsDirectory = getDownloadsDirectory();});}// 定义获取【应用程序文档目录】,并且在该目录中创建【str.txt】文件Future<File> _getApplicationDocumentsDirectoryFile() async {final dir =await getApplicationDocumentsDirectory();print(dir);return File('${dir.path}/str.txt');
}/*定义一个写入数据的方法1:获取应用程序文档目录中创建的【str.txt】文件2:对这个【str.txt】文件进行写入*/Future<void> writeString() async{final file =await _getApplicationDocumentsDirectoryFile();await file.writeAsString("我是老六");print("已经写入");}/*定义一个读取数据的方法1:获取应用程序文档目录中创建的【str.txt】文件2:对这个【str.txt】文件进行读取*/Future<void> readString() async {try{// 获取文件路径final file =await _getApplicationDocumentsDirectoryFile();// 读取文件中的内容final result =await file.readAsString();print(result);} catch(e){print(e);}}@overrideWidget build(BuildContext context) {// 重写build方法来构建UIreturn Scaffold(appBar: AppBar(title: Text(widget.title),),body: Center(//child: ListView(children: <Widget>[Column(children: <Widget>[// 第一个子组件:Padding// 使用Padding小部件为内部组件添加内边距// 设置四周的内边距为16.0逻辑像素// 使用ElevatedButton小部件创建一个凸起的按钮// 为按钮设置一个点击事件处理函数// 设置按钮的文字,使用const修饰因为它不会改变Padding(padding: const EdgeInsets.all(16.0),child: ElevatedButton(onPressed: _requestTempDirectory,child: const Text('获取临时目录',),),),// 第二个子组件:FutureBuilder// 使用FutureBuilder小部件来根据Future的状态构建不同的UI// future属性设置为我们之前定义的_tempDirectory变量// 回去获取这个_tempDirectory的变量,然后返回// builder属性设置为我们自定义的_buildDirectory方法FutureBuilder<Directory?>(future: _tempDirectory, builder: _buildDirectory,),],),Column(children: <Widget>[Padding(padding: const EdgeInsets.all(16.0),child: ElevatedButton(onPressed: _requestAppDocumentsDirectory,child: const Text('获取应用程序文档目录',),),),FutureBuilder<Directory?>(future: _appDocumentsDirectory,builder: _buildDirectory,),],),Column(children: <Widget>[Padding(padding: const EdgeInsets.all(16.0),child: ElevatedButton(onPressed: _requestAppSupportDirectory,child: const Text('获取应用程序支持目录',),),),FutureBuilder<Directory?>(future: _appSupportDirectory,builder: _buildDirectory,),],),Column(children: <Widget>[Padding(padding: const EdgeInsets.all(16.0),child: ElevatedButton(onPressed:Platform.isAndroid ? null : _requestAppLibraryDirectory,child: Text(Platform.isAndroid? '应用程序库目录不可用': '获取应用程序库目录',),),),FutureBuilder<Directory?>(future: _appLibraryDirectory,builder: _buildDirectory,),],),Column(children: <Widget>[Padding(padding: const EdgeInsets.all(16.0),child: ElevatedButton(onPressed: _requestAppCacheDirectory,child: const Text('获取应用程序缓存目录',),),),FutureBuilder<Directory?>(future: _appCacheDirectory,builder: _buildDirectory,),],),Column(children: <Widget>[Padding(padding: const EdgeInsets.all(16.0),child: ElevatedButton(onPressed: !Platform.isAndroid? null: _requestExternalStorageDirectory,child: Text(!Platform.isAndroid? '外部存储不可用': '获取外部存储目录',),),),FutureBuilder<Directory?>(future: _externalDocumentsDirectory,builder: _buildDirectory,),],),Column(children: <Widget>[Padding(padding: const EdgeInsets.all(16.0),child: ElevatedButton(onPressed: !Platform.isAndroid? null: () {_requestExternalStorageDirectories(StorageDirectory.music,);},child: Text(!Platform.isAndroid? '外部目录不可用': '获取外部存储目录',),),),FutureBuilder<List<Directory>?>(future: _externalStorageDirectories,builder: _buildDirectories,),],),Column(children: <Widget>[Padding(padding: const EdgeInsets.all(16.0),child: ElevatedButton(onPressed: !Platform.isAndroid? null: _requestExternalCacheDirectories,child: Text(!Platform.isAndroid? '外部目录不可用': '获取外部缓存目录',),),),FutureBuilder<List<Directory>?>(future: _externalCacheDirectories,builder: _buildDirectories,),],),Column(children: <Widget>[Padding(padding: const EdgeInsets.all(16.0),child: ElevatedButton(onPressed: Platform.isAndroid || Platform.isIOS? null: _requestDownloadsDirectory,child: Text(Platform.isAndroid || Platform.isIOS? '下载目录不可用': '获取下载目录',),),),FutureBuilder<Directory?>(future: _downloadsDirectory,builder: _buildDirectory,),],),Column(children: <Widget>[Padding(padding: const EdgeInsets.all(16.0),child: ElevatedButton(onPressed: writeString,child: const Text('写入数据到文件中',),),),Padding(padding: const EdgeInsets.all(16.0),child: ElevatedButton(onPressed: readString,child: const Text('读取刚刚写入文件的数据',),),),],),],),),);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/590109.html

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

相关文章

06-编辑器

gedit编辑器 gedit是Ubuntu系统自带的编辑器&#xff0c;可以用来轻度编辑和记录一些内容。 在终端中我们通过以下命令打开&#xff1a; gedit 要打开或者新建的文件名虽然Ubuntu的图形界面也能通过gedit打开文件&#xff0c;但是用终端打开gedit可以动用更高的权限&#xff…

Rust线程间通信通讯channel的理解和使用

Channel允许在Rust中创建一个消息传递渠道&#xff0c;它返回一个元组结构体&#xff0c;其中包含发送和接收端。发送端用于向通道发送数据&#xff0c;而接收端则用于从通道接收数据。不能使用可变变量的方式&#xff0c;线程外面修改了可变变量的值&#xff0c;线程里面是拿不…

某团App之mtgsig2.4算法分析

1.3mtgsig参数分析&#xff1a; a0&#xff1a;mtgsig版本号&#xff08;这里分析2.4&#xff09; a1&#xff1a;appkey&#xff08;相同版本app此值固定&#xff09; a3&#xff1a;Android设备版本 a4&#xff1a;时间戳 a5&#xff1a;加密的设备信息1 a6&#xff1a;固定值…

并发编程之线程池的应用以及一些小细节的详细解析

线程池在实际中的使用 实际开发中&#xff0c;最常用主要还是利用ThreadPoolExecutor自定义线程池&#xff0c;可以给出一些关键的参数来自定义。 在下面的代码中可以看到&#xff0c;该线程池的最大并行线程数是5&#xff0c;线程等候区&#xff08;阻塞队列)是3&#xff0c;即…

利用sqoop实现sql表数据导入到Hadoop

1.在开发这创建好sql表后&#xff0c;开始执行下面步骤 2.sqoop的安装路径&#xff0c;我这里放在以下位置 3. 进入到option2脚本中&#xff0c;下面是脚本里的内容 下面四点要根据情况随时更改&#xff1a; 1>jdbc:mysql://node00:3306/数据库名 2>sid,sname->前…

循序渐进丨MogDB Ustore存储引擎剖析

背景 MogDB 数据库支持不同的存储引擎&#xff0c;其中行存引擎有Astore和Ustore&#xff0c;目前大部分客户场景使用的是Astore&#xff0c;也就是 Append Update&#xff08;追加更新&#xff09;模式。 Astore对于业务中的增、删以及HOT Update&#xff08;即同一页面内更新…

智慧城市治理:构建全域覆盖的城市时空感知体系

TSINGSEE青犀AI算法中台是一款平台型产品&#xff0c;专注于提供各行业中小场景部署解决方案。平台具备接入广、性能强、支持跨平台、芯片国产化等特点&#xff0c;可提供丰富的视图接入能力和智能分析能力。 平台采用了多项IT高新技术&#xff0c;包括视频编解码技术、嵌入式…

Web 后台项目,权限如何定义、设置、使用:菜单权限、按钮权限 ts element-ui-Plus

Web 后台项目&#xff0c;权限如何定义、设置、使用&#xff1a;菜单权限、按钮权限 ts element-ui-Plus 做一个后台管理项目&#xff0c;里面需要用到权限管理。这里说一下权限定义的大概&#xff0c;代码不多&#xff0c;主要讲原理和如何实现它。 一、权限管理的原理 权限…

elementui 实现一个固定位置的Pagination(分页)组件

系列文章目录 一、elementui 导航菜单栏和Breadcrumb 面包屑关联 二、elementui 左侧导航菜单栏与main区域联动 三、elementui 中设置图片的高度并支持PC和手机自适应 四、 elementui 实现一个固定位置的Pagination&#xff08;分页&#xff09;组件 文章目录 系列文章目录…

酷开科技智慧AI让酷开系统大显身手!

时代的浪潮汹涌而至&#xff0c;人工智能作为技术革新和产业变革的重要引擎&#xff0c;正深刻地影响着各行各业。在科技的海洋中&#xff0c;AI技术正逐渐渗透到我们的日常生活中&#xff0c;为我们带来前所未有的便捷和智慧。酷开科技用技术探索智慧AI&#xff0c;别看它只是…

企业家见识、智慧与胸怀:超越知识、聪明与财富的核心价值​

一、引言 在商界的风云变幻中&#xff0c;企业家们不仅需要拥有丰富的知识和聪明才智&#xff0c;更需要具备远见卓识、深刻智慧和博大胸怀。正如某知名企业家所言&#xff1a;“企业家见识比知识重要&#xff0c;智慧比聪明重要&#xff0c;胸怀比财富重要。”&#xff0c;这…

从零开始:Flutter应用上架iOS的完整流程解析

引言 &#x1f680; Flutter作为一种跨平台的移动应用程序开发框架&#xff0c;为开发者提供了便利&#xff0c;使他们能够通过单一的代码库构建出高性能、高保真度的应用程序&#xff0c;同时支持Android和iOS两个平台。然而&#xff0c;完成Flutter应用程序的开发只是第一步…

Spring Boot--文件上传和下载

文件上传和下载 前言文件上传1、以MultipartFile 接口流文件&#xff0c;流的名称需要和前台传过来的名称对应上2、获取到文件名称截取后缀3、为了放置文件名重复使用uuid来随机生成id后缀4、判断转存路径中是否有这个文件夹如果没有就创建5、将文件存储到转存的目录中 文件下载…

python的垃圾回收

引用计数器为主&#xff0c;标记清除和分代回收为辅 1 引用计数器 在python程序运行时&#xff0c;会根据数据类型的不同找到其对应的结构体&#xff0c;根据结构体中的字段来进行创建相关的数据&#xff0c;然后将对象添加到refchain双像链表中&#xff0c;每个对象中的ob_re…

线上研讨会 | 应对汽车毫米波雷达设计中的电磁挑战

智能汽车、新能源汽车最近几年一直是汽车行业关注的热点&#xff0c;随着5G技术越来越普及&#xff0c;汽车智能化发展将越来越迅速。从传统汽车到智能汽车&#xff0c;不是简单功能的增强&#xff0c;而是从单一功能的交通工具变成可移动的办公和娱乐空间&#xff0c;成为物联…

概率论经典题目-二维随机变量及分布--由概率密度求分布函数和概率

解答&#xff1a; 由概率密度函数求解分布函数的公式可知&#xff1a; 辅助图形加以确定积分上下限

CSS - 你知道都有哪些方案可以隐藏一个元素吗

难度级别&#xff1a;初级及以上 提问概率&#xff1a;70% 在前端开发中&#xff0c;隐藏元素并不是一个陌生的话题。根据业务场景不同&#xff0c;实现方案也多种多样&#xff0c;在面试中&#xff0c;应该尽可能多的描述自己遇到过的场景&…

【ElasticSearch】分词器(ElasticSearchIK分词器)

文章目录 1. 分词器介绍2. ik 分词器安装3. 分词器的使用 1. 分词器介绍 •IKAnalyzer 是一个开源的&#xff0c;基于java语言开发的轻量级的中文分词工具包•是一个基于Maven构建的项目•具有60万字/秒的高速处理能力•支持用户词典扩展定义 2. ik 分词器安装 IK 分词器安装…

浅谈分布式光伏电站的运维管理

摘要&#xff1a;随着近些年我国对节能降耗关注力度的持续加大&#xff0c;为满足人们不断增长的电能需求&#xff0c;光伏发电产业得到迅猛发展&#xff0c;其中分布式光伏发电的比重持续增长。在打赢脱贫攻坚战的大背景下&#xff0c;国家电网公司探索出一条“阳光扶贫”的扶…

vue实现导出列表为xlsx文件

1.安装依赖 npm install --save xlsx file-saver 2.引入依赖 import FileSaver from file-saver; import * as XLSX from xlsx; 3.代码实现 <el-button type"primary" click"exportData">导出数据</el-button><el-tableid"table_ex…