Android 文件读写
一、分类
文件读写作为Android四大数据存储方式之一,又分为内部存储和外部存储两种:
(1)内部存储(Internal storage):
- 总是可用。
- 文件默认情况存储在/data/data/包名/files,缓存文件存储在/data/data/包名/cache中,默认情况下只能只能被本APP操作,当然可以在openFileOutput()中指定是否可被其他app读写。
- 当使用者卸载你的app时,系统会自动从内部存储中删除安排app的所有文件。
(2)外部存储(External storage):
1.并不是总是可用,因为用户有可能将SD卡作为USB存储挂载或者在某些情况下将SD卡从设备上卸下,因此需要使用getExternalStorageState()来查询外部存储的状态,当返回的状态是MEDIA_MOUNTED时才能读写。
2.保存在外部存储的文件是world-readable的,所以保存在外部存储的文件可能被其他应用读取。
3.当用户卸载app时,只用当你调用getExternalFilesDir()来保存文件时系统才会从外部存储中移除app的文件。
4.权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
向SD卡写入数据权限,隐式授予了读取权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
当app只需要读取而非写入权限的时候更适合使用该权限
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
在SD卡中创建和删除文件权限
二、方法介绍
1)getFilesDir():返回/data/data/包名/files
2)getCacheDir():返回/data/data/包名/cache,在确定缓存文件不再需要时删除掉,为app使用的内存量实现一个合理的大小限制,比如1M。如果系统在存储空间低的时候运行,可能会在没有警告的时候删除缓存文件。
3)FileInputStream openFileInput(String name):打开应用程序文件夹下的nam文件对应的输入流。
4)FileOutputStream openFileOutput(String name,int mode):打开应用程序文件夹下的nam文件对应的输出流(若文件不存在则创建),第二个参数指定打开文件的模式:
MODE_PRIVATE:该文件只能被当前程序读写
MODE_APPEND:已追加方式打开该文件
MODE_WORLD_READABLE:该文件可被其他程序读取
MODE_WORLD_WRITEABLE:该文件可被其他程序读写
5)getDir(String name,int mode):在应用程序的数据文件夹下获取或创建app_name对应的子目录
第二个参数:
MODE_PRIVATE:默认模式,该文件只能被当前程序访问
MODE_WORLD_READABLE:该文件可被其他程序访问(在API17被弃用)
MODE_WORLD_WRITEABLE:该文件可被其他程序读写(在API17被弃用)
6)String[] fileList():返回应用程序的数据文件夹下的全部文件名
7)deleteFile(String name):删除应用程序的数据文件夹下指定文件
8)Environment.getExternalStorageState():判断手机是否插入SD卡,当返回MEDIA_MOUNTED时才能对其进行读写
9)getExternalStorageDirectory():返回SD卡的根目录 /storage/emulated/0
10)getExternalStoragePublicDirectory(String type):在SD卡的根目录创建一个由type指定的特定类型的文件夹
例如:/storage/emulated/0/Pictures
11)getExternalFilesDir(String type):在SD卡中对应应用的数据文件夹中创建一个由type指定的特定类型的文件夹
例如:storage/emulated/0/Android/data/应用包名/files/Pictures
type可选项:
DIRECTORY_MUSIC 标准音乐目录
,
DIRECTORY_PODCASTS
,
DIRECTORY_RINGTONES 铃声
,
DIRECTORY_ALARMS 警报音
,
DIRECTORY_NOTIFICATIONS 通知音
,
DIRECTORY_PICTURES 图片
,
DIRECTORY_MOVIES 电影
,
DIRECTORY_DOWNLOADS 下载
,
DIRECTORY_DCIM 由camera拍摄的照片和视频存放目录
TIPS:(1)需要注意的是getExternalStoragePublicDirectory()与getExternalFilesDir()的区别在于前者所创建的文件不会在用户卸载被系统删除,而后者在SD卡创建的应用程序数据文件会被系统删除。
(2)当用户卸载APP的时候系统会删除所有在内部存储中对应APP的文件以及由getExternalFilesDir()调用创建的文件。
三、代码示例
内部存储:
- import android.content.Context;
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.widget.Button;
- import android.widget.EditText;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- public class MainActivity extends AppCompatActivity {
- final String FILE_NAME="test.txt";
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Button read= (Button) findViewById(R.id.read);
- final Button write= (Button) findViewById(R.id.write);
- final EditText editText= (EditText) findViewById(R.id.edit_area);
- write.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- write(editText.getText().toString());
- editText.setText("");
- }
- });
- read.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- editText.setText(read());
- }
- });
- findViewById(R.id.delete).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- delete(FILE_NAME,MainActivity.this);
- }
- });
- }
- private String read(){
- try {
- FileInputStream fis=openFileInput(FILE_NAME);
- byte[] buff=new byte[1024];
- int hasRead=0;
- StringBuffer sb=new StringBuffer();
- while ((hasRead=fis.read(buff))>0){
- sb.append(new String(buff,0,hasRead));
- }
- fis.close();
- return sb.toString();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- private void delete(String name,Context context){
- context.deleteFile(name);
- }
- private void write(String content){
- try {
- FileOutputStream fos=openFileOutput(FILE_NAME,MODE_PRIVATE);
- try {
- fos.write(content.getBytes());
- } catch (IOException e) {
- e.printStackTrace();
- }
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
- }
- }
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
- android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin"
- android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
- <EditText
- android:id="@+id/edit_area"
- android:lines="5"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
- <Button
- android:id="@+id/read"
- android:layout_below="@id/edit_area"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="读入"/>
- <Button
- android:id="@+id/write"
- android:layout_toRightOf="@id/read"
- android:layout_below="@id/edit_area"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="写入"/>
- <Button
- android:id="@+id/delete"
- android:layout_below="@id/edit_area"
- android:text="删除"
- android:layout_toRightOf="@id/write"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- </RelativeLayout>
外部存储:
- package com.example.administrator.externalfile;
- import android.content.Context;
- import android.os.Environment;
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.View;
- import android.view.WindowManager;
- import android.widget.Button;
- import android.widget.EditText;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.RandomAccessFile;
- public class MainActivity extends AppCompatActivity {
- private String TAG="ENTERNAL";
- private String FILE_NAME="/test.txt";
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Log.d(TAG, "ExternalStoragePublicDir=" + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES));
- Log.d(TAG, "ExternalFilesDir=" + MainActivity.this.getExternalFilesDir(Environment.DIRECTORY_PICTURES));
- Log.d(TAG,"ExternalStorageDir="+Environment.getExternalStorageDirectory());
- final EditText editText= (EditText) findViewById(R.id.edit_area);
- Button read= (Button) findViewById(R.id.read);
- final Button write= (Button) findViewById(R.id.write);
- read.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- editText.setText(read());
- }
- });
- write.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- write(editText.getText().toString());
- editText.setText("");
- }
- });
- }
- 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;
- }
- /**
- * 获取外部公用存储路径
- * @param albumName
- * @return
- */
- public File getAlbumStorageDir(String albumName){
- File file=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),albumName);
- if (!file.mkdirs()){
- Log.d(TAG,"Directory not create");
- }
- return file;
- }
- /**
- * 获取私有外部存储目录
- * @param context
- * @param albumName
- * @return
- */
- public File getAlbumStorageDir(Context context,String albumName){
- File file=new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES),albumName);
- if (!file.mkdirs()){
- Log.d(TAG,"Directory not create");
- }
- return file;
- }
- private String read(){
- if (isExternalStorageWritable()){
- // File sdCard=Environment.getExternalStorageDirectory();
- File sdCard=getAlbumStorageDir(MainActivity.this,"test");
- try {
- FileInputStream fis=new FileInputStream(sdCard.getCanonicalPath()+FILE_NAME);
- StringBuilder sb=new StringBuilder("");
- byte[] buff=new byte[1024];
- int hasRead=0;
- while ((hasRead=fis.read(buff))!=-1){
- sb.append(new String(buff,0,hasRead));
- }
- return sb.toString();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return null;
- }
- private void write(String content){
- if (isExternalStorageWritable()){
- // File sdCard=Environment.getExternalStorageDirectory();
- File sdCard=getAlbumStorageDir(MainActivity.this,"test");
- try {
- File targetFile=new File(sdCard.getCanonicalPath()+FILE_NAME);
- RandomAccessFile raf=new RandomAccessFile(targetFile,"rw");
- raf.seek(targetFile.length());
- raf.write(content.getBytes());
- raf.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
- android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin"
- android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
- <EditText
- android:id="@+id/edit_area"
- android:lines="5"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
- <Button
- android:id="@+id/read"
- android:layout_below="@id/edit_area"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="读入"/>
- <Button
- android:id="@+id/write"
- android:layout_toRightOf="@id/read"
- android:layout_below="@id/edit_area"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="写入"/>
- <Button
- android:id="@+id/delete"
- android:layout_below="@id/edit_area"
- android:text="删除"
- android:layout_toRightOf="@id/write"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- </RelativeLayout>
参考自:
http://developer.android.com/training/basics/data-storage/files.html
Android 文件读写的更多相关文章
- [转]Android - 文件读写操作 总结
转自:http://blog.csdn.net/ztp800201/article/details/7322110 Android - 文件读写操作 总结 分类: Android2012-03-05 ...
- android 文件读写工具类
将可以序列化的对象通过base64编码后进行保存 但是感觉多数情况下,不需要采用这个功能,直接保存原始的json字符串,取出来之后再进行解析即可 package com.wotlab.home.mon ...
- Android - 文件读写操作 总结
在android中的文件放在不同位置,它们的读取方式也有一些不同. 本文对android中对资源文件的读取.数据区文件的读取.SD卡文件的读取及RandomAccessFile的方式和方法进行了整理. ...
- android 文件读写权限的设定
读取本地文件的权限问题 2016年08月15日 21:41:30 阅读数:2520 在一个音乐app过程中需要读取手机本地内存卡中的音乐文件并可以播放,具体遇到的问题如下:工程没有错误,运行出现以下信 ...
- Android 文件读写高级
往设备里写文件有几种选择,写在内存中,或SD卡中. 往内存里写好处是,可以写在 data/data/包名 文件夹里,而此文件是不可访问的(除非 root).这样可以增加文件的安全性,避免被误删.缺点也 ...
- Android 文件读写的例子
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStrea ...
- 2017-6-14 踩坑小结(Android文件读写 相关问题)
填坑 getSlotFromBufferLocked: unknown buffer: 0xab7115e0 1. 在棉花糖(6.0)上莫名出现 未知缓冲 错误,百度了一下,貌似这个是Android6 ...
- Android 数据存储02之文件读写
Android文件读写 版本 修改内容 日期 修改人 V1.0 原始版本 2013/2/25 skywang Android文件读写的有两种方式.一种,是通过标准的JavaIO库去读写.另一种,是通过 ...
- Cocos2d-x在win32,android和IOS下的文件读写问题
最近在学习和使用Cocos2d-x框架,虽然说的是跨平台,但是在用VS进行开发,然后移植到android或IOS下,也可能会出现各种问题,需要做细微的调整. 例如我在做文件读写操作的时候,很可能在wi ...
随机推荐
- 队列的JS实现
队列和栈相似,都是对插入和删除操作的部位做了限制特殊的线性表.在队列中,只能从一头删除节点,这一头叫做队首:而另一端只能做插入操作,这一头叫做队尾.很容易理解,队列是一个"先进先出" ...
- PHP用户注册与登录完整代码【4】
login.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// ...
- Bootstrap 简洁、直观、强悍的前端开发框架,让web开发更迅速、简单。
Bootstrap 简洁.直观.强悍的前端开发框架,让web开发更迅速.简单.
- 无法连接虚拟设别 ide1:0.
安装虚拟机时出现提示:无法连接虚拟设备 ide1:0,因为主机上没有相应的设备.您要在每次开启此虚拟机时都尝试连接此虚拟设备吗? ide1:0一般是虚拟机的光驱,配置选项是“使用物理驱动器”,而宿主机 ...
- 李洪强iOS经典面试题156 - Runtime详解(面试必备)
李洪强iOS经典面试题156 - Runtime详解(面试必备) 一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...
- Map的keySet和entrySet
/*Map集合的两种 取出方式 * 1.keySet() * 2.entrySet() * */ //定义一个学生类 重写了equals.hashcode三个方法,实现了comparable接口并覆盖 ...
- Django后台
django的后台我们只要加少些代码,就可以实现强大的功能. 与后台相关文件:每个app中的 admin.py 文件与后台相关. 下面示例是做一个后台添加博客文章的例子: 一,新建一个 名称为 zqx ...
- HTML实践发现(标签<pre>)
1. (1).第一种编辑: (2).浏览器中显示: 2. (1).第二种编辑 (2).浏览器中显示: 结果发现:使用标签<pre>,在浏览器中显示的结果与在<pre>下方编写的 ...
- Lua pureMVC
分享一个lua语言版本的pureMVC. 这个是一个根据AS3(ActionScript 3) pureMVC而转换过来的lua pureMVC.所有的接口完全跟AS3版本一致,本来是想用在项目之中的 ...
- 4.Powershell交互界面
Powershell提供两种接口:交互式和自动化脚本 先学下如何与Powershell Console和平共处,通过Powershell Console和机器学会对话. 通过以上一个简单测试,知道Po ...