Android 数据存储02之文件读写

摘要:
Android文件读写 版本修改内容日期修改人V1.0原始版本2013/2/25skywang       Android文件读写的有两种方式。一种,是通过标准的JavaIO库去读写。另一种,是通过Context提供的接口去读写。两种方式的原理是一样的,只是API接口不同。下面分别对两种方式进行介绍。  1 通过Java IO库读写文件当我们想读写公用的目录,如图片、提示音;或者读写外部扩展卡上的文件时,一般都选择通过Java IO库去

Android文件读写

 

版本

修改内容

日期

修改人

V1.0

原始版本

2013/2/25

skywang

 

 

 

 

 

 

 

Android文件读写的有两种方式。一种,是通过标准的JavaIO库去读写。另一种,是通过Context提供的接口去读写。

两种方式的原理是一样的,只是API接口不同。下面分别对两种方式进行介绍。

 


 

1 通过Java IO库读写文件

当我们想读写公用的目录,如图片、提示音;或者读写外部扩展卡上的文件时,一般都选择通过Java IO库去读写。当通过Java IO库去读写文件时,一般会用到Android Enviroment的接口(如读取外部sdcard的路径、状态等)。

 

1.1 Android Enviroment

下面分别对Android Eviroment涉及到的函数和变量进行说明

 表01_ Enviroment API接口

Enviroment API接口

API名称

说明

staticFile  getDataDirectory()

获取Android的数据目录。

staticFile  getDownloadCacheDirectory()

获取的Andr​​oid下载/缓存内容的目录。

staticFile  getExternalStorageDirectory()

获取Android的外部存储目录(即sdcard目录)。

staticFile  getExternalStoragePublicDirectory(String type)

获取为特定类型的文件放在顶层的公共外部存储目录。

staticString  getExternalStorageState()

获取的主要外部存储设备的当前状态(即sdcard目录的状态)。

staticFile  getRootDirectory()

获取Android的根目录。

static boolean isExternalStorageEmulated()

返回设备是否有外部存储设备的仿真。

static boolean isExternalStorageRemovable()

返回主“外部存储设备是否是可拆卸的。

 

表02_Enviroment sdcard卡状态说明

 

表03_ Enviroment sdcard卡状态说明

Enviroment sdcard卡状态说明

状态名称

说明

MEDIA_BAD_REMOVAL

非法移除状态:移除sdcard之前,没有卸载sdcard。

MEDIA_CHECKING

检查状态:检查sdcard的有效性

MEDIA_MOUNTED

挂载状态:sdcard卡已经成功挂载。

MEDIA_MOUNTED_READ_ONLY

只读状态:sdcard已经挂载,但是是只读的。

MEDIA_NOFS

NOFS状态:识别到sdcard卡,但无法挂载。无法挂载原因,可能是sdcard无存储介质,或者sdcard卡的文件系统与android无兼容。

MEDIA_REMOVED

移除状态:sdcard成功移除。

MEDIA_SHARED

共享状态:识别到sdcard卡,但sdcard未挂载,而是作为mass storage等设备(如以u盘的方式连接到电脑上)。

MEDIA_UNMOUNTABLE

无法挂载状态:识别到sdcard卡,但无法挂载。无法挂载的原因,可能是sdcard的存储介质部分损坏。

MEDIA_UNMOUNTED

未挂载:识别到sdcard,但没有挂载。

 

 

1.2 Android Enviroment实例

AndroidManifest.xml

<?xml version="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
     package="com.yarin.Android.HelloAndroid"
     android:versionCode="1"
     android:versionName="1.0">
   
   <!-- 往SDCard写入数据权限 -->
   <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 
 
   <application android:icon="@drawable/icon"android:label="@string/app_name">
       <activity android:name=".HelloAndroid"
                 android:label="@string/app_name">
           <intent-filter>
                <actionandroid:name="android.intent.action.MAIN" />
                <categoryandroid:name="android.intent.category.LAUNCHER" />
           </intent-filter>
       </activity>
   </application>
   <uses-sdk android:minSdkVersion="5" />
</manifest>


 

 

HelloAndroid.java

 

package com.yarin.Android.HelloAndroid; 
  
import android.app.Activity;   
import android.os.Bundle;   
import android.util.Log; 
import java.io.*; 
import android.os.Environment; 
  
// 测试Enviroment环境变量 
public class HelloAndroid extends Activity { 
	private static final String TAG = "skywang-->HelloAndroid"; 
 
