存儲技術(shù)
android 存儲技術(shù)有保存文件平斩,保存鍵值對(SharedPreferences),保存數(shù)據(jù)庫
本次介紹:文件存儲
存儲方式
android 存儲方式有內(nèi)部和外部瞭稼,外亦可以理解為SD卡忽洛,但是現(xiàn)在的大多數(shù)設(shè)置都不支持SD了,其實這個就等于硬盤非主分區(qū)一樣环肘。內(nèi)就是主分區(qū)欲虚,選擇在內(nèi)存儲的話,開發(fā)者必須謹慎悔雹,因為該分區(qū)空間有限复哆,緩存應(yīng)該選擇在放在外部存儲上欣喧。
技術(shù)準備
java IO
開始
寫文件篇:
內(nèi)部存儲:
可以通過下面方法獲得file的對應(yīng)的目錄
context.getCacheDir() //返回當前應(yīng)用的內(nèi)部緩存目錄
context.getFilesDir() //返回當前應(yīng)用的目錄
context.getDataDir() //返回當前應(yīng)用的data目錄
也可以通過下面一個小例子(來自android官方)
String filename = "myfile";
String string = "Hello world!";
FileOutputStream outputStream;
try {
outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
outputStream.write(string.getBytes());
outputStream.close();
}
catch (Exception e) {
e.printStackTrace();
}
這是一個我的粒子
String filename ="SavaData";
String concent ="this is savaData demo"
FileOutputStream outputStream;
File file =new File(getApplicationContext().getFilesDir());
try {
outputStream = new FileOutputStream(file.getpath());
outputStream.write(content.getBytes());
outputStream.close();
}
catch (Exception e) {
e.printStackTrace();
}
外部存儲:
使用外部存儲需要添加權(quán)限
<!-- 向SD卡中寫入數(shù)據(jù)權(quán)限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 讀取SD卡權(quán)限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
讀取外部存儲肯定少不了對SD的檢測 滑稽 謝謝android官方小例子
/* 檢查外部內(nèi)存是否能寫*/
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
/* 檢查外部存儲是否能讀*/
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;
}
廢話不多說馬上來寫外部SD卡例子,這個例子是寫普通文本為準梯找,寫其他文件也是如此续誉,就是傳入?yún)?shù)一致而已
public boolean saveFileToPath(String filename,String content) throws IOException {
if(isExternalStorageReadable()&& isExternalStorageWritable()) {
//新增一個在SD卡DataSave文件夾
File file = new File(Environment.getExternalStorageDirectory(),"DataSave");
if (!file.exists()) {
file.mkdir();
}
outputStream = new FileOutputStream(file.getPath() + "/" + filename);
outputStream.write(content.getBytes());
outputStream.close();
return true;
}
else {
return false;
}
}
看完上面的小例子是不是覺得很像,沒錯初肉。這就是一通百通酷鸦!
讀寫篇:
好了,我們已經(jīng)知道如何寫一個文件牙咏,我們結(jié)合一下臼隔,我們來讀一個apk內(nèi)置文件寫入SD指定目錄。
public boolean FileReadAndWrite() throws IOException {
if (isExternalStorageReadable() && isExternalStorageWritable()) {
File file = new File(Environment.getExternalStorageDirectory(), "DataSave");
if(file.exists()){
file.mkdir();
}
InputStream input = context.getResources().openRawResource(R.raw.ic_launcher);
OutputStream output = new FileOutputStream(file.getPath()+"/test.png");
byte[] data = new byte[input.available()];
input.read(data);
output.write(data);
output.flush();
//關(guān)閉io流
output.close();
input.close();
return true;
}
else {
return false;
}
}
}
番外篇
操作assets,raw,res目錄文件
assets
資源文件夾妄壶,在main下與res同級摔握,與res不同的是,該目錄下的資源文件在打包apk時丁寄,會按原格式一并被打包氨淌。
在assets下放一個test.html文件,加載該文件:
webview =(WebView)...(R.id.webview);
webview.loadUrl("file:///android_asset/webpage/index.html");
在assets讀取文件
InputStream inputStream = getResource().getAssets().open("test.txt");//不能打開文件夾
讀取列表伊磺、讀取圖片盛正、讀音樂,assets目錄下包含一個images目錄和一個mp3文件my.mp3屑埋,images目錄中包含一張圖片test.jpg:
String[] fileNames = getAssets().list("images/");//讀列表
InputStream inputStream = getAssets().open("images/test.jpg");//讀圖片
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
imageView.setImageBitmap(bitmap);
MediaPlay player =new MediaPlay();
AssetFileDescriptor assetFileDescriptor = getAssets().openFd("my.mp3");//得到asset文件描述符
player.reset();
player.setDataResource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength());
player.prepare();
player.start();