文档章节

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

指尖残雪
 指尖残雪
发布于 2016/05/22 23:56
字数 926
阅读 19
收藏 0

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



首先是布局文件:

效果图:


代码部分:

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>



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

本文转载自:http://blog.csdn.net/bq1073100909/article/details/37887735

共有 人打赏支持
指尖残雪
粉丝 7
博文 73
码字总数 0
作品 0
上海
后端工程师
私信 提问
android学习笔记9--------------SD卡读写文件

把文件存入SD卡中 首先加入读写权限 SD卡创建与删除文件权限 <uses-permission android:name="android.permission.MOUNTUNMOUNTFILESYSTEMS"></uses-permission> SD卡写入数据权限 <uses-pe......

晨曦之光
2012/03/15
0
0
android学习笔记8--------------数据的存储与访问(2)

转载注明出处:袁方的技术博客 http://blog.csdn.net/yf210yf 承接 android学习笔记6----------数据的存储与访问(1) 最后: Activity的设计。 效果图: import java.io.IOException;impor...

晨曦之光
2012/03/15
0
0
说说 Android 中如何使用摄像头和相册

很多 APP 应用都有用户头像功能,用户既可以调用摄像头马上拍一张美美的自拍,也可以打开相册选取一张心仪的照片作为头像。 1 调用摄像头 布局文件: 活动类代码: getExternalCacheDir() 可...

deniro
05/26
0
0
Android平台通用安全问题分析及策略(一)

©著作权归作者所有:来自51CTO博客作者samsunglinux的原创作品,如需转载,请注明出处,否则将追究法律责任 安全Android移动平台信息安全 5 分享 微博QQ微信 收藏 上一篇:译著《Fedora和R...

samsunglinux
07/02
0
0
安卓应用安全指南 4.6.2 处理文件 规则书

安卓应用安全指南 4.6.2 处理文件 规则书 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 遵循以下规则: 4.6.2.1 文件原则上必须创建...

apachecn_飞龙
03/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring应用学习——AOP

1. AOP 1. AOP:即面向切面编程,采用横向抽取机制,取代了传统的继承体系的重复代码问题,如下图所示,性能监控、日志记录等代码围绕业务逻辑代码,而这部分代码是一个高度重复的代码,也就...

江左煤郎
今天
4
0
eclipse的版本

Eclipse各版本代号一览表 Eclipse的设计思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。 Eclipse基本内核包括:图形API(SWT/Jface),Java开发环...

mdoo
今天
3
0
SpringBoot源码:启动过程分析(一)

本文主要分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 还是老套路,先把分析过程的时序图摆出来:时序图-SpringBoot2.10启动分析 二.源码分析 首...

Jacktanger
今天
4
0
小白带你认识netty(二)之netty服务端启动(上)

上一章 中的标准netty启动代码中,ServerBootstrap到底是如何启动的呢?这一章我们来瞅下。 server.group(bossGroup, workGroup);server.channel(NioServerSocketChannel.class).optio...

天空小小
今天
3
0
聊聊storm trident batch的分流与聚合

序 本文主要研究一下storm trident batch的分流与聚合 实例 TridentTopology topology = new TridentTopology(); topology.newStream("spout1", spout) .p......

go4it
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部