	@Override 
	public void onCreate(Bundle savedInstanceState) { 
		super.onCreate(savedInstanceState); 
		setContentView(R.layout.main); 
 
		isSdcardMounted() ; 
		publicDirTest() ; 
		enviromentAPITest() ; 
	} 
 
	private boolean isSdcardMounted() { 
		String str = Environment.getExternalStorageState(); 
		boolean ret = Environment.MEDIA_MOUNTED.equals(str); 
 
		Log.d(TAG, "isSdcardMounted ret="+ret); 
 
		return ret; 
	} 
 
	private void enviromentAPITest() { 
 
		Log.d(TAG, "isExternalStorageEmulated="+Environment.isExternalStorageEmulated()); 
		Log.d(TAG, "isExternalStorageRemovable="+Environment.isExternalStorageRemovable()); 
 
		File file = null; 
		file = Environment.getDataDirectory(); 
		Log.d(TAG, "getDataDirectory()="+file.getPath()); 
 
		file = Environment.getExternalStorageDirectory(); 
		Log.d(TAG, "getExternalStorageDirectory()="+file.getPath()); 
 
		file = Environment.getDownloadCacheDirectory(); 
		Log.d(TAG, "getDownloadCacheDirectory()="+file.getPath()); 
 
		file = Environment.getRootDirectory(); 
		Log.d(TAG, "getRootDirectory()="+file.getPath()); 
	} 
 
	private void publicDirTest() { 
		File file = null; 
		file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_NOTIFICATIONS); 
		Log.d(TAG, "DIRECTORY_NOTIFICATIONS="+file.getPath()); 
 
		file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS); 
		Log.d(TAG, "DIRECTORY_ALARMS="+file.getPath()); 
 
		file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); 
		Log.d(TAG, "DIRECTORY_DCIM="+file.getPath()); 
 
		file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 
		Log.d(TAG, "DIRECTORY_DOWNLOADS="+file.getPath()); 
 
		file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES); 
		Log.d(TAG, "DIRECTORY_MOVIES="+file.getPath()); 
 
		file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC); 
		Log.d(TAG, "DIRECTORY_MUSIC="+file.getPath()); 
 
		file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
		Log.d(TAG, "DIRECTORY_PICTURES="+file.getPath()); 
 
		file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PODCASTS); 
		Log.d(TAG, "DIRECTORY_PODCASTS="+file.getPath()); 
 
		file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES); 
		Log.d(TAG, "DIRECTORY_RINGTONES="+file.getPath()); 
	} 
}


 

打印结果如下:

D/skywang-->HelloAndroid( 3076):isSdcardMounted ret=true 

D/skywang-->HelloAndroid( 3076):DIRECTORY_NOTIFICATIONS=/mnt/sdcard/Notifications 

D/skywang-->HelloAndroid( 3076):DIRECTORY_ALARMS=/mnt/sdcard/Alarms 

D/skywang-->HelloAndroid( 3076):DIRECTORY_DCIM=/mnt/sdcard/DCIM 

D/skywang-->HelloAndroid( 3076):DIRECTORY_DOWNLOADS=/mnt/sdcard/Download 

D/skywang-->HelloAndroid( 3076):DIRECTORY_MOVIES=/mnt/sdcard/Movies 

D/skywang-->HelloAndroid( 3076):DIRECTORY_MUSIC=/mnt/sdcard/Music 

D/skywang-->HelloAndroid( 3076):DIRECTORY_PICTURES=/mnt/sdcard/Pictures 

D/skywang-->HelloAndroid( 3076):DIRECTORY_PODCASTS=/mnt/sdcard/Podcasts 

D/skywang-->HelloAndroid( 3076):DIRECTORY_RINGTONES=/mnt/sdcard/Ringtones 

D/skywang-->HelloAndroid( 3076):isExternalStorageEmulated=false 

D/skywang-->HelloAndroid( 3076):isExternalStorageRemovable=false 

D/skywang-->HelloAndroid( 3076):getDataDirectory()=/data 

D/skywang-->HelloAndroid( 3076):getExternalStorageDirectory()=/mnt/sdcard 

D/skywang-->HelloAndroid( 3076):getDownloadCacheDirectory()=/cache 

D/skywang-->HelloAndroid( 3076):getRootDirectory()=/system 

 

 

 

