Android Scoped Storage適配完全指南

Android Scoped Storage適配完全指南

關鍵詞:Android、Scoped Storage、適配、存儲權限、文件訪問

摘要:本文將全面介紹Android Scoped Storage的相關知識,從背景出發,詳細解釋核心概念,闡述其原理和架構,給出具體的算法實現步驟,結合項目實戰案例進行代碼解讀,分析實際應用場景,推薦相關工具和資源,探討未來發展趨勢與挑戰。旨在幫助開發者全面掌握Android Scoped Storage的適配方法,順利完成應用的升級改造。

背景介紹

目的和范圍

在Android系統不斷發展的過程中,為了更好地保護用戶的隱私和數據安全,Google推出了Scoped Storage(分區存儲)機制。本指南的目的就是幫助開發者了解Scoped Storage的相關概念、原理和適配方法,使開發者能夠將應用適配到支持Scoped Storage的Android系統上。本指南的范圍涵蓋了Scoped Storage的核心概念、算法原理、代碼實現、實際應用場景等方面。

預期讀者

本指南主要面向Android開發者,尤其是那些需要將應用適配到Android 10及以上系統的開發者。對于初學者來說,本指南可以幫助他們快速了解Scoped Storage的基本知識;對于有一定經驗的開發者來說,本指南可以提供詳細的技術細節和實戰案例,幫助他們更好地完成適配工作。

文檔結構概述

本指南將按照以下結構進行組織:首先介紹核心概念,通過故事引入和通俗易懂的解釋讓讀者了解Scoped Storage的基本概念;然后闡述核心概念之間的關系,并給出原理和架構的文本示意圖及Mermaid流程圖;接著講解核心算法原理和具體操作步驟,結合Python代碼進行詳細闡述;再給出數學模型和公式,并舉例說明;之后通過項目實戰案例,介紹開發環境搭建、源代碼實現和代碼解讀;分析實際應用場景,推薦相關工具和資源;探討未來發展趨勢與挑戰;最后進行總結,提出思考題,并提供常見問題與解答和擴展閱讀參考資料。

術語表

核心術語定義
  • Scoped Storage(分區存儲):Android 10及以上系統引入的一種存儲機制,它限制了應用對外部存儲的訪問權限,使應用只能訪問自己的專屬目錄和特定的公共目錄。
  • 外部存儲(External Storage):指的是設備上可用于存儲文件的非系統分區,例如SD卡或內置的大容量存儲區域。
  • 應用專屬目錄(App-Specific Directory):每個應用在外部存儲中都有自己的專屬目錄,應用可以自由讀寫該目錄下的文件,而不需要額外的權限。
相關概念解釋
  • 存儲權限:在Android系統中,應用訪問外部存儲需要相應的權限。在Scoped Storage之前,應用可以通過請求READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE權限來訪問整個外部存儲;而在Scoped Storage中,權限管理更加精細。
  • 媒體文件(Media Files):如圖片、音頻、視頻等文件,在Scoped Storage中有專門的訪問方式和管理機制。
縮略詞列表
  • SAF(Storage Access Framework):存儲訪問框架,用于在Scoped Storage中讓用戶選擇文件或目錄。

核心概念與聯系

故事引入

想象一下,有一個大型的圖書館,里面存放著各種各樣的書籍。以前,圖書館的管理比較寬松,每個讀者都可以自由地在圖書館的各個角落尋找和借閱書籍。但是,隨著圖書館的規模越來越大,書籍數量越來越多,這種管理方式出現了一些問題,比如有些讀者會隨意亂放書籍,導致其他讀者找不到自己需要的書。于是,圖書館決定采用一種新的管理方式,將圖書館劃分為不同的區域,每個讀者只能在自己的專屬區域內自由活動,而對于公共區域的書籍,需要通過特定的流程才能借閱。Android Scoped Storage就像是這個新的圖書館管理方式,它對應用訪問外部存儲的權限進行了限制,讓數據管理更加有序和安全。

核心概念解釋(像給小學生講故事一樣)

