Android数据存储的外部存储总结
来源:互联网 发布:淘宝钻石展位考试 编辑:程序博客网 时间:2024/04/28 08:17
本文对Android外部存储器ExternalStorage的使用做总结。
一.基本使用
有些Android设备都支持共享的外部储存用来保存文件,这可以是SD卡等可以移除的存储介质, 也可以是手机内存等不可移除的存储介质,保存的名部存储文件都是全局可读的,而且在用户使用USB连接电脑后,可以读取或修改这些文件的数据。
Android的API提供的外部存储器的根目录:
Environment.getExternalStorageDirectory()+”/”
每一个手机的目录结构可能不相同!
这里Android的外部存储器的数据的存储跟java的数据文件的存储基本是一样的,只是路径不一样而已。
文件的存储和读取基本使用的是字节流。
数据存储使用的是输出流FileOutputStream
数据读取使用的是输入流FileInputStream
下面用一个简答的程序回顾一下,文件的存储和读取
(一)xml布局文件设计
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <EditText android:id="@+id/main_et_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Hello World!" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="save" android:text="save" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="read" android:text="read" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="getAllFile" android:text="获取SD卡下面所有的文件名字" /></LinearLayout>
(二)java代码设计
package com.lwz.sd;import android.os.Bundle;import android.os.Environment;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.EditText;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.ArrayList;import java.util.List;/** * 外部存储器,一般指的是就是SD卡空间 * 但是这里的文件的路径就要指定好,每一个手机或模拟器的SD卡的路径是不一定相同 * 所有使用Environment.getExternalStorageDirectory().getAbsoluteFile();最保险 * 而且要注意权限的添加 */public class MainActivity extends AppCompatActivity { EditText et_content; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et_content = (EditText) findViewById(R.id.main_et_content); } //向SD卡的根目录下存放文件 public void save(View v) { //SD卡的根路径 File file = Environment.getExternalStorageDirectory().getAbsoluteFile(); try { //获取输出流 FileOutputStream fos = new FileOutputStream(file + "/aa.txt"); //写信息 fos.write(et_content.getText().toString().getBytes()); //刷新输出流,并关闭流 fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); } } //向SD卡的根目录下读取文件 public void read(View v) { //SD卡的根路径 File file = Environment.getExternalStorageDirectory().getAbsoluteFile(); try { //获取输出流 FileInputStream fis = new FileInputStream(file + "/aa.txt"); //读信息 int len = 0; byte[] buf = new byte[1024]; while ((len = fis.read(buf)) != -1) { //把读取到的信息放到输入框内 et_content.append(new String(buf, 0, len)); } //关闭流 fis.close(); } catch (Exception e) { e.printStackTrace(); } } //显示SD卡下面的所有文件的名字 //这里时间比较久要用线性来搞 public void getAllFile(View view) { //SD卡的根路径 final File file = Environment.getExternalStorageDirectory().getAbsoluteFile(); //保存文件的集合 final List<File> listFile = new ArrayList<>(); //使用线程来遍历文件 new Thread() { @Override public void run() { super.run(); findAllFind(file, listFile); for (File f : listFile) { Log.e("TAG", f.getAbsolutePath()); } } }.start(); } //遍历文件的方法 void findAllFind(File file, List<File> list) { //获取文件夹下所有文件名 File[] files = file.listFiles(); //如果是个空文件夹直接返回方法 if (files == null) { return; } //对每一个文件遍历 for (File file1 : files) { //如果是文件夹,继续遍历 if (file1.isDirectory()) { findAllFind(file1, list); } else { //如果是文件就添加文件名到集合里面 list.add(file1); } } }}
程序运行前要再AndroidManifest中添加用户的外部存储的权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
程序运行后的显示结果:
点击获取外部存储器文件路径后显示的情况:
上面的LogCat页面显示的内容,还有很多内容显示不完。。
二.外部存储的知识相关:
(一)Environment类
Environment 是一个提供访问环境变量的类。
比如要判断外部存储空间的情况
获取存储器状态
String state = Environment.getExternalStorageState(); //sd卡就绪状态 if (state.equals(Environment.MEDIA_MOUNTED)) { //外部存储器 Toast.makeText(this, "可以使用外部存储器", Toast.LENGTH_SHORT).show(); } else { //只能使用内部存储器 Toast.makeText(this, "只能使用内部存储器", Toast.LENGTH_SHORT).show(); }
Environment包含常量:(用于判断外部存储设备的状态)
1. MEDIA_BAD_REMOVAL
表明SDCard 被卸载前己被移除
2.MEDIA_CHECKING
表明对象正在磁盘检查。
3.MEDIA_MOUNTED
表明对象是否存在并具有读/写权限
4. MEDIA_MOUNTED_READ_ONLY
表明对象权限为只读
5. MEDIA_NOFS
表明对象为空白或正在使用不受支持的文件系 统。
6. MEDIA_REMOVED
表明不存在 SDCard 返回
7. MEDIA_SHARED
表明SDCard 未安装 ,并通过 USB大容量存储共享返回
8.MEDIA_UNMOUNTABLE
表明SDCard不可被安装或SDCard 存在但不可以被安装
9.MEDIA_UNMOUNTED
表明SDCard已卸掉或SDCard是存在但是没有被安装
对于上面的外部存储器的状态,大部分是不需要掌握的,只需要记住上面的第三个状态:是否可读写状态。
如果能够读写就去做读写的操作,否则提示用户该功能无法操作。
(二)Environment 常用方法:
1.getDataDirectory()
获取Android 数据目录
2.getDownloadCacheDirectory()
获取 Android 下载/缓存内容目录。 3.getExternalStorageDirectory()
获取外部存储目录即 SDCard根目录位置,这个是要记住的。 4.getExternalStoragePublicDirectory(String type)
获取一个高端的公用的外部存储器目录来摆放某些类型的文件
5.getExternalStorageState()
获取外部存储设备的当前状态
6.getRootDirectory()
获取 Android的根目录
上面这些目录可以只打印输出看看他们的区别,但是不要太注重表明的路径,因为不同的模拟器获手机对应的路径是用可能不同的,要多方面的去验证才好下结论。
总的来说,Android外部文件的存储没什么知识,但是要记住的是要添加用户读取外部设备的权限,还要知道SD卡 的根路径的表达方式。
- Android数据存储的外部存储总结
- Android的数据存储方式---内部存储与外部存储
- Android的外部存储
- Android外部存储的
- Android数据存储--External Storage(外部存储)
- android数据存储_外部存储
- Android 数据存储---外部存储(SD卡)
- Android数据存储之内部存储、外部存储
- Android中的数据存储: SharedPreferences,内部存储,外部存储,数据库
- Android 数据存储-内部存储和外部存储
- Android存储的内外部存储
- Android的内部存储和外部存储
- Android的内部存储和外部存储
- Android的内部存储与外部存储
- Android 数据存储总结
- Android数据存储总结
- Android数据存储总结
- Android数据存储总结
- 通过多节点安装来启动ZStack
- 深入理解MVP
- 多用户登录限制
- IP地址
- 秒杀系统架构分析与实战
- Android数据存储的外部存储总结
- ios 9 隐藏状态栏
- Android地震波效果SeismicWaveView
- Bootstrap<表格>
- VS2015+OPENCV3.1.0配置/VS卡顿解决办法
- python 字典、列表和json对象互转
- The Automation Testing System 2: System Testing
- 响应式开发从原理到实战案例(三):静态页面转响应式页面
- python中继承一个类