1.3 Java IO库读写实例 

AndroidManifest.xml

<?xml version="1.0"encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.yarin.Android.HelloAndroid"
     android:versionCode="1"
     android:versionName="1.0">
   
   <!-- 往SDCard写入数据权限 -->
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

 
   <application android:icon="@drawable/icon"android:label="@string/app_name">
       <activity android:name=".HelloAndroid"
                 android:label="@string/app_name">
           <intent-filter>
                <actionandroid:name="android.intent.action.MAIN" />
                <categoryandroid:name="android.intent.category.LAUNCHER" />
           </intent-filter>
       </activity>
   </application>
   <uses-sdk android:minSdkVersion="5" />
</manifest>


 

HelloAndroid.java

package com.yarin.Android.HelloAndroid;
 
import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log;
import java.io.*;
import android.os.Environment;
// 通过Java IO去读写文件
public class HelloAndroid extends Activity{
    privatestatic final String TAG = "skywang-->HelloAndroid";
 
 
    privateFile sdcardDir = Environment.getExternalStorageDirectory();
    privatestatic final String TEST_FILE_NAME = "file.txt";
 
 
    @Override
    publicvoid onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
 
 
       originalJavaIOWriteTest();
       originalJavaIOReadTest();
    }
 
 
    privateboolean isSdcardMounted() {
 
 
       returnEnvironment.MEDIA_MOUNTED.equals(
                  Environment.getExternalStorageState());
    }
 
 
    privatevoid originalJavaIOReadTest() {
       if(!isSdcardMounted())
           return;
 
 
       try {
           Filefile = new File(sdcardDir, TEST_FILE_NAME);
           FileInputStream in =
                  new FileInputStream(file);        
           byte[] bb = new byte[64];
           intlen=0;
           while ((len=in.read(bb))!=-1) {
              Log.d(TAG, "bb="+newString(bb, 0, len));
           }
           in.close();
       } catch (IOException e) {
           e.printStackTrace();
       }
    }
 
 
   private void originalJavaIOWriteTest() {
       if(!isSdcardMounted())
           return;
 
 
       try {
           Filefile = new File(sdcardDir, TEST_FILE_NAME);
           FileOutputStream out =
                  new FileOutputStream(file);
           String str = "i am skywang!";
          
           byte[] bb = str.getBytes();
           for (int i=0; i<bb.length; i++)
              out.write(bb[i]);
           out.close();
       } catch (IOException e) {
           e.printStackTrace();
       }
    }
}

 

打印结果如下:

D/skywang-->HelloAndroid( 3298): bb=i am skywang!

 

 

 


2 通过Context提供的接口去读写

Android的Context提供了API用来读写该Activity的私有文件;默认路径是:/data/data/<包>/files/***.***

Context提供了openFileInput()、openFileOutput()、deleteFile()等操作文件。下面简要进行说明

 

2.1 Context接口说明 

public abstract FileInputStream openFileInput (String name)

作    用:打开Activity的私有文件,用于读数据。

参数说明:

name ——  文件名

 

public abstract FileOutputStream openFileOutput (String name,int mode)

作    用:打开Activity的私有文件,用于写数据。

参数说明:

name —— 文件名

mode —— 写文件的方式,有一下几种值可以选择。

MODE_APPEND:将内容以追加的方式写到文件末尾。

MODE_PRIVATE:默认的方式,创建的文件只能被本Activity所访问。

MODE_WORLD_READABLE:Android API LEVEL 17以后不建议使用。

MODE_WORLD_WRITEABLE:Android API LEVEL 17以后不建议使用。

 

public abstract String[] fileList ()

作    用:返回Activity私有的文件名组成的列表。

参数说明:无

 

public abstract boolean deleteFile (String name)

作    用:删除Activity私有的文件。

参数说明:name  —— 文件名

 

 

2.2 Context实例 

HelloAndroid.java

package com.yarin.Android.HelloAndroid;
 
import android.app.Activity;  
import android.os.Bundle; 
import android.util.Log;
import java.io.*;
import android.os.Environment;
 
 
public class HelloAndroid extends Activity{
    privatestatic final String TAG = "skywang-->HelloAndroid";
 
 
    privatestatic final String TEST_FILE_NAME = "file.txt";
    @Override
    publicvoid onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
 
 
       //读写测试
       activityFileWriteTest();
       activityFileReadTest();
 
 
       //列出当前文件
       listActivityFiles();
 
 
       //删除后再列举
       Log.d(TAG,"deleteFile "+TEST_FILE_NAME);
       deleteFile(TEST_FILE_NAME);
       listActivityFiles();
    }
    //fileList接口测试
    privatevoid listActivityFiles() {
       String[]arrStr = fileList();
       for(int i=0; i<arrStr.length; i++)
           Log.d(TAG,"index="+i+", file_name ="+arrStr[i]);
    }
    //openFileInput接口测试
    privatevoid activityFileReadTest() {
       try {
           FileInputStream in = openFileInput(TEST_FILE_NAME);
           byte[] bb = new byte[64];
           int len = in.read(bb);
           Log.d(TAG,"bb="+new String(bb, 0, len));
           in.close();
       } catch (FileNotFoundException e) {
           Log.d(TAG,"read file "+TEST_FILE_NAME+" not exist!");
       } catch (IOException e){
           e.printStackTrace();
       }
    }
    //openFileOutput接口测试
    privatevoid activityFileWriteTest() {
       try {
           FileOutputStream out =openFileOutput(TEST_FILE_NAME,MODE_WORLD_READABLE);
           Stringstr = "this is a activity file test.";
           out.write(str.getBytes());
           out.close();
       } catch (FileNotFoundException e) {
           Log.d(TAG,"write file "+TEST_FILE_NAME+" not exist!");
       } catch (IOException e){
           e.printStackTrace();
       }
    }
}

 

打印结果如下:

D/skywang-->HelloAndroid( 3414): bb=thisis a activity file test. 

D/skywang-->HelloAndroid( 3414):index=0, file_name =file.txt 

D/skywang-->HelloAndroid( 3414):deleteFile file.txt

 

文件保存路径为:/data/data/com.yarin.Android.HelloAndroid/files/file.txt

说明:不同的实例,保存路径可能不一样!

 



 

参考文件:

1,Android API文档

2,Java API文档

3,Android实现数据存储技术:http://www.cnblogs.com/hanyonglu/archive/2012/03/01/2374894.html

免责声明:文章转载自《Android 数据存储02之文件读写 》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇30种下载Youtube视频的方法【转】python调用youtube-dl实现视频下载下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

基于.NET Standard的分布式自增ID算法--Snowflake

概述 本篇文章主要讲述分布式ID生成算法中最出名的Snowflake算法。搞.NET开发的,数据库主键最常见的就是int类型的自增主键和GUID类型的uniqueidentifier。 那么为何还要引入snowflake呢? INT自增主键 自增主键是解决主键生成的最简单方案,它有如下优势: 数据库本身负责主键生成,效率高 数据库本身保证主键顺序递增,方...

Android酷炫实用的开源框架(UI框架)

    原文链接:http://www.androidchina.net/1992.html 前言   忙碌的工作终于可以停息一段时间了,最近突然有一个想法,就是自己写一个app,所以找了一些合适开源控件,这样更加省时,再此分享给大家,希望能对大家有帮助,此博文介绍的都是UI上面的框架,接下来会有其他的开源框架(如:HTTP框架、DB框架)。 1.Side...

2019中国大学生程序设计竞赛(CCPC)

目录 Contest Info Solutions A - & B - array C - K-th occurrence D - path E - huntian oy F - Shuffle Card G - Windows Of CCPC H - Fishing Master Contest Info [Practice Li...

Android浏览器软键盘中的回车(确认)会触发表单提交的问题解决办法

     最近在公司里做项目的时候遇到一个问题,开发出来的网页需要在Android手机中的浏览器中打开,当在表单中的文本框内输入内容时,如果这时点软键盘中的回车会导致表单被提交,而不是正常的点击按钮提交。     经上网查询了相关资料与自己的测试,下面发出解决的代码:     在表单的onSubmit事件中加入以下代码:     Javascript...

15个必知的Android开发者选项

Android开发者选项,看起来很简单的事情,其实很多同学对它了解得不够,Google用心良苦得为我们设计了这么多小开关都是有它的作用的,今天也花了点时间,过了一遍全部的30多个开关,从中整理出15个对日常Android开发比较有帮助的选项。 需要指出的是,不同的ROM对开发者选项的支持不一样,精简掉一些很正常,我下面提到的都是官方支持的功能,当然不同...

C# 分布式自增ID算法snowflake(雪花算法)

概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移到Cassan...