Android中的数据存储

转载请注明出处:http://blog.csdn.net/magic_jss/article/details/52746142;
国庆小长假已经接近尾声了,感觉还没开始呢就已经结束了!期间生物钟完全被打破,晚睡晚起计划泡汤各种泡汤真的不能再这样下去了 我决心戒掉拖延症,做个言出必行,行之必果的人。此文为鉴!!!

1、概述

Android中数据存储的分类:

本文只讲解内部存储、外部存储,其他两种方式可参考其他资料,数据库存储和SharedPreferences存储数据也保存到内部存储空间之中。其实Android中的数据储存,就是借助sdk提供的某些类获取某些路径,然后进行IO流操作。如果对IO流及File文件操作不是很了解可以分别参考http://blog.csdn.net/magic_jss/article/details/51475923,http://blog.csdn.net/magic_jss/article/details/51472205。

2、内部存储

内部存储:手机出厂前被内置的存储空间,空间有限,比如常说的32G、64G等。相当于我们PC的硬盘(可能比喻不是很恰当)内部存储不是运行内存。一个应用所创建的所有文件都在和应用包名相同的目录下。也就是说应用创建于内部存储的文件,与这个应用是关联起来的。当一个应用卸载之后,内部存储中的这些文件也被删除。内部存储一般用Context上下文来获取和操作,其方法的具体实现在ContextImpl类中。

常用方法:

context.getFilesDir();
// /data/data/包名/files

该方法返回应用程序的文件目录对象。

context.getDir("magic", Context.MODE_PRIVATE);
// /data/data/包名/app_magic

该方法返回应用程序用于请求的目录的文件对象。如果它不存在,则该目录将被创建。参数二为操作模式,使用mode_private为默认操作,mode_world_readable和mode_world_writeable权限控制。
操作模式分类:

  • Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容。
  • Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
  • Context.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取。
  • Context.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
context.getCacheDir();
// /data/data/包名/cache

该方法返回在文件系统上应用程序特定的缓存目录的绝对路径。

context.getDatabasePath("magic");
// /data/data/包名/databases/magic

该方法返回在文件系统上应用程序特定的数据库文件绝对路径。参数是数据库的名称。

context.getFileStreamPath("magic");
// /data/data/包名/files/magic

该方法返回getFilesDir()目录下的文件,参数为文件名。

// 删除指定文件名的内存存储文件
context.deleteFile("magic");
// 打开与此上下文相关联的应用程序包的一个私有文件
context.openFileInput("");
// 打开与此上下文相关联的应用程序包的一个私有文件。如果不存在则创建。
context.openFileOutput("", mode);

这两个方法内部都调用了getFilesDir()方法。
这里写图片描述

先看布局文件main.xml

<?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" >

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="left|top" />

    <Button
        android:id="@+id/button"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="保存文件" />

</LinearLayout>

MainActivity.java

/**
 * Created by magic on 2015年3月23日.内部存储
 */
public class MainActivity extends Activity {

	private EditText editText;
	private Button button;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		editText = (EditText) findViewById(R.id.editText);
		button = (Button) findViewById(R.id.button);
		// 读取数据
		readData();
		button.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// 保存数据
				savaData();
			}
		});
	}

	/**
	 * 读取内部存储数据
	 */
	public void readData() {
		try {
			// 获得输入流对象 data为文件名"
			InputStream inputStream = openFileInput("data");
			// inputStream.available()获取文件的总大小
			byte[] bytes = new byte[inputStream.available()];
			// 将数据读入字节数组 bytes
			inputStream.read(bytes);
			// 关闭流
			inputStream.close();
			String s = new String(bytes, "utf-8");
			Toast.makeText(this, "" + s, Toast.LENGTH_SHORT).show();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 保存到内部数据
	 */
	public void savaData() {
		try {
			// 获得输出流对象 第一个参数为"文件名" 第二个参数为文件可读性
			OutputStream outputStream = openFileOutput("data",Context.MODE_PRIVATE);
			// 写入数据
			outputStream.write(editText.getText().toString().getBytes("utf-8"));
			// 刷新 清空缓存区
			outputStream.flush();
			// 关闭流
			outputStream.close();
			Toast.makeText(this, "success!", Toast.LENGTH_SHORT).show();
			return;
		} catch (Exception e) {
			e.printStackTrace();
		}
		Toast.makeText(this, "fail!", Toast.LENGTH_SHORT).show();
	}

}

3、外部存储

外部存储:SD卡存储,将数据存储到SdCard。
使用先添加权限:

<uses-permission Android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

MainActivity.java

/**
 * Created by magic on 2015年3月23日.外部存储
 */
public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 得到外部存储的文件或者路径
		File dir = Environment.getExternalStorageDirectory();
		// 新建file对象
		File file = new File(dir, "myfile.txt");
		try {
			// 判断文件是否存在
			if (!file.exists()) {
				// 创建新的文件
				file.createNewFile();
			}
			// 得到输出流对象 输出字符串数据
			FileOutputStream outputStream = new FileOutputStream(file);
			outputStream.write(new String("hello world!!").toString().getBytes(
					"utf-8"));
			// 刷新缓冲区
			outputStream.flush();
			// 关闭流
			outputStream.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		try {
			// 得到输入流对象
			@SuppressWarnings("resource")
			FileInputStream inputStream = new FileInputStream(file);
			try {
				// 字节数组
				byte[] bytes = new byte[inputStream.available()];
				// 读入数据到程序中
				inputStream.read(bytes);
				String s = new String(bytes);
				Toast.makeText(this, s, 1).show();
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
}

由于外部存储使用频率较高,简单封装了个工具类方便使用。

/**
 * Created by magic on 2015年3月23日.文件操作工具类
 */
public class FileUtils {
	private String SDPATH;

	public String getSDPATH() {
		return SDPATH;
	}

	public FileUtils() {
		// 得到外部存储设备的目录
		SDPATH = Environment.getExternalStorageDirectory().getAbsolutePath();
		System.out.println(SDPATH);
	}

	/**
	 * 在SD卡上创建文件
	 */
	public File creatSDFile(String fileName, String dir) throws IOException {
		File file = new File(SDPATH + File.separator + dir + File.separator
				+ fileName);
		file.createNewFile();
		return file;
	}

	/**
	 * 在SD卡上创建目录
	 */
	public File creatSDDir(String dirName) {
		File dir = new File(SDPATH + File.separator + dirName);
		dir.mkdirs();
		return dir;

	}

	/**
	 * 判断SD卡上的文件夹是否存在
	 */
	public boolean isFileExist(String fileName, String path) {
		File file = new File(SDPATH + File.separator + path + File.separator
				+ fileName);
		return file.exists();

	}

	/**
	 * 将一个InputStream里面的数据写入到SD卡中
	 */
	public File write2SDFromInput(String path, String fileName,
			InputStream input) {
		File file = null;
		OutputStream output = null;
		try {
			creatSDDir(path);
			file = creatSDFile(fileName, path);
			output = new FileOutputStream(file);
			byte buffer[] = new byte[4 * 1024];
			int temp;
			while ((temp = input.read(buffer)) != -1) {
				output.write(buffer, 0, temp);
			}
			output.flush();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				output.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return file;
	}

}

若有问题恳请指正,欢迎留言交流!

删繁就简,轻装上阵。未来你好!

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值