Android android下的数据持久化和读取数据,保存数据到手机及SD卡

openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android 会自动创建它。创建的文件保存在/data/data/<package name>/files目录,如: /data/data/cn.itcast.action/files/itcast.txt ,通过点击Eclipse菜单“Window”-“Show View”-“Other”,在对话窗口中展开android文件夹,选择下面的File Explorer视图,然后在File Explorer视图中展开/data/data/<package name>/files目录就可以看到该文件。
openFileOutput()方法的第二参数用于指定操作模式,有四种模式,分别为: 

Context.MODE_PRIVATE    =  0
Context.MODE_APPEND    =  32768
Context.MODE_WORLD_READABLE =  1
Context.MODE_WORLD_WRITEABLE =  2

Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
如果希望文件被其他应用读和写,可以传入: 
openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);

android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data/<package name>/files),其他程序无法访问。除非在创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有这样其他程序才能正确访问。

getExternalStorageState()方法获得SD卡挂载情况。

getExternalStorageDirectory()方法可以获得外部存储器路径,建议这样写。

读取文件知识点:

对于私有文件只能被创建该文件的应用访问,如果希望文件能被其他应用读和写,可以在创建文件时,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。

Activity还提供了getCacheDir()和getFilesDir()方法:
getCacheDir()方法用于获取/data/data/<package name>/cache目录
getFilesDir()方法用于获取/data/data/<package name>/files目录

在模拟器中使用SDCard,你需要先创建一张SDCard卡(当然不是真的SDCard,只是镜像文件)。创建SDCard可以在Eclipse创建模拟器时随同创建,也可以使用DOS命令进行创建,如下:
在Dos窗口中进入android SDK安装路径的tools目录,输入以下命令创建一张容量为2G的SDCard,文件后缀可以随便取,建议使用.img:
mksdcard 2048M D:\AndroidTool\sdcard.img

在程序中访问SDCard,你需要申请访问SDCard的权限。
在AndroidManifest.xml中加入访问SDCard的权限如下:
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

MainActivity.java:

package com.example.datesave;

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

public class MainActivity extends Activity implements OnClickListener{
	
	private EditText mEtName;
	private	EditText mEtPwd;
	private	Button mBtLogin;
	private	CheckBox mCb;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		  setContentView(R.layout.activity_main);
	mEtName = (EditText) this.findViewById(R.id.qq_number);	
    mEtPwd = (EditText) this.findViewById(R.id.pw);
	mBtLogin = (Button) this.findViewById(R.id.login);
	mCb = (CheckBox) this.findViewById(R.id.pw_remember);
	mBtLogin.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.login:
			if (mCb.isChecked()) {
				saveservise service = new saveservise(this);
				String name =mEtName.getText().toString().trim();
				String pwd =mEtPwd.getText().toString().trim();
				Log.i("11", name+":"+pwd);
				service.saveToRomFile(name, pwd);
				service.saveToSD(name, pwd);
				Toast.makeText(this, "SD OK", Toast.LENGTH_LONG).show();
			}else {
				Toast.makeText(this, "loading...", Toast.LENGTH_LONG).show();
			}
			break;

		default:
			break;
		}
	}
}
saveservise.java:

package com.example.datesave;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

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

public class saveservise {
	// 还没被初始化
	private Context context;

	public saveservise(Context context) {
		this.context = context;
	}

	/**
	 * 保存到手机
	 * 
	 * @param name
	 * @param pwd
	 */
	@SuppressWarnings("deprecation")
	public void saveToRomFile(String name, String pwd) {
		try {
			FileOutputStream fos = context.openFileOutput("chao.txt",
					Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
			String content = name + ";" + pwd;
			fos.write(content.getBytes());
			fos.flush();
			fos.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/*
	 * 存到SD卡
	 */
	public void saveToSD(String name, String pwd) {
		try {
			//判断sd卡是否正常挂载
			if (Environment.MEDIA_MOUNTED.equals(Environment
					.getExternalStorageState())) {
				File file = new File(Environment.getExternalStorageDirectory(),
						"bing.txt");
				FileOutputStream fos = new FileOutputStream(file);
				String content = name + ";" + pwd;
				fos.write(content.getBytes());
				fos.flush();
			} else {
				Toast.makeText(context, "SD卡不可用", Toast.LENGTH_LONG).show();
			}
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			Toast.makeText(context, "sd卡写入失败", Toast.LENGTH_LONG).show();
			e.printStackTrace();
		}
	}
}
activity_main:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/qq" />

    <EditText
        android:id="@+id/qq_number"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:lines="1" />

    <EditText
        android:id="@+id/pw"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:lines="1" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.27"
        android:clickable="false" >

        <Button
            android:id="@+id/login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:text="@string/login" />

        <CheckBox
            android:id="@+id/pw_remember"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:text="@string/pw_remember" />

    </RelativeLayout>

</LinearLayout>  
在清单文件中加入下面权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>   
下面为读文件操作:
package com.example.dateread;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

	private EditText mEtName;
	private EditText mEtPwd;
	private Button mBtLogin;
	private CheckBox mCb;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		mEtName = (EditText) this.findViewById(R.id.qq_number);
		mEtPwd = (EditText) this.findViewById(R.id.pw);
		mBtLogin = (Button) this.findViewById(R.id.login);
		mCb = (CheckBox) this.findViewById(R.id.pw_remember);
		FileInputStream fis;
		try {
			fis = new FileInputStream(
					"/data/data/com.example.datesave/files/chao.txt");
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			byte[] buffer = new byte[1024];
			int len;

			while ((len = fis.read(buffer)) != -1) {
				bos.write(buffer, 0, len);
			}

			byte[] result = bos.toByteArray();
			String content = new String(result);
			String[] array = content.split(";");
			mEtName.setText(array[0]);
			mEtPwd.setText(array[1]);
			Toast.makeText(this, content, Toast.LENGTH_LONG).show();
		} catch (IOException e) {
			Toast.makeText(this, "获取失败", Toast.LENGTH_LONG).show();
			e.printStackTrace();
		}
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值