Ⅰ 數據結構的存儲方式有哪幾種
數據結構的存儲方式有順序存儲方法、鏈接存儲方法、索引存儲方法和散列存儲方法這四種。
1、順序存儲方式:順序存儲方式就是在一塊連續的存儲區域一個接著一個的存放數據,把邏輯上相連的結點存儲在物理位置上相鄰的存儲單元里,結點間的邏輯關系由存儲單元的鄰接掛安息來體現。順序存儲方式也稱為順序存儲結構,一般採用數組或者結構數組來描述。
2、鏈接存儲方法:它比較靈活,其不要求邏輯上相鄰的結點在物理位置上相鄰,結點間的邏輯關系由附加的引用欄位表示。一個結點的引用欄位往往指導下一個結點的存放位置。鏈接存儲方式也稱為鏈接式存儲結構,一般在原數據項中增加應用類型來表示結點之間的位置關系。
3、索引存儲方法:除建立存儲結點信息外,還建立附加的索引表來標識結點的地址。它細分為兩類:稠密索引:每個結點在索引表中都有一個索引項,索引項的地址指示結點所在的的存儲位置;稀疏索引:一組結點在索引表中只對應一個索引項,索引項的地址指示一組結點的起始存儲位置。
4、散列存儲方法:就是根據結點的關鍵字直接計算出該結點的存儲地址。
(1)生產數據存儲的方法擴展閱讀
順序存儲和鏈接存儲的基本原理
在順序存儲中,每個存儲空間含有所存元素本身的信息,元素之間的邏輯關系是通過數組下標位置簡單計算出來的線性表的順序存儲,若一個元素存儲在對應數組中的下標位置為i,則它的前驅元素在對應數組中的下標位置為i-1,它的後繼元素在對應數組中的下標位置為i+1。
在鏈式存儲結構中,存儲結點不僅含有所存元素本身的信息,還含有元素之間邏輯關系的信息。數據的鏈式存儲結構可用鏈接表來表示。其中data表示值域,用來存儲節點的數值部分。Pl,p2,…,Pill(1n≥1)均為指針域,每個指針域為其對應的後繼元素或前驅元素所在結點的存儲位置。
在數據的順序存儲中,由於每個元素的存儲位置都可以通過簡單計算得到,所以訪問元素的時間都相同;而在數據的鏈接存儲中,由於每個元素的存儲位置保存在它的前驅或後繼結點中,所以只有當訪問到其前驅結點或後繼結點後才能夠按指針訪問到,訪問任一元素的時間與該元素結點在鏈式存儲結構中的位置有關。
Ⅱ Android中用什麼方法來存儲數據,最常的方式是什麼 像 QQ 微信的數據如何存儲的
Android應用開發中,給我們提供了5種數據的存儲方式
1 使用SharedPreferences存儲數據
2 文件存儲數據
3 sqlite資料庫存儲數據
4 使用ContentProvider存儲數據
5 網路存儲數據
不同的業務邏輯,或者需求,用不同的實現方式,以下是這幾中數據存儲方式的說明用及法:
第一種: 使用SharedPreferences存儲數據
SharedPreferences是Android平台上一個輕量級的存儲類,主要是保存一些常用的配置比如窗口狀態,
一般在Activity中 重載窗口狀態onSaveInstanceState保存一般使用SharedPreferences完成,
它提供了Android平台常規的Long長 整形、Int整形、String字元串型的保存。
SharedPreferences類似過去Windows系統上的ini配置文件,但是它分為多種許可權,
可以全局共享訪問,android123提示最終是以xml方式來保存,整體效率來看不是特別的高,
對於常規的輕量級而言比SQLite要好不少,如果真的存儲量不大可以考慮自己定義文件格式。
xml 處理時Dalvik會通過自帶底層的本地XML Parser解析,比如XMLpull方式,這樣對於內存資源佔用比較好。
它的本質是基於XML文件存儲key-value鍵值對數據,通常用來存儲一些簡單的配置信息。
其存儲位置在/data/data/< >/shared_prefs目錄下。
SharedPreferences對象本身只能獲取數據而不支持存儲和修改,存儲修改是通過Editor對象實現。
實現SharedPreferences存儲的步驟如下:
一、根據Context獲取SharedPreferences對象
二、利用edit()方法獲取Editor對象。
三、通過Editor對象存儲key-value鍵值對數據。
四、通過commit()方法提交數據。
下面是示例代碼:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//獲取SharedPreferences對象
Context ctx = MainActivity.this;
SharedPreferences sp = ctx.getSharedPreferences("SP", MODE_PRIVATE);
//存入數據
Editor editor = sp.edit();
editor.putString("STRING_KEY", "string");
editor.putInt("INT_KEY", 0);
editor.putBoolean("BOOLEAN_KEY", true);
editor.commit();
//返回STRING_KEY的值
Log.d("SP", sp.getString("STRING_KEY", "none"));
//如果NOT_EXIST不存在,則返回值為"none"
Log.d("SP", sp.getString("NOT_EXIST", "none"));
}
}
這段代碼執行過後,即在/data/data/com.test/shared_prefs目錄下生成了一個SP.xml文件,一個應用可以創建多個這樣的xml文件。
SharedPreferences對象與SQLite資料庫相比,免去了創建資料庫,創建表,寫SQL語句等諸多操作,相對而言更加方便,簡潔。
但是SharedPreferences也有其自身缺陷,比如其職能存儲boolean,int,float,long和String五種簡單的數據類型,比如其無法進行條件查詢等。
所以不論SharedPreferences的數據存儲操作是如何簡單,它也只能是存儲方式的一種補充,而無法完全替代如SQLite資料庫這樣的其他數據存儲方式。
第二種: 文件存儲數據
關於文件存儲,Activity提供了openFileOutput()方法可以用於把數據輸出到文件中,具體的實現過程與在J2SE環境中保存數據到文件中是一樣的。
文件可用來存放大量數據,如文本、圖片、音頻等。
默認位置:/data/data/< >/files/***.***。
代碼示例:
public void save(){
try {
FileOutputStream outStream=this.openFileOutput("a.txt",Context.MODE_WORLD_READABLE);
outStream.write(text.getText().toString().getBytes());
outStream.close();
Toast.makeText(MyActivity.this,"Saved",Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e) {
return;
}
catch (IOException e){
return ;
}
}
openFileOutput()方法的第一參數用於指定文件名稱,不能包含路徑分隔符「/」 ,如果文件不存在,Android 會自動創建它。
創建的文件保存在/data/data//files目錄,如: /data/data/cn.itcast.action/files/itcast.txt ,
通過點擊Eclipse菜單「Window」-「Show View」-「Other」,在對話窗口中展開android文件夾,
選擇下面的File Explorer視圖,然後在File Explorer視圖中展開/data/data//files目錄就可以看到該文件。
openFileOutput()方法的第二參數用於指定操作模式,有四種模式,分別為:
Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2
Context.MODE_PRIVATE:為默認操作模式,代表該文件是私有數據,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原文件的內容,如果想把新寫入的內容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式會檢查文件是否存在,存在就往文件追加內容,否則就創建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有許可權讀寫該文件。
MODE_WORLD_READABLE:表示當前文件可以被其他應用讀取;
MODE_WORLD_WRITEABLE:表示當前文件可以被其他應用寫入。
如果希望文件被其他應用讀和寫,可以傳入: openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE); android有一套自己的安全模型,當應用程序(.apk)在安裝時系統就會分配給他一個userid,當該應用要去訪問其他資源比如文件的時候,就需要userid匹配。默認情況下,任何應用創建的文件,sharedpreferences,資料庫都應該是私有的(位於/data/data//files),其他程序無法訪問。
除非在創建時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有這樣其他程序才能正確訪問。
讀取文件示例:
public void load(){
try {
FileInputStream inStream=this.openFileInput("a.txt");
ByteArrayOutputStream stream=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int length=-1;
while((length=inStream.read(buffer))!=-1) {
stream.write(buffer,0,length);
}
stream.close();
inStream.close();
text.setText(stream.toString());
Toast.makeText(MyActivity.this,"Loaded",Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e){
return ;
}
}
對於私有文件只能被創建該文件的應用訪問,
如果希望文件能被其他應用讀和寫,
可以在創建文件時,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE許可權。
Activity還提供了getCacheDir()和getFilesDir()方法: g
etCacheDir()方法用於獲取/data/data//cache目錄 getFilesDir()方法用於獲取/data/data//files目錄。
把文件存入SDCard:
使用Activity的openFileOutput()方法保存文件,文件是存放在手機空間上,
一般手機的存儲空間不是很大,存放些小文件還行,如果要存放像視頻這樣的大文件,是不可行的。
對於像視頻這樣的大文件,我們可以把它存放在SDCard。
SDCard是干什麼的?你可以把它看作是移動硬碟或U盤。
在模擬器中使用SDCard,你需要先創建一張SDCard卡(當然不是真的SDCard,只是鏡像文件)。
創建SDCard可以在Eclipse創建模擬器時隨同創建,也可以使用DOS命令進行創建,
如下: 在Dos窗口中進入android SDK安裝路徑的tools目錄,
輸入以下命令創建一張容量為2G的SDCard,文件後綴可以隨便取,
建議使用.img: mksdcard 2048M D:\AndroidTool\sdcard.img 在程序中訪問SDCard,你需要申請訪問SDCard的許可權。
在AndroidManifest.xml中加入訪問SDCard的許可權如下:
<!-- 在SDCard中創建與刪除文件許可權 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard寫入數據許可權 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
要往SDCard存放文件,程序必須先判斷手機是否裝有SDCard,並且可以進行讀寫。
注意:訪問SDCard必須在AndroidManifest.xml中加入訪問SDCard的許可權。
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File sdCardDir = Environment.getExternalStorageDirectory();//獲取SDCard目錄
File saveFile = new File(sdCardDir, 「a.txt」);
FileOutputStream outStream = new FileOutputStream(saveFile);
outStream.write("test".getBytes());
outStream.close();
}
Environment.getExternalStorageState()方法用於獲取SDCard的狀態,如果手機裝有SDCard,並且可以進行讀寫,那麼方法返回的狀態等於Environment.MEDIA_MOUNTED。
Environment.getExternalStorageDirectory()方法用於獲取SDCard的目錄,當然要獲取SDCard的目錄,你也可以這樣寫:
File sdCardDir = new File("/sdcard"); //獲取SDCard目錄
File saveFile = new File(sdCardDir, "itcast.txt");
//上面兩句代碼可以合成一句:
File saveFile = new File("/sdcard/a.txt");
FileOutputStream outStream = new FileOutputStream(saveFile);
outStream.write("test".getBytes());
outStream.close();
第三種: SQLite資料庫存儲數據
SQLite是輕量級嵌入式資料庫引擎,它支持 SQL 語言,
並且只利用很少的內存就有很好的性能。
此外它還是開源的,任何人都可以使用它。
許多開源項目((Mozilla, PHP, Python)都使用了 SQLite
SQLite 由以下幾個組件組成:SQL 編譯器、內核、後端以及附件。
SQLite 通過利用虛擬機和虛擬資料庫引擎(VDBE),使調試、修改和擴展 SQLite 的內核變得更加方便。
特點:
面向資源有限的設備,
沒有伺服器進程,
所有數據存放在同一文件中跨平台,
可自由復制。
SQLite 基本上符合 SQL-92 標准,和其他的主要 SQL 資料庫沒什麼區別。它的優點就是高效,Android 運行時環境包含了完整的 SQLite。
SQLite 和其他資料庫最大的不同就是對數據類型的支持,創建一個表時,可以在 CREATE TABLE 語句中指定某列的數據類型,但是你可以把任何數據類型放入任何列中。當某個值插入資料庫時,SQLite 將檢查它的類型。如果該類型與關聯的列不匹配,則 SQLite 會嘗試將該值轉換成該列的類型。如果不能轉換,則該值將作為其本身具有的類型存儲。比如可以把一個字元串(String)放入 INTEGER 列。SQLite 稱這為「弱類型」(manifest typing.)。 此外,SQLite 不支持一些標準的 SQL 功能,特別是外鍵約束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 還有一些 ALTER TABLE 功能。 除了上述功能外,SQLite 是一個完整的 SQL 系統,擁有完整的觸發器,交易等等。
Android 集成了 SQLite 資料庫 Android 在運行時(run-time)集成了 SQLite,所以每個 Android 應用程序都可以使用 SQLite 資料庫。
對於熟悉 SQL 的開發人員來時,在 Android 開發中使用 SQLite 相當簡單。但是,由於 JDBC 會消耗太多的系統資源,所以 JDBC 對於手機這種內存受限設備來說並不合適。因此,Android 提供了一些新的 API 來使用 SQLite 資料庫,Android 開發中,程序員需要學使用這些 API。
資料庫存儲在 data/< 項目文件夾 >/databases/ 下。 Android 開發中使用 SQLite 資料庫 Activites 可以通過 Content Provider 或者 Service 訪問一個資料庫。
下面會詳細講解如果創建資料庫,添加數據和查詢資料庫。 創建資料庫 Android 不自動提供資料庫。在 Android 應用程序中使用 SQLite,必須自己創建資料庫,然後創建表、索引,填充數據。
Android 提供了 SQLiteOpenHelper 幫助你創建一個資料庫,你只要繼承 SQLiteOpenHelper 類,就可以輕松的創建資料庫。SQLiteOpenHelper 類根據開發應用程序的需要,封裝了創建和更新資料庫使用的邏輯。
SQLiteOpenHelper 的子類,至少需要實現三個方法:
1 構造函數,調用父類 SQLiteOpenHelper 的構造函數。這個方法需要四個參數:上下文環境(例如,一個 Activity),資料庫名字,一個可選的游標工廠(通常是 Null),一個代表你正在使用的資料庫模型版本的整數。
2 onCreate()方法,它需要一個 SQLiteDatabase 對象作為參數,根據需要對這個對象填充表和初始化數據。
3 onUpgrage() 方法,它需要三個參數,一個 SQLiteDatabase 對象,一個舊的版本號和一個新的版本號,這樣你就可以清楚如何把一個資料庫從舊的模型轉變到新的模型。
第四種 使用ContentProvider存儲數據 ContentProvider其實也是通過資料庫的方式來存儲數據的,因此這里不再做詳細介紹
第五種 網路存儲數據 也就是說將數據保存在伺服器,android上只需要通過httpclient發起一個請求,向伺服器獲取數據即可
Ⅲ 伺服器保存備份數據的三種方式有哪些
D2T (Disk to Tape)方式是傳統保存備份數據方式,基本數據流程為:備份伺服器按照既定策略,在相應時間發出控制命令,將生產伺服器主盤的數據通過LAN或SAN備份到磁帶機或磁帶庫中。 隨著磁帶機及磁帶技術的發展,磁帶機的讀/寫速度及磁帶容量已有了突飛猛進的發展,但由於磁帶機及磁帶是機械設備,其固有的上載、定位、下載、順序讀/寫等特性,決定了當用戶數量大、備份主機數目較多時,備份或恢復速度仍然較慢,尤其對大數據量的恢復。 2. D2D保存備份數據方式 隨著基於SATA磁碟技術的戍熟及價格的下降, D2D (Disk to Disk)方式正逐漸被越來越多的用戶採用,基本數據流程為:備份伺服器按照既定策略,在相應時間發出控制命令,將生產伺服器主盤的數據通過LAN或SAN備份到相應的磁碟設備中。 3. D2D2T保存備份數據方式 D2D2T (Disk to Disk to Tape)方式結合了傳統磁帶的離線管理和磁碟高速備份恢復的特性,基本數據流程為:備份伺服器按照既定策略,在相應時間發出控制命令,將生產伺服器主盤的數據通過LAN或SAN備份到相應的磁碟設備中。 由相應生產主機或備份伺服器(依備份架構而定)在既定時間自動將保存在備份磁碟中的數據復制到磁帶庫中。同時,縮短磁碟中相應備份數據的保存備份數據周期,從而可以將其覆蓋新的備份數據,釋放了備份磁碟的空間。
Ⅳ 大數據存儲的三種方式
大數據存儲的三種方式有:
1、不斷加密:任何類型的數據對於任何一個企業來說都是至關重要的,而且通常被認為是私有的,並且在他們自己掌控的范圍內是安全的。
然而,黑客攻擊經常被覆蓋在業務故障中,最新的網路攻擊活動在新聞報道不斷充斥。因此,許多公司感到很難感到安全,尤其是當一些行業巨頭經常成為攻擊目標時。隨著企業為保護資產全面開展工作,加密技術成為打擊網路威脅的可行途徑。
2、倉庫存儲:大數據似乎難以管理,就像一個永無休止統計數據的復雜的漩渦。因此,將信息精簡到單一的公司位置似乎是明智的,這是一個倉庫,其中所有的數據和伺服器都可以被充分地規劃指定。然而,有些報告指出了反對這種方法的論據,指出即使是最大的存儲中心,大數據的指數增長也不再能維持。
3、備份服務雲端:大數據管理和存儲正在迅速脫離物理機器的范疇,並迅速進入數字領域。除了所有技術的發展,大數據增長得更快,以這樣的速度,世界上所有的機器和倉庫都無法完全容納它。
由於雲存儲服務推動了數字化轉型,雲計算的應用越來越繁榮。數據在一個位置不再受到風險控制,並隨時隨地可以訪問,大型雲計算公司將會更多地訪問基本統計信息。數據可以在這些服務上進行備份,這意味著一次網路攻擊不會消除多年的業務增長和發展。
Ⅳ 數據存儲形式有哪幾種
【塊存儲】
典型設備:磁碟陣列,硬碟
塊存儲主要是將裸磁碟空間整個映射給主機使用的,就是說例如磁碟陣列裡面有5塊硬碟(為方便說明,假設每個硬碟1G),然後可以通過劃邏輯盤、做Raid、或者LVM(邏輯卷)等種種方式邏輯劃分出N個邏輯的硬碟。(假設劃分完的邏輯盤也是5個,每個也是1G,但是這5個1G的邏輯盤已經於原來的5個物理硬碟意義完全不同了。例如第一個邏輯硬碟A裡面,可能第一個200M是來自物理硬碟1,第二個200M是來自物理硬碟2,所以邏輯硬碟A是由多個物理硬碟邏輯虛構出來的硬碟。)
接著塊存儲會採用映射的方式將這幾個邏輯盤映射給主機,主機上面的操作系統會識別到有5塊硬碟,但是操作系統是區分不出到底是邏輯還是物理的,它一概就認為只是5塊裸的物理硬碟而已,跟直接拿一塊物理硬碟掛載到操作系統沒有區別的,至少操作系統感知上沒有區別。
此種方式下,操作系統還需要對掛載的裸硬碟進行分區、格式化後,才能使用,與平常主機內置硬碟的方式完全無異。
優點:
1、 這種方式的好處當然是因為通過了Raid與LVM等手段,對數據提供了保護。
2、 另外也可以將多塊廉價的硬碟組合起來,成為一個大容量的邏輯盤對外提供服務,提高了容量。
3、 寫入數據的時候,由於是多塊磁碟組合出來的邏輯盤,所以幾塊磁碟可以並行寫入的,提升了讀寫效率。
4、 很多時候塊存儲採用SAN架構組網,傳輸速率以及封裝協議的原因,使得傳輸速度與讀寫速率得到提升。
缺點:
1、採用SAN架構組網時,需要額外為主機購買光纖通道卡,還要買光纖交換機,造價成本高。
2、主機之間的數據無法共享,在伺服器不做集群的情況下,塊存儲裸盤映射給主機,再格式化使用後,對於主機來說相當於本地盤,那麼主機A的本地盤根本不能給主機B去使用,無法共享數據。
3、不利於不同操作系統主機間的數據共享:另外一個原因是因為操作系統使用不同的文件系統,格式化完之後,不同文件系統間的數據是共享不了的。例如一台裝了WIN7/XP,文件系統是FAT32/NTFS,而Linux是EXT4,EXT4是無法識別NTFS的文件系統的。就像一隻NTFS格式的U盤,插進Linux的筆記本,根本無法識別出來。所以不利於文件共享。
【文件存儲】
典型設備:FTP、NFS伺服器
為了克服上述文件無法共享的問題,所以有了文件存儲。
文件存儲也有軟硬一體化的設備,但是其實普通拿一台伺服器/筆記本,只要裝上合適的操作系統與軟體,就可以架設FTP與NFS服務了,架上該類服務之後的伺服器,就是文件存儲的一種了。
主機A可以直接對文件存儲進行文件的上傳下載,與塊存儲不同,主機A是不需要再對文件存儲進行格式化的,因為文件管理功能已經由文件存儲自己搞定了。
優點:
1、造價交低:隨便一台機器就可以了,另外普通乙太網就可以,根本不需要專用的SAN網路,所以造價低。
2、方便文件共享:例如主機A(WIN7,NTFS文件系統),主機B(Linux,EXT4文件系統),想互拷一部電影,本來不行。加了個主機C(NFS伺服器),然後可以先A拷到C,再C拷到B就OK了。(例子比較膚淺,請見諒……)
缺點:
讀寫速率低,傳輸速率慢:乙太網,上傳下載速度較慢,另外所有讀寫都要1台伺服器裡面的硬碟來承擔,相比起磁碟陣列動不動就幾十上百塊硬碟同時讀寫,速率慢了許多。
【對象存儲】
典型設備:內置大容量硬碟的分布式伺服器
對象存儲最常用的方案,就是多台伺服器內置大容量硬碟,再裝上對象存儲軟體,然後再額外搞幾台服務作為管理節點,安裝上對象存儲管理軟體。管理節點可以管理其他伺服器對外提供讀寫訪問功能。
之所以出現了對象存儲這種東西,是為了克服塊存儲與文件存儲各自的缺點,發揚它倆各自的優點。簡單來說塊存儲讀寫快,不利於共享,文件存儲讀寫慢,利於共享。能否弄一個讀寫快,利 於共享的出來呢。於是就有了對象存儲。
首先,一個文件包含了了屬性(術語叫metadata,元數據,例如該文件的大小、修改時間、存儲路徑等)以及內容(以下簡稱數據)。
以往像FAT32這種文件系統,是直接將一份文件的數據與metadata一起存儲的,存儲過程先將文件按照文件系統的最小塊大小來打散(如4M的文件,假設文件系統要求一個塊4K,那麼就將文件打散成為1000個小塊),再寫進硬碟裡面,過程中沒有區分數據/metadata的。而每個塊最後會告知你下一個要讀取的塊的地址,然後一直這樣順序地按圖索驥,最後完成整份文件的所有塊的讀取。
這種情況下讀寫速率很慢,因為就算你有100個機械手臂在讀寫,但是由於你只有讀取到第一個塊,才能知道下一個塊在哪裡,其實相當於只能有1個機械手臂在實際工作。
而對象存儲則將元數據獨立了出來,控制節點叫元數據伺服器(伺服器+對象存儲管理軟體),裡面主要負責存儲對象的屬性(主要是對象的數據被打散存放到了那幾台分布式伺服器中的信息),而其他負責存儲數據的分布式伺服器叫做OSD,主要負責存儲文件的數據部分。當用戶訪問對象,會先訪問元數據伺服器,元數據伺服器只負責反饋對象存儲在哪些OSD,假設反饋文件A存儲在B、C、D三台OSD,那麼用戶就會再次直接訪問3台OSD伺服器去讀取數據。
這時候由於是3台OSD同時對外傳輸數據,所以傳輸的速度就加快了。當OSD伺服器數量越多,這種讀寫速度的提升就越大,通過此種方式,實現了讀寫快的目的。
另一方面,對象存儲軟體是有專門的文件系統的,所以OSD對外又相當於文件伺服器,那麼就不存在文件共享方面的困難了,也解決了文件共享方面的問題。
所以對象存儲的出現,很好地結合了塊存儲與文件存儲的優點。
最後為什麼對象存儲兼具塊存儲與文件存儲的好處,還要使用塊存儲或文件存儲呢?
1、有一類應用是需要存儲直接裸盤映射的,例如資料庫。因為資料庫需要存儲裸盤映射給自己後,再根據自己的資料庫文件系統來對裸盤進行格式化的,所以是不能夠採用其他已經被格式化為某種文件系統的存儲的。此類應用更適合使用塊存儲。
2、對象存儲的成本比起普通的文件存儲還是較高,需要購買專門的對象存儲軟體以及大容量硬碟。如果對數據量要求不是海量,只是為了做文件共享的時候,直接用文件存儲的形式好了,性價比高。
Ⅵ android 數據存儲的幾種方式
總體的來講,數據存儲方式有三種:一個是文件,一個是資料庫,另一個則是網路。其中文件和資料庫可能用的稍多一些,文件用起來較為方便,程序可以自己定義格式;資料庫用起稍煩鎖一些,但它有它的優點,比如在海量數據時性能優越,有查詢功能,可以加密,可以加鎖,可以跨應用,跨平台等等;網路,則用於比較重要的事情,比如科研,勘探,航空等實時採集到的數據需要馬上通過網路傳輸到數據處理中心進行存儲並進行處理。 對於Android平台來講,它的存儲方式也不外乎這幾種,按方式總體來分,也是文件,資料庫和網路。但從開發者的角度來講它可以分為以下五種方式: 1.SharedPreferences共享偏好 2.Internal Storage內部存儲空間 3.External Storage外部存儲空間 4.SQLite Database資料庫 5.Internet網路 這幾種方式各自有各自的優點和缺點,要根據不同的實際情況來選擇,而無法給出統一的標准。下面就各種方式談談它們的優缺點,以及最合適的使用情況: 1.Shared Preferences共享偏好 SharedPreferences是用來存儲一些Key/Value類似的成對的基本數據類型,注意,它只能存儲基本數據類型,也即int, long, boolean, String, float。事實上它完全相當於一個HashMap,唯一不同的就是HashMap中的Value可以是任何對象,而SharedPreferences中的值只能存儲基本數據類型(primitive types)。 對於它的使用方法,可以參考Android Developer Guide,這里不重復。 如此來看,最適合SharedPreferences的地方就是保存配置信息,因為很多配置信息都是Key/Value。事實上,在Android當中SharedPreferences使用最多的地方也是用來保存配置(Settings)信息,系統中的Settings中這樣,各個應用中的Settings也是這樣。並且,Android中為了方便的使用SharedPreferences保存配置信息,它來專門有PreferenceActivity用來封裝。也就是說如果你想在應用程序中創建配置(Settings),你可以直接使用PreferenceActivity和一些相關的專門為Preference封裝的組件,而不用再直接去創建,讀取和保存SharedPreference,Framework中的這些組件會為你做這些事。 再談談一些使用SharedPreference時的技巧,它只能保存基本數據類型,但假如我想保存一個數組,怎麼辦?可以把數據進行處理,把它轉化成一個String,取出的時候再還原就好了;再如,如想保存一個對象,怎麼辦,同樣,可以把對象序列化成為字元序列,或轉成String(Object.toString()),或是把它的HashCode(Object.hashCode())當成Value保存進去。 總之,SharedPreferences使用起來十分的方便,可以靈活應用,因為它簡單方便,所以能用它就盡量不要用文件或是資料庫。 1.Internal Storage內部存儲空間 所謂的內部存儲與外部存儲,是指是否是手機內置。手機內置的存儲空間,稱為內部存儲,它是手機一旦出廠就無法改變,它也是手機的硬體指標之一,通常來講手機內置存儲空間越大意味著手機價格會越貴(很多地方把它稱為手機內存,但我們做軟體的知道,這並不準確,內存是指手機運行時存儲程序,數據和指令的地方;這里應該是手機內部存儲的簡稱為內存,而並非嚴格意義上的內存)。 內部存儲空間十分有限,因而顯得可貴,所以我們要盡可能避免使用;另外,它也是系統本身和系統應用程序主要的數據存儲所在地,一旦內部存儲空間耗盡,手機也就無法使用了。所以對於內部存儲空間,我們要盡量避免使用。上面所談到的Shared Preferences和下面要談到的SQLite資料庫也都是存儲在內部存儲空間上的。 Android本身來講是一個Linux操作系統,所以它的內部存儲空間,對於應用程序和用戶來講就是「/data/data"目錄。它與其他的(外部的存儲)相比有著比較穩定,存儲方便,操作簡單,更加安全(因為可以控制訪問許可權)等優點。而它唯一的缺點就是它比較有限,比較可貴。 雖然,可以非常容易的知道程序本身的數據所在路徑,所有的應用程序的數據路徑都是「/data/data/app-package-name/」,所有的程序用到的數據,比如libs庫,SharedPreferences都是存放在這個路徑下面。但我們在使用的時候最好不要,或是千萬不要直接引用這個路徑。 使用內部存儲主要有二個方式,一個是文件操作,一個是文件夾操作。無論哪種方式,Context中都提供了相應的函數來支持,使用Context不但操作簡單方便,最重要的是Context會幫助我們管理這些文件,也可以方便幫助我們控制文件的訪問許可權。先來系統的說下Context中關於文件和文件夾操作的函數有哪些。 a. 創建一個文件,並打開成一個文件輸出流,需要提供一個String,作為文件名 1.FileOutputStream output = Context.openOutputFile(filename, Context.MODE_PRIVATE); 2.output.write(data);// use output to write whatever you like 3.output.close(); 1.FileOutputStream output = Context.openOutputFile(filename, Context.MODE_PRIVATE); output.write(data);// use output to write whatever you like output.close(); b. 同樣,想打開一個文件作為輸入的話,也是只需要提供文件名 1.FileInputStream input = Context.openInputFile(filename); 2.input.read(); 3.input.close(); 1.FileInputStream input = Context.openInputFile(filename); input.read(); input.close(); c. 列出所有的已創建的文件 1.String[] files = Context.fileList(); 2.for (String file : files) { 3. Log.e(TAG, "file is " + file); 4.} 1.String[] files = Context.fileList(); for (String file : files) { Log.e(TAG, "file is " + file); } d. 刪除文件,能創建就要能夠刪除,當然也會提供了刪除文件的介面,它也非常簡單,只需要提供文件名 1.if (Context.deleteFile(filename)) { 2. Log.e(TAG, "delete file " + filename + " sucessfully「); 3.} else { 4. Log.e(TAG, "failed to delete file " + filename); 5.} 1.if (Context.deleteFile(filename)) { Log.e(TAG, "delete file " + filename + " sucessfully「); } else { Log.e(TAG, "failed to delete file " + filename); } e. 獲取文件已創建文件的路徑,它返回一個文件對象用於操作路徑 1.File fileDir = Context.getFileDir(); 2.Log.e(TAG, "fileDir " + fileDir.getAbsolutePath(); 1.File fileDir = Context.getFileDir(); Log.e(TAG, "fileDir " + fileDir.getAbsolutePath(); f. 創建一個目錄,需要傳入目錄名稱,它返回 一個文件對象用到操作路徑 1.File workDir = Context.getDir(dirName, Context.MODE_PRIVATE); 2.Log.e(TAG, "workdir " + workDir.getAbsolutePath(); 1.File workDir = Context.getDir(dirName, Context.MODE_PRIVATE); Log.e(TAG, "workdir " + workDir.getAbsolutePath(); g. 以File對象方式查看所創建文件,需要傳入文件名,會返迴文件對象 1.File store = Context.openFileStreamPath(filename); 2.Log.e(TAG, "store " + store.length()); 1.File store = Context.openFileStreamPath(filename); Log.e(TAG, "store " + store.length()); h. 獲取Cache路徑,無需要傳入參數,返迴文件對象 1.File cachedir = Context.getCacheDir(); 2.Log.e(TAG, "cachedir " + cacheDir.getAbsolutePath()); 1.File cachedir = Context.getCacheDir(); Log.e(TAG, "cachedir " + cacheDir.getAbsolutePath()); 總結一下文件相關操作,可以得出以下三個特點: 1. 文件操作只需要向函數提供文件名,所以程序自己只需要維護文件名即可; 2. 不用自己去創建文件對象和輸入、輸出流,提供文件名就可以返回File對象或輸入輸出流 3. 對於路徑操作返回的都是文件對象。 如前所述,內部存儲空間有限,可貴,安全,穩定,所以應該用來保存比較重要的數據,比如用戶信息資料,口令秘碼等不需要與其他應用程序共享的數據。也可以用來創建臨時文件,但一定要注意及時刪除。另外,對於內部存儲還有一個非常重要的特點,那就是在應用程序被卸載時,應用程序在內部存儲空間的文件數據將全部被刪除。系統這樣做的原因很簡單,就是因為內部存儲很有限,它必須保證它的可用性,因為一旦添滿,系統將無法再正常工作。 1.External Storage外部存儲空間 再來談談手機外部存儲空間,與內部存儲空間相對,外部存儲空間是指手機出廠的時候不存在,用戶在使用時候可以自由添加的外部存儲介質比如TS卡,SD卡等快閃記憶體儲介質。這些快閃記憶體介質由最初的空間小價格貴,到現在的大容量價格便宜,所以幾乎每個支持外部存儲的手機上面都有大容量(大於等於2G)的快閃記憶體卡。 Android也是不例外,它完全支持外部存儲介質。其實更確切的說,它是要依賴於外部存儲卡的,因為對於Android系統,如果沒有外部存儲卡,很多的系統應用無法使用,比如多媒體相關的應用程序無法使用。雖然Android很依賴,但是外部存儲卡也有它自身的特點,它最大的優點就是存儲空間大,基本上你可無限制的使用,也不怎麼擔心去清除數據。就目前來看,很多程序都在使用外部存儲卡,但很少有程序去主動清理數據,所以無論你的SD卡有多大,它的可用空間卻越來越少。與內部存儲不同的是,當程序卸載時,它在外部存儲所創建的文件數據是不會被清除的。所以清理外部存儲空間的責任丟給了用戶自己,每隔一段時間就去查看下SD卡,發現無用數據立馬刪除。外部存儲的缺點就是不是很穩定,對於Android手機來講可以說,很不穩定,本身快閃記憶體介質就容易出問題,SD卡處於不能正常使用的狀態十分多。 先來說說外部存儲相關的使用方法和API: a. Check media availability檢查介質的可用性 如前所述,外部存儲介質的穩定性十分的差,所以在使用之前一定要先檢查它的可用性,如果可用再去用 view plain to clipboardprint? 1.final String state = Environment.getExternalStorageState(); 2.if (state.equals(Environment.MEDIA_MOUNTED) || state.equals(Environment.MEDIA_READ_ONLY)) {// sd card is ready to us } view plain to clipboardprint? 1.final String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED) || state.equals(Environment.MEDIA_READ_ONLY)) {// sd card is ready to us } final String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED) || state.equals(Environment.MEDIA_READ_ONLY)) {// sd card is ready to us } b. Get the directory獲取外部存儲卡的路徑 事實上,外部存儲卡的路徑是「/mnt/sdcard",所以你直接這樣寫去訪問也能訪問的到。鑒於可讀性和可移植性的考慮,建議這樣寫: view plain to clipboardprint? 1.File sdcardDir = Environment.getExternalStorageDirectory(); view plain to clipboardprint? 1.File sdcardDir = Environment.getExternalStorageDirectory(); File sdcardDir = Environment.getExternalStorageDirectory(); c. For API 8 or greater, there are some other useful APIs helping to manager files and directories. 如果你使用API 8(Android 2.2)或者更高,那麼SDK中又多了幾個操作外部存儲文件和路徑的介面,文檔中也建議開始者更加規范的使用SD卡。比如,創建相應的目錄去存儲相應的數據,Music,Picture,Video等。應用程序目錄也變成了"/Android/data/package-name/data"。具體的使用可以參考文檔,這里不重復。當然,就像編程規范一樣,這里只是規范,你完全可以不遵守它,但出於可讀性和可移植性,還是建議按照文檔建議的去做。 下面總結一下使用時應該注意的一些和外部存儲的特點: a. 外部存儲卡不是隨時想用就能夠用的,所以一定要記得在使用之前檢查它的可用性 b. 存儲在外部存儲卡上的數據是所有應用程序都可見,用戶也可見(使用FileManager),所以安全性不是很好,雖然文檔聲稱可以在外部存儲卡上寫程序私有數據,但貌似沒用,用FileManager仍然可以刪除或編輯文件(Market上面的FileManager功能都十分的強大,能讓用戶看到SD卡中的所有文件,和操作能看到的文件)。 c. Android手機支持把外部存儲卡Mount至PC做為U盤,當連接數據線時,這時SD卡變成了U盤連接到了另外的操作系統中。什麼意思,就是在Android當中雖然有的文件屬性(隱藏,私有等),到了PC上就不一定管用了,用戶在PC上可以隨意操作文件(這就是第二點中所提及的)。 d. 如果使用外部存儲卡保存數據,一定要額外做好異常處理:外部存儲卡不可用時把數據存入哪裡;可用的時候再怎麼同步數據(這是比較頭疼的地方,可行的做法就是當SD卡不可用時不準用戶寫數據,但這用戶體驗又不是很好,但如你所知,很多應用都這么干);你的數據被破壞了。當然常見的異常也要考慮,比如空間滿了,無法寫入,磁碟壞道等。 1.SQLite Database資料庫 Android對資料庫的支持很好,它本身集成了SQLite資料庫,每個應用都可以方便的使用它,或者更確切的說,Android完全依賴於SQLite資料庫,它所有的系統數據和用到的結構化數據都存儲在資料庫中。 它具有以下優點: a. 效率出眾,這是無可否認的 b. 十分適合存儲結構化數據 c. 方便在不同的Activity,甚至不同的應用之間傳遞數據 先前有一篇文章講到了不同Activity和不同應用之間傳遞數據的麻煩,特別是對於大型數據結構,因為Activity雖是Java對象,但去無法像使用其他類對象那樣去創建一個實例然後使用它,更無法給Activity加上Setters和Getters(雖然這樣做了沒有編譯錯誤)。比較好的解決方案就是把結構化數據寫入資料庫,然後在不同的Activity之間傳遞它們的Uri。 d. 由專門的ContentProvider來幫忙管理和維護資料庫 e. 可以方便的設置訪問許可權,私有還是都可見 f. 操作方便,使用標準的CRUDE語句,ContentResolver.query(), update(), delete() insert(),詳見ContentResolver g. 良好的可移植性和通用性,用標準的SQL語句就能實現CRUDE 對於它的使用方法可以去參考文檔,這里也說不清楚。 1.Internet網路 網路是比較不靠譜的一個,因為移動終端的網路穩定性,以及所產生的流量讓人傷不起,用戶更傷不起。但若是對於非常重要的實時數據,或是需要發送給遠端伺服器處理的,也可以考慮使用網路實時發送。這已經有先例了,Apple和Google就是這樣,iPhone設備和Android設備都會在用戶不知情的情況 下收集用戶的信息,然後又在用戶不知情的情況 下發送到Apple和Google的伺服器上,也就是所謂的「跟蹤門」。除此之外,智能手機(特別是Android和火熱的iPhone)上面的應用程序都會偷偷的在後台運行,收集用戶數據,然後再偷偷的發伺服器,直接傷害是用戶流量,請看先前的文章。 對比這幾種方式,可以總結下: 1. 簡單數據和配置信息,SharedPreference是首選; 2. 如果SharedPreferences不夠用,那麼就創建一個資料庫 3. 結構化數據,一定要創建資料庫,雖然這稍顯煩鎖,但是好處無窮 4. 文件就是用來存儲文件(也即非配置信息或結構化數據),如文本文件,二進制文件,PC文件,多媒體文件,下載的文件等等。 5. 盡量不要創建文件 6. 如果創建文件,如果是私密文件或是重要文件,就存儲在內部存儲,否則放到外部存儲 7. 不要收集用戶數據,更不要發到網路上,雖然你們也有很多無奈。用戶也無奈,也無辜,但更無助 平台為開發者准備了這么多的方式固然是一件好事,但我們要認清每一種的優點和缺點,根據實際情況選擇最合適的。還有一個原則就是最簡單原則,也就是說能用簡單的方式處理,就不要用復雜的方式。
Ⅶ 數據的存儲方法有哪些
什麼是分布式存儲
分布式存儲是一種數據存儲技術,它通過網路使用企業中每台機器上的磁碟空間,這些分散的存儲資源構成了虛擬存儲設備,數據分布存儲在企業的各個角落。
分布式存儲系統,可在多個獨立設備上分發數據。傳統的網路存儲系統使用集中存儲伺服器來存儲所有數據。存儲伺服器成為系統性能的瓶頸,也是可靠性和安全性的焦點,無法滿足大規模存儲應用的需求。分布式網路存儲系統採用可擴展的系統結構,使用多個存儲伺服器共享存儲負載,利用位置伺服器定位存儲信息,不僅提高了系統的可靠性,可用性和訪問效率,而且易於擴展。
分布式存儲的優勢
可擴展:分布式存儲系統可以擴展到數百甚至數千個這樣的集群大小,並且系統的整體性能可以線性增長。
低成本:分布式存儲系統的自動容錯和自動負載平衡允許在低成本伺服器上構建分布式存儲系統。此外,線性可擴展性還能夠增加和降低伺服器的成本,並實現分布式存儲系統的自動操作和維護。
高性能:無論是針對單個伺服器還是針對分布式存儲群集,分布式存儲系統都需要高性能。
易用性:分布式存儲系統需要提供方便易用的界面。此外,他們還需要擁有完整的監控和操作工具,並且可以輕松地與其他系統集成。
杉岩分布式統一存儲USP
利用分布式技術將標准x86伺服器的HDD、SSD等存儲介質抽象成資源池,對上層應用提供標準的塊、文件、對象訪問介面,
同時提供清晰直觀的統一管理界面,減少部署和運維成本,滿足高性能、高可靠、高可擴展性的大規模存儲資源池的建設需求。
Ⅷ Windows store app 數據存儲的幾種方法
在開發過程中,我們需要將某些數據保存下來,比如一些設置信息以及一些用戶主動去保存的數據。待用戶下次打開應用時候,再自動載入這些信息。下面將介紹windows8開發中如何存儲數據。
一.本地數據存儲
在wp中我們使用IsolatedStorageSettings進行本地數據存儲,在win8中也提供類似的方法進行存儲,我們使用ApplicationData.Current.LocalSettings。下面將通過實例進行描述:
在節目上添加姓名、年齡、性別三個控制項,代碼如下:
1 <Grid Background="{StaticResource }">
2 <StackPanel Margin="40,40,0,0">
3 <StackPanel Orientation="Horizontal" Height="80">
4 <TextBlock Text="姓名:" Style="{StaticResource BasicTextStyle}" FontSize="20" VerticalAlignment="Center"/>
5 <TextBox x:Name="txtName" Text="" FontSize="24" Width="200" Height="40"/>
6 </StackPanel>
7 <StackPanel Orientation="Horizontal" Height="80">
8 <TextBlock Text="年齡:" Style="{StaticResource BasicTextStyle}" FontSize="20" VerticalAlignment="Center"/>
9 <TextBox x:Name="txtAge" Text="" FontSize="24" Width="200" Height="40"/>
10 </StackPanel>
11 <StackPanel Orientation="Horizontal" Height="80">
12 <TextBlock Text="性別:" Style="{StaticResource BasicTextStyle}" FontSize="20" VerticalAlignment="Center"/>
13 <ComboBox x:Name="cbxSex" Height="40" Width="200" SelectedIndex="1">
14 <ComboBoxItem>男</ComboBoxItem>
15 <ComboBoxItem>女</ComboBoxItem>
16 </ComboBox>
17 </StackPanel>
18 <StackPanel Orientation="Horizontal">
19 <Button Content="保存" Width="100" Height="40" FontSize="16" Click="btnSave_Click"></Button>
20 <Button Margin="20,0,0,0" Content="讀取" Width="100" Height="40" FontSize="16" Click="btnRead_Click"></Button>
21 <Button Margin="20,0,0,0" Content="清空" Width="100" Height="40" FontSize="16" Click="btnClear_Click"></Button>
22 </StackPanel>
23 </StackPanel>
24 </Grid>
新建類AppDataHelper.cs,引用命名空間using Windows.Storage。我們將讀取和保存封裝成共通,方便調用。
保存數據:
1 /// <summary>
2 /// 保存數據
3 /// </summary>
4 /// <typeparam name="T">數據類型</typeparam>
5 /// <param name="key">鍵</param>
6 /// <param name="value">值</param>
7 public static void Save<T>(string key, T value)
8 {
9 ApplicationData.Current.LocalSettings.Values[key] = value;
10 }
讀取數據:
1 /// <summary>
2 /// 讀取數據
3 /// </summary>
4 /// <typeparam name="T">數據類型</typeparam>
5 /// <param name="key">鍵</param>
6 /// <returns>值</returns>
7 public static T Read<T>(string key)
8 {
9 if (ApplicationData.Current.LocalSettings.Values.ContainsKey(key))
10 {
11 return (T)ApplicationData.Current.LocalSettings.Values[key];
12 }
13 else
14 {
15 return default(T);
16 }
17 }
刪除數據:
1 /// <summary>
2 /// 移除數據
3 /// </summary>
4 /// <param name="key">鍵</param>
5 /// <returns>成功true/失敗false</returns>
6 public static bool Remove(string key)
7 {
8 return ApplicationData.Current.LocalSettings.Values.Remove(key);
9 }
我們只要在需要存儲或者讀取數據的地方進行調用,就可以了。
1 private void btnSave_Click(object sender, RoutedEventArgs e)
2 {
3 AppDataHelper.Save<string>("name", txtName.Text.Trim());
4 AppDataHelper.Save<int>("age", int.Parse(txtAge.Text.Trim())); 5 AppDataHelper.Save<int>("sex", cbxSex.SelectedIndex);
6 }
7 private void btnRead_Click(object sender, RoutedEventArgs e)
8 {
9 txtName.Text = AppDataHelper.Read<string>("name");
10 txtAge.Text = AppDataHelper.Read<int>("age").ToString();
11 cbxSex.SelectedIndex = AppDataHelper.Read<int>("sex");
12 }
那麼我們保存的數據保存到哪裡去了呢?我們應該如何找到他們,別急,我們下面開始找保持的數據。
打開C:\Users\\AppData\Local\Packages\ \Settings\settings.dat, user_name對應當前登錄的用戶名,packpage對應此應用的唯一標識,在Package.appxmanifest中我們可以找到它:
此文件為.dat後綴,我們需要用注冊表工具打開它,開始->運行(win+R鍵),輸入Regedit,在打開的窗口裡面選擇 HKEY_LOCAL_MACHINE,
然後選擇文件->載入配置單元,選擇settings.dat文件,打開填入項名稱,確定之後可以看到保存的數據會顯示在其中。
雙擊name,打開,我們可以看到存儲的數據值。
那麼我們是否能像wp那樣存儲一個對象到本地存儲呢,答案是否定的。win8中只能存儲一些簡單類型,如int、bool、string等
下面有一個Person對象:
1 [DataContract]
2 public class Person
3 {
4 [DataMember]
5 public string Name { get; set; }
6 [DataMember]
7 public int Age { get; set; }
8 [DataMember]
9 public int Sex { get; set; }
10 }
進行存儲:
1 Person person = new Person()
2 {
3 Name = txtName.Text.Trim(),
4 Age = int.Parse(txtAge.Text.Trim()),
5 Sex = cbxSex.SelectedIndex
6 };
7 AppDataHelper.Save<Person>("person", person);
此時會報錯,提示不支持此類型存儲。
那麼我們應該如何存儲一個對象呢?下面我們將介紹文件存儲。
二.文件存儲
對於那些比較復雜的數據類型,我們需要將其存儲為文件的形式存儲在應用中。StorageFile的存儲,以文件的形式進行存儲存入數據。
新建一個類,LocalFileHelper.cs
存儲文件:
1 /// <summary>
2 /// 存儲數據/// </summary>
3 /// <typeparam name="T">數據類型</typeparam>
4 /// <param name="fileName">文件名稱</param>
5 /// <param name="data">數據</param>
6 /// <returns>無</returns>
7 public async static Task Save<T>(string fileName, T data)
8 {
9 //取得當前程序存放數據的目錄
10 StorageFolder folder = Windows.Storage.ApplicationData.Current.LocalFolder;
11 //創建文件,如果文件存在就覆蓋
12 StorageFile file = await folder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
13 using (Stream newFileStream = await file.OpenStreamForWriteAsync())
14 {
15 DataContractSerializer ser = new DataContractSerializer(typeof(T));
16 ser.WriteObject(newFileStream, data);
17 newFileStream.Dispose();
18 }
19 }
讀取文件:
1 /// <summary>
2 /// 讀取數據
3 /// </summary>
4 /// <typeparam name="T">數據類型</typeparam>
5 /// <param name="fileName">文件名稱</param>
6 /// <returns>數據</returns>
7 public async static Task<T> Read<T>(string fileName)
8 {
9 T t = default(T);
10 try
11 {
12 StorageFolder folder = Windows.Storage.ApplicationData.Current.LocalFolder;
13 StorageFile file = await folder.GetFileAsync(fileName);
14 if (file == null)
15 return t;
16 Stream newFileStream = await file.OpenStreamForReadAsync();
17 DataContractSerializer ser = new DataContractSerializer(typeof(T));
18 t = (T)ser.ReadObject(newFileStream);
19 newFileStream.Dispose();
20 return t;
21 }
22 catch (Exception)
23 {
24 return t;
25 }
26 }
刪除文件:
1 /// <summary>
2 /// 刪除文件
3 /// </summary>
4 /// <param name="fileName">文件名稱</param>
5 /// <returns>成功true/失敗false</returns>
6 public async static Task<bool> Delete(string fileName)
7 {
8 StorageFolder folder = Windows.Storage.ApplicationData.Current.LocalFolder;
9 StorageFile file = await folder.GetFileAsync(fileName);
10 if (file != null)
11 {
12 try
13 {
14 await file.DeleteAsync();
15 }
16 catch (Exception)
17 {
18 return false;
19 }
20 }
21 return true;
22 }
使用方法:
1 Person person = new Person()
2 {
3 Name = txtName.Text.Trim(),
4 Age = int.Parse(txtAge.Text.Trim()),
5 Sex = cbxSex.SelectedIndex
6 };
7
8 await LocalFileHelper.Save<Person>("person.xml", person);
9
10 List<Person> list = new List<Person>();
11 list.Add(person);
12 list.Add(person);
13 await LocalFileHelper.Save<List<Person>>("personList.xml", list);
14
15
16 Person newPerson = await LocalFileHelper.Read<Person>("person.xml");
17 List<Person> personList = await LocalFileHelper.Read<List<Person>>("personList.xml");
文件在哪裡?
同樣我們打開C:\Users\user_name\AppData\Local\Packages\package\LocalState文件夾,下面就有我們保持的文件,打開文件,保存文件的內容格式為xml:
<Person xmlns="http://schemas.datacontract.org/2004/07/StorageSample" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Age>
27</Age><Name>BetterChaner</Name><Sex>0</Sex></Person>
三.使用Sqlite進行數據存儲
Sqlite現已提供對Windows RT和Windows 8 Metro應用的支持.
首先,在工具,選擇擴展與更新中,選擇聯機,在搜索框內輸入sqlite,找到SQLite for Window Runtime,下載安裝。
安裝完成之後重啟VS,右擊項目添加引用,選擇Windows->擴展,找到Mircosoft visual c++ runtime package和sqlite for windows runtime,打勾,確定。
由於目前Sqlite不支持AnyCPU,所以我們將項目改成X64,右擊解決方案,屬性,修改之。
然後右擊引用,選擇管理Nuget程序包,聯機搜索sqlite-net,下載安裝。
我們發現項目工程中多了2個類文件,SQLite.cs和SQLiteAsync.cs
基本操作:
1 //創建資料庫
2 string dbRootPath = Windows.Storage.ApplicationData.Current.LocalFolder.Path;
3 SQLiteConnection db = new SQLiteConnection(Path.Combine(dbRootPath, "myApp.sqlite"));
4
5 //創建表
6 db.CreateTable<Person>();
7
8 //插入一條數據
9 db.Insert(new Person() { Name = "BetterChaner", Age = 27, Sex = 1 });
10
11 //插入多條數據
12 List<Person> list = new List<Person>();
13 list.Add(new Person() { Name = "Zhangsan", Age = 27, Sex = 1 });
14 list.Add(new Person() { Name = "Lisi", Age = 32, Sex = 0 });
15 list.Add(new Person() { Name = "Wangwu", Age = 24, Sex = 1 });
16 db.InsertAll(list);
17
18 //查詢數據
19 List<Person> list2 = db.Query<Person>("select * from Person");
20
21 //更新數據
22 SQLiteCommand cmd = db.CreateCommand("update Person set Age=21 where Name='Lisi'");
23 cmd.ExecuteNonQuery();
24
25 //刪除一條數據
26 db.Delete(new Person() { Name = "Zhangsan", Age = 27, Sex = 1 });
27 //刪除全部數據
28 db.DeleteAll<Person>();
數據存儲的位置為:C:\Users\\AppData\Local\Packages\ \LocalState\文件夾下的myApp.sqlite
四.SqlCE
有了Sqilte,SqlCE不太經常會用到了,在這里就不寫出實例了,與wp中類似。
小結
以上為windows store app開發中可以使用的幾種存儲數據的方式,可以根據數據大小、作用以及類型選擇應該使用哪一種存儲方式。
Ⅸ 海量數據存儲有哪些方式與方法
杉岩海量對象存儲MOS,針對海量非結構化數據存儲的最優化解決方案,採用去中心化、分布式技術架構,支持百億級文件及EB級容量存儲,
具備高效的數據檢索、智能化標簽和分析能力,輕松應對大數據和雲時代的存儲挑戰,為企業發展提供智能決策。
1、容量可線性擴展,單名字空間達EB級
SandStone MOS可在單一名字空間下實現海量數據存儲,支持業務無感知的存儲伺服器橫向擴容,為爆炸式增長的視頻、音頻、圖片、文檔等不同類型的非結構化數據提供完美的存儲方案,規避傳統NAS存儲的單一目錄或文件系統存儲空間無法彈性擴展難題
2、海量小文件存儲,百億級文件高效訪問
SandStone MOS基於完全分布式的數據和元數據存儲架構,為海量小文件存儲而生,將企業級NAS存儲的千萬文件量級提升至互聯網規模的百億級別,幫助企業從容應對幾何級增長的海量小文件挑戰。
3、中心靈活部署,容災匯聚分發更便捷
SandStone MOS支持多數據中心靈活部署,為企業數據容災、容災自動切換、多分支機構、數據就近訪問等場景提供可自定義的靈活解決方案,幫助企業實現跨地域多活容災、數據流轉、就近讀寫等,助力業務高速發展。
4、支持大數據和AI,統一數據存儲和分析
SandStone MOS內置文件智能化處理引擎,實現包括語音識別、圖片OCR識別、文件格式轉換等批量處理功能,結合標簽檢索能力還可實現語音、證件照片檢索,從而幫助企業更好地管理非結構化數據。同時,SandStone MOS還支持與Hadoop、Spark等大數據分析平台對接,一套存儲即可滿足企業數據存儲、管理和挖掘的需求。
Ⅹ 保管儲存方式有哪些
保管儲存方式有哪些
保管儲存方式有哪些,任何的東西都有不同的儲存方式,儲存保管在物流過程中起著極為重要的作用,掌握好儲存的方法是非常重要的,儲存的方法有很多,以下分享保管儲存方式有哪些。
保管儲存方式有哪些1
倉庫的保管方式一般有如下五種:
1、地面平放式——將保管物品直接堆放在地面上。
2、托盤平放式——將保管物品直接放在托盤上,再將托盤平放於地面。
3、直接堆放式——將貨物在地面上直接碼放堆積。
4、托盤堆碼式——將貨物直接堆碼在托盤上,再將托盤放在地面上。
5、貨架存放式——將貨物直接碼放在貨架上。
配送中心應首先考慮出入庫的時間和效率,因而較多地著眼於揀選和搬運的方便,保管方式必須與之協調。存儲中心出入庫的頻率較低,應該重視保管,因而首先要考慮保管方式。
保管儲存方式有哪些2
數據儲存有哪些方法
首先,數據儲存分為虛擬儲存,物理儲存,一般來說,如果我們擁有重要的數據,一定要進行三方儲存,也就是一個備份,一個物理儲存,一個虛擬儲存,在理論上,這是最安全的儲存,也不至於因為繁多而造成泄露。
第二,而物理儲存一般表現為可以看得見,摸到的東西,而這類東西一般有u盤,光碟,儲存卡等等。
第三,如果要進行虛擬儲存,那麼,這類一般是寄存在網路,我們可以把數據放在伺服器上,當然,我們殲局每個人並不是人人都有伺服器,而網路現在也有一些網盤可以供給我們使用,不過,這類網盤會有一定的泄露風險。
第四,雖然擁有風險,但是,一般大公司很難出現數據丟失,在理論上,我們數據是絕對安全,在大數據存檔之後,我們可以給自己手機上儲存一份數據並加密即可。
第五,如果是紙張之類的數據,我們可以存放在保險櫃,如果我們要給這類文件虛擬儲存時,我們可以先做掃描件,之後把掃描件儲存在數據端即可。
第六,備份,一般來說,實體或者物理備份存檔的東西最放心,這一點,我們可以把這類東西放在公證處或者部分可以存檔的.銀行進行儲存,一般來說,這類備份會在特定的場合出現,或者特定的物品取出,是最保險之路。
保管儲存方式有哪些3
儲存保管的作用是什麼
一、現代儲存保管在經濟建設中的作用
1、現代倉儲是保證社會再生產順利進行的必要條件
2、是國家滿足急需特需的保障
二、現代倉儲管理在流通領域中的作用
1、儲存是平衡市場供求關系、穩定物價的重要條件
氏搭讓流通儲存可在供過於求時吸納商品,增加儲存,供不應求時吐放商品,以有效地調節供求關系,緩解矛盾。這樣既可保證生產的穩定性,又可防止物價的大起大落,避免生產供應的惡性循環。
2、倉儲是物資供銷管理工作的重要組成部分倉儲活動直接影響到物資管理工作的質量,也直接關繫到物資從實物形態上一直到確定分配供銷的經濟關系的實現。
3、現代倉儲是保持物資原有使用價值的重要手段
三、現代倉儲管理在企業經營中的作用
在采購、生產、銷售的不斷循環枝啟過程中,庫存使各個環節相對獨立的經濟活動成為可能。同時倉儲可以調節各個環節之間由於供求品種及數量的不一致而發生的變化,使采購、生產和銷售等企業經營的各個環節連接起來,起到潤滑劑的作用。