您的位置:首页 > 移动开发 > Android开发

Android文件的保存(本地和SD卡)与读取

2016-05-22 00:00 447 查看
这个是资源的目录参考(看的时候一目了然):

首先是布局文件:

效果图:

代码部分:

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/fileName"
/>

<EditText
android:id="@+id/fileNameEdit"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>

<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/fileContent"
/>

<EditText
android:id="@+id/fileContentEdit"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:minLines="3"
/>
<Button
android:id="@+id/saveBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/save"
/>
</LinearLayout>


类MainActivity.java代码:

package org.dyb.file;

import org.dyb.service.FileService;

import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

private EditText fileName;//文件名编辑器
private EditText fileContent;//文件内容编辑器
private Button save;//保存按钮

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//从R中获取文件名资源
fileName=(EditText) findViewById(R.id.fileNameEdit);
//从R中获取文件内容资源
fileContent=(EditText) findViewById(R.id.fileContentEdit);
//保存按钮资源获取
save=(Button) findViewById(R.id.saveBtn);
//设置单击事件进行文件保存,使用内部类接口实现
save.setOnClickListener(new SaveOnclick());
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
//设置单击事件进行文件保存,使用内部类接口实现
private class SaveOnclick implements View.OnClickListener{
@Override
public void onClick(View v) {
String fileNameString=fileName.getText().toString();
String fileContentString=fileContent.getText().toString();
//自定义FileService类并添加save方法,需要传入content
FileService fs=new FileService(MainActivity.this);
try{
//将文件保存在程序目录中
fs.save(fileNameString, fileContentString);

//将文件保存在SD卡中,去掉注释便可用
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
fs.saveToSDCard(fileNameString, fileContentString);
}else{
Toast.makeText(getApplicationContext(), "SD卡不存在或者写保护", Toast.LENGTH_SHORT).show();
}

Toast.makeText(getApplicationContext(), R.string.success, Toast.LENGTH_SHORT).show();
}catch(Exception e){
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
}
}


自定义的FileService类:

代码如下:文件默认写入程序的files中(文件一般在目录的data/data/程序包名/files/文件名,如果使用真机做测试,如果手机没有root并且该文件权限没有进行可读写设置,在eclipse中的DDMS中是打不开data目录的)

package org.dyb.service;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import android.content.Context;
import android.os.Environment;

public class FileService {
private Context context;

public FileService(){
}

public FileService(Context context){
this.context=context;
}
//保存到SD卡
public void saveToSDCard(String fileNameString,String fileContentString) throws Exception{
//Environment.getExternalStorageDirectory()获取系统SD卡目录
File file=new File(Environment.getExternalStorageDirectory(),fileNameString);
FileOutputStream outStream=new FileOutputStream(file);
outStream.write(fileContentString.getBytes());
outStream.close();
}

public void save(String fileNameString,String fileContentString) throws Exception{
//文件输出流
//其中两个参数一个是文件名一个是文件的权限,Context.MODE_PRIVATE代表只允许本程序读写
FileOutputStream outStream=context.openFileOutput(fileNameString,Context.MODE_PRIVATE);
//以字节流传入
outStream.write(fileContentString.getBytes());
outStream.close();
}

public String read(String fileNameString)throws Exception{
FileInputStream inStream=context.openFileInput(fileNameString);
//内存字节数组输出流,主要先将每次读取的字节流存入到内存中然后在进行输出
ByteArrayOutputStream outStream=new ByteArrayOutputStream();
//每次读取1024
byte[] buffer=new byte[1024];
int len=0;
while((len=inStream.read(buffer))!=-1){
outStream.write(buffer, 0, len);
}
//把内存中的数据转换为字节流
byte[] data = outStream.toByteArray();
//转换成字符串返回
return new String(data);
}
}


测试类:FTest.java,主要测试文件的读取,

代码如下:

package org.dyb.test;

import org.dyb.service.FileService;

import android.test.AndroidTestCase;
import android.util.Log;

public class FTest extends AndroidTestCase {
public void testread()throws Exception{
FileService fs=new FileService(this.getContext());
Log.i("junit", fs.read(<span style="color:#3366ff;">"d.txt"</span>));//文件名,自己可以修改我保存文件的时候用的是d.txt
}
}


然后在AndroidManifest.xml进行配置单元测试:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.dyb.file"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="org.dyb.file.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>
<uses-library android:name="android.test.runner"/>
</application>

<!-- 在SD卡中写入权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 在SD卡中创建与删除权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="org.dyb.file" android:label="test for my app"/>

</manifest>


在日志输出过滤后就可以看到刚刚输入保存文件的内容
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: