私有存儲目錄
❶ 如何建立自己的私有雲存儲
建立私有雲存儲的步驟:
第一步:預裝軟體。
ownCloud 內核是用php5寫的,支持sqlite、MySQL、Oracle以及PostgreSQL等資料庫。為了簡單,我們將用MySQL資料庫。在你的Linux系統下你需要安裝以下軟體:
PHP 安裝包:php5, php5-gd, php-xml- parser,php5-intl
資料庫驅動:php5-mysql(如果你使用其他資料庫,需要安裝相應的資料庫以及驅動)
Curl 安裝包:curl, libcurl3, php5-curl
SMB 客戶端:smbclient (這個用來掛載windows共享文件夾的)
Web 伺服器:apache2
如果你的Linux是基於Debian的,你可以運行下面的命令一鍵安裝所有的軟體:
$ sudo apt-get install apache2 php5 php5-gd php-xml-parser php5-intl php5-sqlite php5-mysql smbclient curl libcurl3 php5-curl mysql-server
第二步:安裝ownCloud——設置web 根目錄。
從 網站上下載最新版的ownCloud,對於本教程,我們使用owncloud-4.5.6 版本。到此,我們需要設置web伺服器的根目錄,對於基於Debian發行版的Linux系統,根目錄為/var/www,將ownCloud安裝包解壓到此目錄下。
第三步:安裝ownCloud——配置web伺服器。
這一步我們要為 ownCloud配置Apache伺服器,OwnCloud需要啟用 Apache上 .htaccess 文件,.htaccess文件(或者"分布式配置文件")提供了針對目錄改變配置的方法。為了啟用web伺服器上的.htaccess,可以通過 Apache配置文件(基於Den系統是/etc/apache2/sites-enabled/000-default)的 AllowOverride指令來設置。
第四步:安裝OwnCloud——安裝運行。
在瀏覽器中打開 http://localhost/ludcloud ,你會被引導進入ownCloud的安裝界面。
首先你要建立一個管理員帳號,輸入必填的用戶名和密碼就完成了。為了配置資料庫,點「Advanced」 選擇MySQL,然後輸入MySQL的資料庫名、用戶名和密碼。
點「Finish」 完成安裝過程。
❷ Android - 文件系統與Android11 分區存儲
Android文件系統分為 內部存儲(internal storage) 和 外部存儲(external storage)
1.1 用一個表格來直觀對比一下兩者:
1.2 應用的私有路徑
應用在安裝之後,系統會自動在內部存儲和外部存儲,分別建立應用的私有存儲區域。
內部存儲 : data/user/0/packageName
外部存儲 : storage/emulated/0/android/data/packageName
當應用卸載或者清除數據後,該區域文件會被刪除。
1.3 內外部存儲圖解
Android 10版本中,Google推出 分區存儲 (scoped storage)的功能。
背景 :
分區存儲功能是針對內置的外部存儲來說的,很多應用喜歡在外部存儲的根目錄創建自己的文件夾,比如:storage/emulated/0/***
這樣做的好處:1. 當不斷向該目錄存儲時,應用自己的容量不會變化; 2. 當應用卸載時,該目錄下文件不會被刪除,可用於保存一些可持久性的文件。
但是也有壞處: 1. 對用戶來說,會有很多垃圾文件存在於手機中;2. 只要獲取到Read 和 Write許可權,就可以隨意訪問外部存儲的任何目錄,信息安全存在隱患。
分區存儲 :
除了應用的私有目錄和公共目錄,其他位置都稱為 舊版存儲位置 ,我們需要將舊版存儲位置的數據遷移到能兼容分區存儲的位置。
❸ Android數據存儲之File總結
在使用File存儲App數據時,我們需要了解Android系統的存儲系統。Android的存儲分為內部存儲和外部存儲。
由於Android系統的廠商比較多,對於外部存儲目錄的定義有所不同,可能在根目錄下的mnt,sdcard和storage下。以storage為例,打開emulated/0目錄,外部存儲目錄就出現了。雖然可以通過多種路徑打開外部存儲文件,但是最終他們的路徑是相同的:
mnt:
storage:
sdcard:
外部存儲目錄下包含兩大類:公有目錄和私有目錄
私有目錄:
對比下來External有以下幾點優點:
缺點:
內部存儲與外部存儲許可權申請對比如下:
首先我們要獲取外部存儲目標文件的路徑:
然後確定自己需要創建的文件名,結合上面的到的路徑,創建一個File對象:
Android系統默認數據清理的路徑是,內部存儲目錄中相應的cache文件夾中的文件和外部存儲中相應的cache文件夾中的文件。
你的app的internal storage 目錄是以你的app的包名作為標識存放在Android文件系統的特定目錄下[data/data/com.example.xx]。 從技術上講,如果你設置文件為可讀的,那麼其他app就可以讀取你的internal文件。然而,其他app需要知道你的包名與文件名。若是你沒有設置為可讀或者可寫,其他app是沒有辦法讀寫的。因此只要你使用MODE_PRIVATE ,那麼這些文件就不可能被其他app所訪問。
另外記住一點,內部存儲在你的APP卸載的時候,會一塊被刪除,因此,我們可以在cache目錄裡面放置我們的圖片緩存,而且cache與files的差別在於,如果手機的內部存儲空間不夠了,會自行選擇cache目錄進行刪除,因此,不要把重要的文件放在cache文件裡面,可以放置在files裡面,因為這個文件只有在APP被卸載的時候才會被刪除。還有要注意的一點是,如果應用程序是更新操作,內部存儲不會被刪除,區別於被用戶手動卸載。
不管你是使用 () 來存儲可以共享的文件,還是使用 getExternalFilesDir() 來儲存那些對於你的app來說是私有的文件,有一點很重要,那就是你要使用那些類似DIRECTORY_PICTURES 的API的常量。那些目錄類型參數可以確保那些文件被系統正確的對待。例如,那些以DIRECTORY_RINGTONES 類型保存的文件就會被系統的media scanner認為是ringtone而不是音樂。
在開發中,不建議往內部存儲中寫太多的數據,畢竟空間有限。外部存儲在使用的時候最好能夠將文件存放在私有目錄下,這樣有利於系統維護,也避免用戶的反感。
徹底理解android中的內部存儲與外部存儲
Android存儲挖坑記
緩存文件可以放在哪裡?它們各自的特點是什麼
❹ Android存儲及路徑
分為:內部存儲和外部存儲
如何區分內部存儲和外部存儲:可以從物理和邏輯區分
從物理的角度區分,內部存儲就是手機自帶存儲空間,外部存儲就是外部接入的存儲空間例如SD卡
從邏輯意義上區分,data,system 目錄就是手機的內部存儲,而 mnt 或者 storage目錄下的sdcard0指向的sdcard目錄就是外部存儲。如果是手機自帶的外部存儲被稱為機身外部存儲,外置的SD卡則稱之為外部存儲。當然兩者都稱為外部存儲也沒關系。這里描述的內部存儲和機身外部存儲都屬於機身存儲;
邏輯區分是從4.4以上版本開始的;
獲取內部存儲路徑和api對應關系
1,通過Environment
2,通過上下文Context
Build.VERSION_CODES.LOLLIPOP及以上版本新增的API
Build.VERSION_CODES.N及以上版本新增的API
特點:
1、內部存儲路徑中的文件是分類存儲的,我們無法干涉,除了cache目錄,別的目錄系統不會自動創建
2、除了files目錄,別的目錄我們幾乎都是無法手動操作的
3、別的App幾乎無法訪問內部存儲中的數據,除了用非法手段或者我們主動暴露
4、內部存儲目錄下的文件夾及文件會隨著app的卸載而被系統自動刪除
外部存儲又可分為共有目錄和私有目錄;
私有目錄
私有目錄:不需要訪問許可權
Android 在外部存儲空間中也提供了特殊目錄供App存放私有文件,該路徑為:/storage/emulated/0/Android/data/包名/
注意:應用安裝之後/storage/emulated/0/Android/data/是沒有對應的應用文件夾的,需要手動調用對應的API創建;
獲取私有目錄路徑
共有目錄
共有目錄:需要申請許可權才能訪問
許可權:6.0以上需要動態申請
獲取共有目錄的API 29中已過時:
❺ Android外部存儲ExternalStorage
內存(emory)
內部存儲(ternalStorage)
1)storage或者mnt文件夾下
2) 通過:
Environment.getExternalStorageDirectory()
可以看到外部存儲的位置
3) 公有目錄(DCIM、DOWNLOAD等),要使用需要申請許可權。
4) 私有目錄(Android/data/應用包名),只能被當前應用訪問。
String path= Environment.getExternalStorageDirectory().getAbsolutePath() +"/Mytest.txt";
try {
if (!file.exists()) {
file.createNewFile();
}
}catch (IOException e) {
e.printStackTrace();
}
try {
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream fos=new FileOutputStream(path,true);
String str=infoEdt.getText().toString();
fos.write(str.getBytes());//以位元組流的方式寫入
}catch (IOException e) {
e.printStackTrace();
}
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
其中第二條許可權可能會報錯,這時候解決辦法是:
在報錯的地方添加
tools:ignore="ProtectedPermissions"
同時在manifest標簽里添加;
xmlns:tools="http://schemas.android.com/tools"
FileInputStream fis =new FileInputStream(path);
byte[] b =new byte[1024];
int len = fis.read(b);//讀取fis位元組流,將其存儲在位元組數組b中,並返回數組的長度(位元組的個數)
String str2=new String(b,0,len);
txt.setText(str2);
注意:1、從外部存儲讀取文件不需要許可權
2、Android6.0以上對外部存儲(內存卡)共有目錄的讀寫需要運行時許可權(允許訪問內存卡),這個許可權需要用戶手動開啟,只在AndroidManifest.xml中申請是沒用的。
int permissionContextCompet.checkSelfPermission(context,permission) 檢查是否具有許可權
第一個參數,環境上下文(this),第二個參數,許可權名,Manifest.permission.WRITE_EXTERNAL_STORAGE,返回的是一個int類型的變數,將其與PackageManger.PERMISSION_GRANTED比較,等於則說明有許可權,不等於的話則要動態申請許可權:
if(permission!= PackageManager.PERMISSION_GRANTED){
//沒有許可權,則要申請許可權
}
ActivityCompet.reaquestPermissions(activity,permission,code) 請求許可權,第一個參數:activity 第二個參數:String類型的數組,裡面裝了各種許可權, 當有多項許可權需要申請的時候可以一起申請,第三個參數:一個int類型的請求碼,動態申請許可權的時候會觸發onRequestPermissionsResult()方法,如果在申請的過程中有什麼需要做的操作可以定義在該方法中,第三個參數請求嗎可以幫助知道是那個許可權的申請觸發了這個方法
int permission=ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if(permission!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode==1){
//當前沒有什麼要處理的
}
}
通過:Environment.getExternalStorageDirectory()獲取到的是根目錄,通過在後面拼接目錄名稱,可以訪問到公有目錄
要獲取外部存儲目錄的私有目錄,可以通過:
1)Context.getExternalFilesDir(String type)獲取到SDCard/Android/data/包名/files/目錄,這個目錄下一般存放一些需要長時間保存的數據。這個參數是用於指定文件夾類型的(圖片,音樂,視頻...)。
2)Context。getExternalCacheDir()獲取到SDCard/Android/data/包名/cache/目錄,這個目錄下面一般存放一些臨時的緩存性的數據。
❻ 安卓的存儲機制
安卓的文件存儲分為內部存儲和外部存儲,在安卓早期,手機內置存儲很小,都是用於應用的私有存儲空間,外部存儲就是sdcard。往後發展,手機的內置存儲越來越大,同時也出現了一些不支持sdcard的手機。如今安卓的外部存儲已經不限於sdcard了。
內部存儲
手機內部存儲除了放置應用的私有和系統空間以外都為外部存儲,內部存儲空間有限。對於設備中每一個安裝的 App,系統都會在內部存儲空間的 data/data 目錄下以應用包名為名字自動創建與之對應的文件夾。這個文件夾用於 App 中的 WebView 緩存頁面信息,SharedPreferences 和 SQLiteDatabase 持久化應用相關數據等。
內部存儲包含的文件
外部存儲
在安卓文件的外部存儲部分又分為了應用的私有目錄和共有目錄。
私有目錄
外部的存儲的私有目錄地址可以根據context的相應方法得到。
公共目錄
外部的存儲的公有目錄可以根據Environment的相應方法得到。
創建文件測試
通過file創建data文件
Test 1
Filefile = newFile("data");
try{
//新建文件
booleanbl=file.createNewFile();
//判斷文件創建是否成功
Log.d("myTag","onCreate:"+bl);
}catch(IOExceptione){
e.printStackTrace();
}
運行結果
文件創建失敗
同時文件夾中沒有出現該文件
猜測創建失敗問題來自文件地址的問題
Test 2
Filefile=null;
file=newFile(getCacheDir()+"data");
try{
//新建文件
booleanbl=file.createNewFile();
//判斷文件創建是否成功
Log.d("myTag","onCreate:"+bl);
}catch(IOExceptione){
e.printStackTrace();
}
運行結果
文件創建成功,同時在/data/data/com.example.myapplication的地址處生成了名為cachedata的文件
文件名與預期不同
Test 3
Filefile=null;
file=newFile(getFilesDir()+"data");
try{
//新建文件
booleanbl=file.createNewFile();
//判斷文件創建是否成功
Log.d("myTag","onCreate:"+bl);
}catch(IOExceptione){
e.printStackTrace();
}
運行結果
創建了一個files文件夾及一個filesdata文件
filesdata文件位置:/data/data/com.example.myapplication/filesdata
Test 4
Filefile=null;
file=newFile(getCodeCacheDir()+"data");
try{
//新建文件
booleanbl=file.createNewFile();
//判斷文件創建是否成功
Log.d("myTag","onCreate:"+bl);
}catch(IOExceptione){
e.printStackTrace();
}
運行結果
code_cachedata地址:/data/data/com.example.myapplication/code_cachedata
Test 5
Filefile=null;
file=newFile(getCacheDir().getPath(),"data");
try{
//新建文件
booleanbl=file.createNewFile();
//判斷文件創建是否成功
Log.d("myTag","onCreate:"+bl);
}catch(IOExceptione){
e.printStackTrace();
}
運行結果
成功在cache文件下創建data文件
總結使用file類創建文件時需要詳細的地址,這里的地址可以通過context的getcacheDir()等方法得到
使用openFileinputStream創建
FileInputStreaminputStream=null;
try{
inputStream=openFileInput("data");
}catch(FileNotFoundExceptione){
e.printStackTrace();
}finally{
try{
inputStream.close();
}catch(IOExceptione){
e.printStackTrace();
}
新建了一個文件夾而沒有新建文件
將輸入流改為輸出流後
FileOutputStreamoutputStream=null;
try{
outputStream=openFileOutput("data",MODE_PRIVATE);
}catch(FileNotFoundExceptione){
e.printStackTrace();
}finally{
try{
outputStream.close();
}catch(IOExceptione){
e.printStackTrace();
}
成功創建文件
使用openfilexxxxstream在只輸入文件名進行創建文件時會默認在data/data/包名/files處創建文件,若不存在files文件則會新建一個files文件
File file = new File();
方法會讀取該文件地址的文件,如果沒有也不會報錯。
file.createNewFile();
會向該地址創建一個文件,返回一個bool值以判斷是否創建成功
openFileInputstream/openFileOutputstream都只能操作data/data/包名 處的文件
Tast 6
Filefile;
file=newFile(getExternalCacheDir(),"data");
try{
booleanbl=file.createNewFile();
Log.d("myTag","onCreate:"+bl);
}catch(IOExceptione){
e.printStackTrace();
}
需要讀寫公共空間操作有所區別
Filefile;
file=Environment.(Environment.DIRECTORY_DOWNLOADS);
FilemFile;
mFile=newFile(file,"data");
try{
booleanbl=mFile.createNewFile();
Log.d("myTag","onCreate:"+bl);
}catch(IOExceptione){
e.printStackTrace();
}
需要申明讀寫許可權對於android6.0以上還需要動態申請許可權
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/>
最後附上安卓所有文件存儲的地址的獲取方法