** 核心概念一:Scoped Storage(分區存儲)**
Scoped Storage就像是一個小區,每個應用都有自己的小房子(應用專屬目錄),應用可以在自己的小房子里自由地放東西和拿東西,不需要經過別人的同意。而對于小區里的公共區域(公共目錄),應用不能隨便進去拿東西,需要經過一定的程序才能訪問。

** 核心概念二:應用專屬目錄**
應用專屬目錄就像是每個應用的小秘密基地。在這個基地里,應用可以放心地存儲自己的重要文件,比如游戲應用可以把玩家的游戲記錄存放在這里,音樂應用可以把下載的音樂文件放在這里。其他應用是不能隨便進入這個秘密基地的,只有這個應用自己可以自由進出。

** 核心概念三:SAF(Storage Access Framework)**
SAF就像是一個小秘書,當應用需要訪問公共區域的文件時,它可以幫助應用和用戶進行溝通。比如,當一個圖片編輯應用需要用戶選擇一張圖片進行編輯時,SAF就會彈出一個窗口,讓用戶在公共的圖片庫中選擇一張圖片,然后把這張圖片的信息告訴給應用。

核心概念之間的關系(用小學生能理解的比喻)

Scoped Storage、應用專屬目錄和SAF就像一個團隊,Scoped Storage是隊長,它制定了整個團隊的規則;應用專屬目錄是隊員的私人領地,隊員可以在自己的領地自由活動;SAF是團隊的溝通使者,負責和外界進行溝通。
** 概念一和概念二的關系:**
Scoped Storage規定了應用專屬目錄的存在和使用規則。就像隊長給每個隊員分配了一個私人房間,隊員可以在房間里自由地做自己想做的事情,但是不能超出隊長規定的范圍。
** 概念二和概念三的關系:**
當應用專屬目錄里的資源不夠時,應用就需要通過SAF去公共區域獲取資源。就像隊員在自己的房間里找不到需要的東西時,就需要通過溝通使者去公共區域尋找。
** 概念一和概念三的關系:**
Scoped Storage通過SAF來實現對公共區域文件的訪問控制。隊長通過溝通使者來管理隊員和外界的交流,確保隊員在和外界交流時遵守團隊的規則。

核心概念原理和架構的文本示意圖(專業定義)

Scoped Storage的核心原理是通過權限管理和目錄劃分,限制應用對外部存儲的訪問。應用只能訪問自己的專屬目錄,對于公共目錄的訪問需要通過SAF或特定的API。其架構主要包括應用層、系統層和存儲層。應用層通過調用系統提供的API來訪問存儲層的文件;系統層負責權限管理和文件訪問控制;存儲層則是實際存儲文件的地方,包括應用專屬目錄和公共目錄。

Mermaid 流程圖

訪問專屬目錄
通過SAF訪問
權限管理
文件訪問控制
文件訪問控制
應用
應用專屬目錄
公共目錄
系統層
存儲層

核心算法原理 & 具體操作步驟

訪問應用專屬目錄

在Android中,應用可以通過以下代碼訪問自己的專屬目錄:

// 獲取應用專屬目錄
File appSpecificDir = getExternalFilesDir(null);
if (appSpecificDir != null) {// 在專屬目錄下創建一個新文件File newFile = new File(appSpecificDir, "test.txt");try {// 寫入數據FileOutputStream fos = new FileOutputStream(newFile);fos.write("Hello, Scoped Storage!".getBytes());fos.close();} catch (IOException e) {e.printStackTrace();}
}

通過SAF訪問公共目錄

以下是一個通過SAF選擇圖片文件的示例代碼:

// 創建一個Intent,用于啟動SAF
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
// 啟動SAF
startActivityForResult(intent, PICK_IMAGE_REQUEST_CODE);// 在onActivityResult方法中處理選擇結果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == PICK_IMAGE_REQUEST_CODE && resultCode == RESULT_OK) {if (data != null) {Uri uri = data.getData();try {// 通過Uri獲取文件內容InputStream inputStream = getContentResolver().openInputStream(uri);// 處理文件內容} catch (FileNotFoundException e) {e.printStackTrace();}}}
}

數學模型和公式 & 詳細講解 & 舉例說明

