安卓的存储机制

安卓的文件存储分为内部存储和外部存储,在安卓早期,手机内置存储很小,都是用于应用的私有存储空间,外部存储就是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();

}

运行结果


log 

文件创建失败


文件

同时文件夹中没有出现该文件

猜测创建失败问题来自文件地址的问题

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.getExternalStoragePublicDirectory(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"/>

最后附上安卓所有文件存储的地址的获取方法


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android开发中,离不开对文件的操作。本文首先介绍了使用java对文件进行基本的读写操作,而后介绍了A...
    baolvlv阅读 12,208评论 0 5
  • ClassLoader翻译过来就是类加载器,普通的java开发者其实用到的不多,但对于某些框架开发者来说却非常常见...
    时待吾阅读 1,167评论 0 1
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 7,380评论 0 17
  • [TOC] 异常 异常:异常就是Java程序在运行过程中出现的 错误 。 异常由来:问题也是现实生活中一个具体事务...
    lutianfei阅读 590评论 0 1
  • 江南地区多雨,近几日更是阴雨绵绵。天空也是暮霭沉沉,颇有云烟深处水茫茫之感。 莉莉撑着一把透明的雨...
    如是_我闻_1697阅读 231评论 0 0

友情链接更多精彩内容