分為:內(nèi)部存儲和外部存儲
為西峽等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及西峽網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站制作、網(wǎng)站設(shè)計、西峽網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
如何區(qū)分內(nèi)部存儲和外部存儲:可以從物理和邏輯區(qū)分
從物理的角度區(qū)分,內(nèi)部存儲就是手機(jī)自帶存儲空間,外部存儲就是外部接入的存儲空間例如SD卡
從邏輯意義上區(qū)分,data,system 目錄就是手機(jī)的內(nèi)部存儲,而 mnt 或者 storage目錄下的sdcard0指向的sdcard目錄就是外部存儲。如果是手機(jī)自帶的外部存儲被稱為機(jī)身外部存儲,外置的SD卡則稱之為外部存儲。當(dāng)然兩者都稱為外部存儲也沒關(guān)系。這里描述的內(nèi)部存儲和機(jī)身外部存儲都屬于機(jī)身存儲;
邏輯區(qū)分是從4.4以上版本開始的;
獲取內(nèi)部存儲路徑和api對應(yīng)關(guān)系
1,通過Environment
2,通過上下文Context
Build.VERSION_CODES.LOLLIPOP及以上版本新增的API
Build.VERSION_CODES.N及以上版本新增的API
特點(diǎn):
1、內(nèi)部存儲路徑中的文件是分類存儲的,我們無法干涉,除了cache目錄,別的目錄系統(tǒng)不會自動創(chuàng)建
2、除了files目錄,別的目錄我們幾乎都是無法手動操作的
3、別的App幾乎無法訪問內(nèi)部存儲中的數(shù)據(jù),除了用非法手段或者我們主動暴露
4、內(nèi)部存儲目錄下的文件夾及文件會隨著app的卸載而被系統(tǒng)自動刪除
外部存儲又可分為共有目錄和私有目錄;
私有目錄
私有目錄:不需要訪問權(quán)限
Android 在外部存儲空間中也提供了特殊目錄供App存放私有文件,該路徑為:/storage/emulated/0/Android/data/包名/
注意:應(yīng)用安裝之后/storage/emulated/0/Android/data/是沒有對應(yīng)的應(yīng)用文件夾的,需要手動調(diào)用對應(yīng)的API創(chuàng)建;
獲取私有目錄路徑
共有目錄
共有目錄:需要申請權(quán)限才能訪問
權(quán)限:6.0以上需要動態(tài)申請
獲取共有目錄的API 29中已過時:
用 /mnt 獲取全部掛載的存儲路徑。 mnt/sdcard和mnt/sdcard1一個是系統(tǒng)存儲路徑一個是SD卡存儲路徑。
比如要獲取 要獲取libjnixcld.so絕對路徑
File file=new File("/data/data/com.dtBank.app.service/lib/libjnixcld.so")
簡單的說就是/data/data/packagename/你的文件夾名稱/文件名
非隱藏文件可以這樣獲取
以上方法只能獲取動態(tài)共享庫的絕對路徑
對于像minde.dat,public.dat以及其他一些文件獲取路徑的方式如下:
一,將文件放入assets文件夾下面(放入此文件夾下面的文件可通過InputStream in=context.getAssets().open("public.dat"));
獲得其二進(jìn)制形式的流,具體例子如下
package com.dtBank.app.service;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import android.content.Context;
import android.os.Environment;
import android.util.Log;
/**
* 獲得加密文件的路徑
* @author hb
*
*/
public class getEncryptionFilePath {
class Obj{
InputStream in;
String fileDir;
String folder;
}
String lock="";
private void getCryptFilePath(Obj obj){
synchronized(lock){
try{
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File cryptDir= new File(obj.folder);
Log.v("bb","創(chuàng)建的文件夾:"+obj.folder);
cryptDir.mkdirs();
OutputStream os= new FileOutputStream(obj.fileDir);
byte[] buf = new byte[1024*10];
int l;
Log.v("bb","開始寫文件");
InputStream in=obj.in;
while ((l = in.read(buf)) != -1) {
os.write(buf, 0, l);
os.flush();
}
Log.v("bb","文件已寫完");
os.close();
in.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
// 調(diào)用此方法獲取文件在sdcard上面的絕對路徑
public void execute(Context context){
InputStream in=null;
OutputStream out=null;
try{
in =(context.getAssets().open("mixed.dat"));
String fileDir_mixed="/sdcard/xcloudmixed/mixed.dat";
final Obj obj=new Obj();
obj.in=in;
obj.fileDir=fileDir_mixed;
obj.folder="/sdcard/xcloudmixed";
new Thread(){
@Override
public void run(){
getCryptFilePath(obj);
}
}.start();
in =(context.getAssets().open("public.dat"));
String fileDir_public="/sdcard/xcloudpublic/public.dat";
final Obj obj1=new Obj();
obj1.in=in;
obj1.fileDir=fileDir_public;
obj1.folder="/sdcard/xcloudpublic";
new Thread(){
@Override
public void run(){
getCryptFilePath(obj1);
}
}.start();
}catch(Exception e){
e.printStackTrace();
}
}
}
android手機(jī)獲取自帶存儲來路徑和sd卡存儲路徑的方式是:調(diào)用Environment.getExternalStorageDirectory(),返回的存儲源目錄并不是系統(tǒng)內(nèi)置的SD卡目錄。
1.一部分手機(jī)將eMMC存儲掛載到
/mnt/external_sd
、/mnt/sdcard2
等節(jié)點(diǎn)知,而將外置的SD卡掛載到
Environment.getExternalStorageDirectory()這個結(jié)點(diǎn)。
此時,調(diào)用Environment.getExternalStorageDirectory(),則返回外置的SD的路徑。
2.而另一部分手機(jī)直接道將eMMC存儲掛載在Environment.getExternalStorageDirectory()這個節(jié)點(diǎn),而將真正的外置SD卡掛載到/mnt/external_sd、/mnt/sdcard2
等節(jié)點(diǎn)。
此時,調(diào)用Environment.getExternalStorageDirectory(),則返回內(nèi)置的SD的路徑。
String appPath = getApplicationContext().getPackageResourcePath();
/data/app/com.younghare.lepusService-2/base.apk
getApplicationContext().getFilesDir()
getApplicationContext().getFilesDir().getParent()
其實(shí)就是/data/data/包(這是沙盒其他app無法訪問)
String dataAppPath = getApplicationContext().getFilesDir().getParent();
new File(dataAppPath+"/databases/task.db").exists();//返回是true
抽象路徑名的絕對路徑名字符串
String appAbsolute = getApplicationContext().getFilesDir().getAbsolutePath()
/data/user/0/com.younghare.lepusService/files
獲取CachDir
getApplicationContext().getCacheDir()
通過Context.getExternalCacheDir()方法可以獲取到 SDCard/ android /data/你的應(yīng)用包名/cache/目錄,一般存放臨時緩存數(shù)據(jù)
getApplicationContext().getExternalCacheDir()
/storage/emulated/0/Android/data/com.younghare.lepusService/cache
getExternalFilesDir(null)參數(shù)傳入的為null,這樣默認(rèn)訪問的是files文件夾,我們可以指定子文件夾