在Scoped Storage的適配中,并沒有嚴格意義上的數學模型和公式。但是,我們可以用一些簡單的邏輯來描述應用對文件的訪問規則。
假設 AAA 表示應用,DappD_{app}Dapp? 表示應用專屬目錄,DpublicD_{public}Dpublic? 表示公共目錄,PPP 表示權限。則應用對文件的訪問規則可以表示為:
A→PselfDapp A \xrightarrow{P_{self}} D_{app} APself??Dapp?
A→PsafDpublic A \xrightarrow{P_{saf}} D_{public} APsaf??Dpublic?
其中,PselfP_{self}Pself? 表示應用訪問自己專屬目錄的權限,這個權限是默認擁有的;PsafP_{saf}Psaf? 表示應用通過SAF訪問公共目錄的權限,需要用戶授權。

舉例說明:一個圖片編輯應用,它可以自由地在自己的專屬目錄中存儲和讀取用戶編輯后的圖片文件,因為它擁有訪問自己專屬目錄的權限;而當它需要從公共的圖片庫中選擇一張圖片進行編輯時,就需要通過SAF,并且獲得用戶的授權。

項目實戰:代碼實際案例和詳細解釋說明

開發環境搭建

  1. 打開Android Studio,創建一個新的Android項目。
  2. 在項目的 build.gradle 文件中,將 targetSdkVersion 設置為29或更高版本,以啟用Scoped Storage。
android {compileSdkVersion 31buildToolsVersion "31.0.0"defaultConfig {applicationId "com.example.scopedstorageapp"minSdkVersion 21targetSdkVersion 31versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}...
}

源代碼詳細實現和代碼解讀

以下是一個完整的示例代碼,包括訪問應用專屬目錄和通過SAF訪問公共目錄:

import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.OpenableColumns;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;public class MainActivity extends AppCompatActivity {private static final int PICK_IMAGE_REQUEST_CODE = 1;private TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = findViewById(R.id.textView);Button writeToAppSpecificDirButton = findViewById(R.id.writeToAppSpecificDirButton);Button pickImageButton = findViewById(R.id.pickImageButton);// 寫入應用專屬目錄的按鈕點擊事件writeToAppSpecificDirButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {writeToAppSpecificDir();}});// 選擇圖片的按鈕點擊事件pickImageButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {pickImage();}});}private void writeToAppSpecificDir() {// 獲取應用專屬目錄File appSpecificDir = getExternalFilesDir(null);if (appSpecificDir != null) {// 在專屬目錄下創建一個新文件File newFile = new File(appSpecificDir, "test.txt");try {// 寫入數據FileOutputStream fos = new FileOutputStream(newFile);fos.write("Hello, Scoped Storage!".getBytes());fos.close();textView.setText("文件已寫入應用專屬目錄:" + newFile.getAbsolutePath());} catch (IOException e) {e.printStackTrace();textView.setText("寫入文件時出錯:" + e.getMessage());}} else {textView.setText("無法獲取應用專屬目錄");}}private void pickImage() {// 創建一個Intent,用于啟動SAFIntent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);intent.addCategory(Intent.CATEGORY_OPENABLE);intent.setType("image/*");// 啟動SAFstartActivityForResult(intent, PICK_IMAGE_REQUEST_CODE);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == PICK_IMAGE_REQUEST_CODE && resultCode == RESULT_OK) {if (data != null) {Uri uri = data.getData();try {// 通過Uri獲取文件內容InputStream inputStream = getContentResolver().openInputStream(uri);// 獲取文件名String fileName = getFileName(uri);textView.setText("已選擇圖片:" + fileName);} catch (IOException e) {e.printStackTrace();textView.setText("讀取文件時出錯:" + e.getMessage());}}}}private String getFileName(Uri uri) {String result = null;if (uri.getScheme().equals("content")) {Cursor cursor = getContentResolver().query(uri, null, null, null, null);try {if (cursor != null && cursor.moveToFirst()) {result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));}} finally {cursor.close();}}if (result == null) {result = uri.getPath();int cut = result.lastIndexOf('/');if (cut != -1) {result = result.substring(cut + 1);}}return result;}
}

