存储技术
android 存储技术有保存文件,保存键值对(SharedPreferences),保存数据库
本次介绍:文件存储
存储方式
android 存储方式有内部和外部,外亦可以理解为SD卡,但是现在的大多数设置都不支持SD了,其实这个就等于硬盘非主分区一样。内就是主分区,选择在内存储的话,开发者必须谨慎,因为该分区空间有限,缓存应该选择在放在外部存储上。
技术准备
java IO
开始
写文件篇:
内部存储:
可以通过下面方法获得file的对应的目录
context.getCacheDir() //返回当前应用的内部缓存目录
context.getFilesDir() //返回当前应用的目录
context.getDataDir() //返回当前应用的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();
}
外部存储:
使用外部存储需要添加权限
<!-- 向SD卡中写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 读取SD卡权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
读取外部存储肯定少不了对SD的检测 滑稽 谢谢android官方小例子
/* 检查外部内存是否能写*/
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卡例子,这个例子是写普通文本为准,写其他文件也是如此,就是传入参数一致而已
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;
}
}
看完上面的小例子是不是觉得很像,没错。这就是一通百通!
读写篇:
好了,我们已经知道如何写一个文件,我们结合一下,我们来读一个apk内置文件写入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();
//关闭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();
网友评论