在上一篇文章中我们介绍了SharedPreferences的使用方法。

今天我们继续介绍另一种储存数据的方式:使用内部储存和外部储存

 

每一个Android设备都拥有两个数据储存区域:外部储存和外部储存

那么我们应该采用哪种储存方式呢?

我们先对比一下这两种储存方式的不同:



内部储存:

  • 总是可用的
  • 保存在这里的文件只能被你的app访问
  • 当程序被卸载的时候,系统会删除所有属于该应用的文件 当你不希望你的文件被其他人或应用访问到的时候,内部储存是最好的选择



外部储存:

  • 当sd卡被用户卸载的时候不可用,因此可能需要做额外的检测动作
  • 外部储存可被所有人或应用读取,安全性差
  • 当应用被卸载的时候,只有保存在通过getExternalFilesDir()获取的路径上的文件被删除 当储存空间紧缺和文件的访问不需要被限制的时候,外部储存是最好的选择



保存文件到内部储存

文件的操作主要用到java的io包里面的类。

要获取属于你的程序的储存空间,可以使用下面的两个方法:

getFilesDir()

          返回一个File类型的内部储存路径

getCacheDir()

          返回一个File类型的内部临时储存路径

 

先看一下运行效果:

android app申请存储管理 android储存方式_android

 

运行完毕到Eclipse的ddms视图就可以看到文件已经被写入:

 

android app申请存储管理 android储存方式_开发工具_02

 

详细代码:

package com.whathecode.storageoptinos;

import java.io.FileOutputStream;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity
{

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

		final EditText namefield = (EditText) findViewById(R.id.username);
		final EditText agefield = (EditText) findViewById(R.id.age);

		Button btnWrite = (Button) findViewById(R.id.write);

		SharedPreferences spf = getSharedPreferences("record", MODE_PRIVATE);
		// 获取编辑器
		final SharedPreferences.Editor editor = spf.edit();

		btnWrite.setOnClickListener(new View.OnClickListener()
		{

			@Override
			public void onClick(View v)
			{
				String filename = "person.txt";
				// File file = new File(getBaseContext().getFilesDir(),
				// filename);

				String username = namefield.getText().toString();
				String age = agefield.getText().toString();

				try
				{
					FileOutputStream openFileOutput = openFileOutput(filename,
							Context.MODE_PRIVATE);

					openFileOutput.write(username.getBytes());
					openFileOutput.write(age.getBytes());

					openFileOutput.close();

					Toast.makeText(getBaseContext(),
							"file saved at " + getFilesDir().toString(),
							Toast.LENGTH_LONG).show();
				} catch (Exception e)
				{
					e.printStackTrace();
				}
			}
		});
	}
}

 

保存文件到外部储存

和内部储存不同,写文件到外部储存需要在AndroidManifest文件中获取相应的权限。

 

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

 

当你的程序获得了写外部储存的权限的时候,同时隐式地获得读的权限,因此不需要另外添加读的权限。

 

运行结果:

android app申请存储管理 android储存方式_开发工具_03

 

程序代码:

package com.whathecode.storageoptinos;

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

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity
{

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

		final EditText namefield = (EditText) findViewById(R.id.username);
		final EditText agefield = (EditText) findViewById(R.id.age);

		Button btnWrite = (Button) findViewById(R.id.write);

		btnWrite.setOnClickListener(new View.OnClickListener()
		{

			@Override
			public void onClick(View v)
			{
				String filename = "person.txt";

				String externDir = getExternalFilesDir(null).toString();
				// 准备数据写入
				String username = namefield.getText().toString();
				String age = agefield.getText().toString();

				// 判断sd卡是否挂载,sd卡存在则开始写入文件
				if (Environment.getExternalStorageState().equals(
						Environment.MEDIA_MOUNTED))
				{
					try
					{
						FileOutputStream fos = new FileOutputStream(new File(
								externDir, filename));
						fos.write(username.getBytes());
						fos.write(age.getBytes());

						fos.close();

						Toast.makeText(getBaseContext(),
								"file saved at " + externDir, Toast.LENGTH_LONG)
								.show();
					} catch (Exception e)
					{
						e.printStackTrace();
					}

				} else
				{
					Toast.makeText(getBaseContext(), "SD卡不存在",
							Toast.LENGTH_SHORT).show();
				}

			}
		});

	}
}

文件保存路径:

android app申请存储管理 android储存方式_android_04