android知识回顾---文件存储结构
2016-11-10 22:28
344 查看
最近一段时间,工作和学习方面都比较忙,所以,博客方面有一段时间没有投入时间啦,今天学习了一下Android文件存储方面的知识,主要是
一般来说,你可以直接存储文件在机器的internal storage中,存储在这个位置的文件是私有的,其他应用无法获得.但是当用户卸载你的应用时,文件就被删除啦.
通过
通过
Android的内部存储路径为/data/data/packagename/,加入你的应用名为com.example.test,那么这个路径就为/data/data/com.example.test,这个路径下一般会有files,cache和你自己生成的文件夹.那么如下的操作返回的路径如下
Context.getFileDir(),获得/data/data/com.example.test/files这个文件夹的File对象
Context.openFileInput()和Context.openFileOutput,读取的是files文件夹下的文件
Context.fileList(),返回的是files下的所有文件名
Context.deleteFile(),删除files下指定名称的文件
Context.getCacheDir(),该方法返回的是/data/data/com.example.test/cache的File对象.当Android的内部存储容量过低时,android会自动清除缓存文件.
getDir(String name,int mode),返回的是/data/data/com.example.test/下指定名称的文件夹的File对象
所有android设备都会提供外部存储,你可以用来保存文件,但是存储在外部存储的文件是完全公开的,并且可以被用户修改,外部存储可能无法获得,并且存储的文件的安全性很低,会被修改或者删除.
获得 外部存储的访问权必须需要申请
6.0,那么权限的申请可能就更加麻烦 :6.0新的权限管理系统
在使用外部存储设备之前,必须先检查外部存储设备的挂载情况,然后再进行文件操作
如果你想存储一些可以和其他应用共享的文件时,一般存储在共享的文件夹中,比如
当你不想其他应用读取你的文件时,你可能需要使用私有文件夹.通过
外部存储设备的路径一般都以/mnt/sdcard开始,如下的一些函数获得路径如下:
- getExternalCacheDir() 获得/mnt/sdcard/Android/data/com.example.test/cache 文件夹的File对象
- getExternalFilesDir(type)获得/mnt/sdcard/Android/data/com.example.test/files文件夹下响应子文件夹的File对象
- Environment.getExternalStorageDiretory() 获得的是/mnt/sdcard文件夹的File对象
- Environment.getDataDirectory() 获得是的/data文件夹的File对象,需要注意的是,/data/data/Android/就是内部存储文件夹啦.
- Environment.getDownloadCacheDirectory() 获得的是/cache文件夹的File对象
Internal Storage和
External Storage的相关特性.主要知识来自android的官方文档和其他人的博客.
Internal Storage
一般来说,你可以直接存储文件在机器的internal storage中,存储在这个位置的文件是私有的,其他应用无法获得.但是当用户卸载你的应用时,文件就被删除啦.通过
openFileOutput()传入文件的名字和操作模式,就可以获得
FileOutputStream,然后就可以
write(),然后
close啦.
<code class="language-java hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">String FILENAME = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"hello_file"</span>; String string = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"hello world!"</span>; FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); fos.write(string.getBytes()); fos.close();</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>
MODE_PRIVATE模式会创建或者替换同名文件,并让文件变为私有的,其他的一些模式还有
MODE_APPEND(追加模式),
MODE_WORLD_READABLE(全局可读)和
MODE_WORLD_WRITEABLE(全局可写).
通过
OpenFileInput()函数可以进行文件的读取.
Android的内部存储路径为/data/data/packagename/,加入你的应用名为com.example.test,那么这个路径就为/data/data/com.example.test,这个路径下一般会有files,cache和你自己生成的文件夹.那么如下的操作返回的路径如下
Context.getFileDir(),获得/data/data/com.example.test/files这个文件夹的File对象
Context.openFileInput()和Context.openFileOutput,读取的是files文件夹下的文件
Context.fileList(),返回的是files下的所有文件名
Context.deleteFile(),删除files下指定名称的文件
Context.getCacheDir(),该方法返回的是/data/data/com.example.test/cache的File对象.当Android的内部存储容量过低时,android会自动清除缓存文件.
getDir(String name,int mode),返回的是/data/data/com.example.test/下指定名称的文件夹的File对象
External Storage
所有android设备都会提供外部存储,你可以用来保存文件,但是存储在外部存储的文件是完全公开的,并且可以被用户修改,外部存储可能无法获得,并且存储的文件的安全性很低,会被修改或者删除. 获得 外部存储的访问权必须需要申请
READ_EXTERNAL_STORAGE或者
WRITE_EXTERNAL_STORAGE权限,如果申请了写权限,那么相应的读权限也获得啦.如果是Android
6.0,那么权限的申请可能就更加麻烦 :6.0新的权限管理系统
在使用外部存储设备之前,必须先检查外部存储设备的挂载情况,然后再进行文件操作
<code class="language-java hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* Checks if external storage is available for read and write */</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">boolean</span> <span class="hljs-title" style="box-sizing: border-box;">isExternalStorageWritable</span>() { String state = Environment.getExternalStorageState(); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (Environment.MEDIA_MOUNTED.equals(state)) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* Checks if external storage is available to at least read */</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">boolean</span> <span class="hljs-title" style="box-sizing: border-box;">isExternalStorageReadable</span>() { String state = Environment.getExternalStorageState(); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li></ul>
如果你想存储一些可以和其他应用共享的文件时,一般存储在共享的文件夹中,比如
Music/,’Pictures/’,’Ringtones/’通过
Environment.getExternalStoragePublicDirectory,传递给其文件夹的类型,比如
DIRECTORY_MUSIC,
DIRECTORY_PICTURES,就可以获得响应文件夹的File对象.
当你不想其他应用读取你的文件时,你可能需要使用私有文件夹.通过
getExternalFilesDir(),并传递给其子文件夹的type,就可以打开响应的文件夹,在4.4之后,读取私有文件夹下的文件,是不需要外部存储设备权限的.
外部存储设备的路径一般都以/mnt/sdcard开始,如下的一些函数获得路径如下:
- getExternalCacheDir() 获得/mnt/sdcard/Android/data/com.example.test/cache 文件夹的File对象
- getExternalFilesDir(type)获得/mnt/sdcard/Android/data/com.example.test/files文件夹下响应子文件夹的File对象
- Environment.getExternalStorageDiretory() 获得的是/mnt/sdcard文件夹的File对象
- Environment.getDataDirectory() 获得是的/data文件夹的File对象,需要注意的是,/data/data/Android/就是内部存储文件夹啦.
- Environment.getDownloadCacheDirectory() 获得的是/cache文件夹的File对象
相关文章推荐
- Android知识体系结构概览
- Android 知识结构
- android知识结构
- Android基础知识回顾
- Android知识体系结构
- Android知识回顾
- android 基础知识回顾--- “沙箱”机制sharedUserId跟签名
- Android知识结构图
- Android知识结构
- Android开发笔记之广播知识的回顾和总结以及使用
- Android UI系统的知识结构
- Android 开发知识结构图
- Android基础知识【项目实训-项目结构及主界面的实现】【4】
- Android知识结构图
- Android知识体系结构
- Android知识体系结构概览
- Android 5.0 开发者官网知识结构疏理
- Android系统回顾(二):Android基础知识
- Android基础知识回顾之Activity
- Android开发笔记之四大组件琐碎知识回顾总结