代碼解讀與分析

  • writeToAppSpecificDir 方法:該方法用于向應用專屬目錄寫入文件。首先通過 getExternalFilesDir 方法獲取應用專屬目錄,然后在該目錄下創建一個新的文件,并將數據寫入該文件。
  • pickImage 方法:該方法用于啟動SAF,讓用戶選擇一張圖片。通過創建一個 Intent,并設置其動作為 ACTION_OPEN_DOCUMENT,類型為 image/*,然后調用 startActivityForResult 方法啟動SAF。
  • onActivityResult 方法:該方法用于處理SAF選擇結果。當用戶選擇了一張圖片后,會返回一個 Uri,通過該 Uri 可以獲取文件的輸入流,進而讀取文件內容。
  • getFileName 方法:該方法用于獲取文件的名稱。通過 Uri 查詢文件的元數據,從中獲取文件名。

實際應用場景

  • 文件備份與恢復:應用可以將用戶的數據備份到自己的專屬目錄中,當需要恢復數據時,從專屬目錄中讀取文件。
  • 媒體文件處理:圖片、音頻、視頻編輯應用可以通過SAF讓用戶選擇媒體文件進行處理。
  • 文件共享:應用可以通過SAF將自己的文件分享給其他應用,或者接收其他應用分享的文件。

工具和資源推薦

  • Android Studio:官方的Android開發工具,提供了豐富的開發和調試功能。
  • Android Developer Documentation:官方的Android開發文檔,包含了Scoped Storage的詳細介紹和使用指南。
  • Stack Overflow:一個技術問答社區,開發者可以在上面查找關于Scoped Storage適配的相關問題和解決方案。

未來發展趨勢與挑戰

發展趨勢

  • 更加嚴格的權限管理:未來Android系統可能會進一步加強對應用存儲權限的管理,提高用戶數據的安全性。
  • 更好的用戶體驗:SAF可能會不斷優化,提供更加便捷的文件選擇和管理界面,提升用戶體驗。
  • 多設備同步:隨著多設備互聯的發展,Scoped Storage可能會支持更好的文件在不同設備之間的同步和共享。

挑戰

  • 適配難度增加:對于一些舊的應用,適配Scoped Storage可能會面臨較大的難度,需要進行大量的代碼修改。
  • 兼容性問題:不同的Android設備和版本可能會存在一定的兼容性問題,需要開發者進行充分的測試。
  • 用戶教育:用戶可能對新的存儲機制不太熟悉,需要開發者在應用中提供清晰的引導和說明。

總結:學到了什么?

核心概念回顧:

我們學習了Scoped Storage(分區存儲)、應用專屬目錄和SAF(Storage Access Framework)。Scoped Storage是一種新的存儲管理機制,它限制了應用對外部存儲的訪問權限;應用專屬目錄是每個應用在外部存儲中的私人領地,應用可以自由讀寫該目錄下的文件;SAF是一個用于在Scoped Storage中讓用戶選擇文件或目錄的框架。

概念關系回顧:

我們了解了Scoped Storage、應用專屬目錄和SAF之間的關系。Scoped Storage規定了應用專屬目錄的使用規則,應用可以自由訪問自己的專屬目錄;當應用需要訪問公共目錄時,需要通過SAF,并獲得用戶的授權。

思考題:動動小腦筋

思考題一:

你能想到在哪些應用場景中,Scoped Storage的權限管理機制可能會帶來一些不便?

思考題二:

如果你是一個開發者,你會如何優化應用在Scoped Storage下的文件訪問體驗?

附錄:常見問題與解答

問題一:在Android 10以下的系統中,是否需要適配Scoped Storage?

答:不需要,Scoped Storage是從Android 10開始引入的,在Android 10以下的系統中仍然使用傳統的存儲權限管理方式。

問題二:如果應用需要訪問多個公共目錄,應該如何處理?

答:可以多次調用SAF,讓用戶分別選擇不同的目錄。也可以使用 ACTION_OPEN_DOCUMENT_TREE 動作,讓用戶選擇一個目錄樹,從而獲得對該目錄樹及其子目錄的訪問權限。

擴展閱讀 & 參考資料

  • Android Developer Documentation: https://developer.android.com/about/versions/10/privacy/changes#scoped-storage
  • Stack Overflow: https://stackoverflow.com/questions/tagged/scoped-storage

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91442.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91442.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91442.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Typecho集成PHPMailer實現郵件訂閱功能完整指南

文章目錄 Typecho使用PHPMailer實現文章推送訂閱功能詳解 1. 背景與需求分析 1.1 為什么選擇PHPMailer 1.2 功能需求 2. 環境準備與配置 2.1 安裝PHPMailer 2.2 數據庫設計 3. 核心功能實現 3.1 郵件服務封裝類 3.2 訂閱功能實現 3.2.1 訂閱表單處理 3.2.2 確認訂閱處理 3.3 文…

無線-二層組網-直接轉發

文章目錄無線二層組網直接轉發🏡作者主頁:點擊! 🤖Datacom專欄:點擊! ??創作時間:2025年07月16日08點00分 無線二層組網 直接轉發 本地轉發中所有的沿途都需要配置對應VLAN的通過&#xff…

gin go-kratos go-zero框架對比

Gin、Go-Kratos 和 Go-Zero 是 Go 語言中三種常見的服務框架,它們在定位、設計理念、復雜度和適用場景上差異較大。下面我們從功能定位、設計理念、優劣對比、使用建議等維度進行深入對比。🧭 一句話總結框架定位Gin輕量級、高性能的 HTTP 路由框架Go-Kr…

4G模塊 A7670發送英文短信到手機

命令說明ATi顯示產品的標志信息 ATCIMI查詢IMSI ATCICCID從SIM卡讀取ICCID ATCGSN查詢產品序列號 ATCPIN查詢卡狀態 ATCSQ查詢信號強度 ATCGATT查詢當前PS域狀態 ATCREG查詢GPRS注冊狀態 ATCEREG查詢4G注冊狀態 ATCGPADDR查詢PDP地址 ATCMGF選擇短信格式 ATCMGS發送短信流程第一…

歸并排序遞歸法和非遞歸法的簡單簡單介紹

基本思想: 歸并排序(MERGE-SORT)是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合并,得到完全有序的序列;即先使每個…

webrtc之子帶分割下——SplittingFilter源碼分析

文章目錄前言一、頻帶分割過程1.SplittingFilter的創建2.頻帶分割整體流程1)分割時機2)分割規則3)分割核心代碼3.頻帶合并二、算法實現1.實現原理介紹2.All pass QMF系統源碼1)提高精度2)經過串聯全通濾波器3&#xff…

Java運維之Tomcat升級

Tomcat升級準備工作 下述所有過程中,包含了兩種升級方式,一種是備份舊版本的 bin 和 lib,將新版本的 bin 和 lib 對舊版本進行覆蓋;另一種是直接備份舊版本的Tomcat包,運行新版本,將舊版本的配置文件(conf/ * )和應用(webapps/ * )等同步到新版本。 1. 到官網下載指…

MySQL的可重復讀隔離級別實現原理分析

MySQL 的 可重復讀(Repeatable Read, RR) 隔離級別主要通過 多版本并發控制(Multi-Version Concurrency Control, MVCC) 和 鎖機制(特別是間隙鎖) 來實現的。其核心目標是:在一個事務內&#xf…

利用Java自定義格式,循環導出數據、圖片到excel

利用Java自定義格式,循環導出數據、圖片到excel1、自定義格式循環導出數據1.1.設置格式1.1.1、居中樣式1.1.2、應用樣式到合并區域1.1.3、合并單元格1.1.4、設置列寬1.2、寫入數據1.2.1、創建標簽頭部1.2.2、寫入標簽內容2、自定義格式循環導出圖片2.1、設置格式并插…

SAP學習筆記 - 開發45 - RAP開發 Managed App New Service Definition,Metadata Extension

上一章講了在 Data Model View ( CDS View for BO Structure )基礎上創建 Projection View ( CDS View for BO Projection )。 SAP學習筆記 - 開發44 - RAP開發 Managed App 建 Projection View,Provider Contract,用 redirected to 設定父子關系-CSDN博…

React強大且靈活hooks庫——ahooks入門實踐之高級類hook(advanced)詳解

什么是 ahooks? ahooks 是一個 React Hooks 庫,提供了大量實用的自定義 hooks,幫助開發者更高效地構建 React 應用。其中高級類 hooks 是 ahooks 的一個重要分類,專門用于處理一些高級場景,如受控值、事件發射器、性能…

計算機網絡——數據鏈路層(25王道最新版)

數據鏈路層前言數據鏈路層的功能封裝成幀(組幀)字符計數法字節填充法零比特填充法違規編碼法小節差錯控制檢錯編碼奇偶校驗碼CRC校驗碼(循環冗余校驗碼)基本思想如何構造如何檢錯糾錯糾錯編碼海明校驗碼設計思路求解步驟&#xff…

【PTA數據結構 | C語言版】字符串替換算法

本專欄持續輸出數據結構題目集,歡迎訂閱。 文章目錄題目代碼題目 請編寫程序,將給定主串 s 中的子串 sub_s 替換成另一個給定字符串 t,再輸出替換后的主串 s。 輸入格式: 輸入給出 3 個非空字符串,依次為&#xff1a…

事物生效,訂單類內部更新訂單

代碼如下以下代碼1不生效,2生效解決方案1,外層方法加注解,內層不加2,不要拆分方法,把更新訂單操作放在帶事物的大方法中3,拆方法(內部),注入自己,用代理對象調…

非對稱加密:RSA

文章目錄 非對稱加密:RSA 1、RSA 加解密 2、RSA 生成密鑰對(公鑰、私鑰)、加解密 參考資料 非對稱加密:RSA 1、RSA 加解密 <!-- RSA --><!-- 引入jsencrypt庫 --><script src="https://cdn.bootcdn.net/ajax/libs/jsencrypt/3.3.2/jsencrypt.min.js&q…

MongoDB 數據庫 啟用訪問控制

0. 最近服務器安裝了 MongoDB 被勒索了 測試服務器安裝了 MongoDB 等&#xff0c;開放了 27017 對所有 ip。 哈哈哈哈哈哈&#xff0c;問就是有點犯懶&#xff0c;之前都是只允許自己的 ip。 好家伙&#xff0c;然后沒過幾個小時&#xff0c;數據庫集合被清空&#xff0c;只留…

【Unity Sprite屬性拓展】

Unity Inspector 精靈圖預覽為 Unity 中的 Sprite 類型屬性提供了??增強版的 Inspector 顯示??&#xff0c;在保留標準精靈選擇功能的基礎上&#xff0c;添加了大型預覽圖和精靈名稱顯示功能代碼 using UnityEngine; using UnityEditor;// 1?? 告訴 Unity&#xff1a;所有…

細菌實驗入門:濃度測定與菌種鑒定技術詳解

在微生物實驗中&#xff0c;細菌濃度的精準測定和菌種的準確鑒定是兩項基礎且核心的操作。本文將詳細介紹相關技術的原理、操作步驟及注意事項&#xff0c;為新手提供系統性指導。一、細菌濃度測定方法1. 光密度法&#xff08;OD600&#xff09;&#xff1a;快速定量的首選原理…

GaussDB 數據庫架構師修煉(一)數據庫容量規劃

1、容量規劃的定義GaussDB容量規劃是指根據客戶業務系統的負載需求或歷史運行數據&#xff0c;進行合理規劃GaussDB的計算、存儲和網絡資源配置&#xff0c;以滿足業務系統正常使用和未來若干年負載增長訴求的過程。2、容量規劃活動主要步驟需求收集調研生產系統的業務特征&…

hashMap原理(一)

概念HashMap是java中一種非常常用的基于哈希表的數據結構&#xff0c;允許o(1)的時間復雜度進行元素插入&#xff0c;查找&#xff0c;和刪除。它通過”鍵-值“ 對的方式存儲數據。總的來說&#xff1a;HashMap的底層原理&#xff1a;數組鏈表紅黑樹&#xff08;jdk1.8之后還涉…