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

这个是资源的目录参考(看的时候一目了然):



首先是布局文件:

效果图:


代码部分:

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>



在日志输出过滤后就可以看到刚刚输入保存文件的内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值