在android手机存储数据和文件的方式分为五种:1.文件存储(sd卡中)、2.采用共享参数(sharedpreferences)的方式存储、3.SQLite数据库存储、4.使用内容提供者(Content Provider)存储、5.存放在网络的服务器端。读写sdCard卡是常见的一种操作方式。下面我们来介绍一个这种方式的使用。
整体思路:定义一个FileService类,在这个类中定义一个getFileFromSdcard方法,用于传一个文件名参数读取sdCard卡中的文件返回读取的字符串,定义一个saveContentToSdcard方法,用于传一个文件名参数和一个字符串参数,来将这个字符串写入这个文件,并保存于sdCard卡中;创建一个继承AndroidTestCase的单元测试类MyTest,在这个类中定义saveFile方法,在方法中实例化一个FileService对象,并调用saveContentToSdcard这个方法,将指定字符串写入对应文件,并存储于sdCard卡,在这个类中定义另一个方法readFile,在这个方法中实例化一个FileService对象,并调用getFileFromSdcard这个方法,读取指定的文件,并将该文件中的字符串输出。注意要在清单文件AndroidManifest.xml文件中加上单元测试和读写sdCard卡的授权。
FileService.java文件:
public class FileService {
private Context context;
public FileService(Context context) {
this.context=context;
}
public FileService(){
}
public String getFileFromSdcard(String fileName){
FileInputStream inputStream=null;
// 缓存的流,与磁盘无关,不需要关闭,会写在缓冲区里面
ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
File file=new File(Environment.getExternalStorageDirectory(),fileName);
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
try {
inputStream=new FileInputStream(file);
int len=0;
byte[] data=new byte[1024];
while ((len=inputStream.read(data))!=-1) {
outputStream.write(data,0,len);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(inputStream!=null){
try {
inputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
return new String(outputStream.toByteArray());
}
/**
*
* @param fileName 文件名称
* @param content 文件内容
* @return
*/
public boolean saveContentToSdcard(String fileName,String content){
boolean flag=false;
FileOutputStream fileOutputStream=null;
// 获得sdcard卡所在的路径
File file=new File(Environment.getExternalStorageDirectory(),fileName);
// 判断sdCard是否可用
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
try {
fileOutputStream=new FileOutputStream(file);
fileOutputStream.write(content.getBytes());
flag=true;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(fileOutputStream!=null){
try {
fileOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
return flag;
}
}
MyTest.java文件:
public class MyTest extends AndroidTestCase {
private final String TAG="MyTest";
public MyTest() {
// TODO Auto-generated constructor stub
}
//在sdCard中写入文件
public void saveFile(){
Context context=getContext();
FileService fileService=new FileService(context);
boolean flag=fileService.saveContentToSdcard("hello.txt", "你好");
Log.i(TAG, "-->>"+flag);
}
// 读取sdCard中文件的内容
public void readFile(){
Context context=getContext();
FileService fileService=new FileService(context);
String msgString=fileService.getFileFromSdcard("hello.txt");
Log.i(TAG, "-->>"+msgString);
}
}
AndroidManifest.xml文件:
<span style="color:#cc66cc;"> </span><!-- 添加读写sdcard的授权 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 单元测试 -->
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.example.android_sdcard" >
</instrumentation>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<!-- 这里加一句话 -->
<uses-library android:name="android.test.runner"/>
<activity
android:name="com.example.android_sdcard.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>