Android_基础_手机内存SDcard数据操作及容量查询

1.保存至手机内部

可通过Environment.getDataDirectory()得到手机内部文件的目录,为/data/data

(1).文件操作模式

默认存放至/data/data/<package name>/files

操作模式

说明

Context.MODE_APPEND

如果文件存在,直接向文件的末尾写入数据,而不是擦除这个文件。否则创建文件

Context.MODE_PRIVATE

该模式为默认创建模式,只有本应用(需要相同的userid)才能访问该文件。

Context.MODE_WORLD_READABLE

允许其它程序可读,在API level 17中已经过时,该模式存在很大的安全漏洞,可以通过比如ContentProvider, BroadcastReceiver, and Service达到同样的目的。

Context.MODE_WORLD_WRITEABLE

允许其它程序可写,在API level 17中已经过时,存在安全隐患。

 Android有一套自己的安全模型,当应用程序安装时系统就会为该应用程序分配一个userid,当该应用要去访问其它资源时,就需要userid匹配,默认情况下,任何应用程序创建文件(file文件, sharedpreferences, 数据库),都应私有,不可以被其它应用程序访问。除非指定可读可写模式,但是最后不要这样操作,有安全隐患!

(2).常见操作的流对象

//	1.得到文件输出流
FileOutputStream fo = getContext().openFileOutput(filename, Context.MODE_PRIVATE);
//	2.得到文件输入流
FileInputStream fi = MainActivity2.this.openFileInput(filename);
//	3.得到files目录下指定的文件
File file = this.getFileStreamPath(filename);

(3).操作实例

//	1.保存文件操作
saveButton.setOnClickListener(new View.OnClickListener() {
	public void onClick(View v) {
		String filename = filenameEdit.getText().toString();
		String content = fileContentEdit.getText().toString();
		if ("".equals(filename) || "".equals(content)) {
			Toast.makeText(MainActivity2.this, "请完整输入!",
					Toast.LENGTH_SHORT).show();
			return;
		}
		try {
			save(filename, content);
			Toast.makeText(MainActivity2.this, "保存成功!",
					Toast.LENGTH_SHORT).show();
		} catch (Exception e) {
			Toast.makeText(MainActivity2.this, "保存失败!",
					Toast.LENGTH_SHORT).show();
		}
	}

	private void save(String filename, String content) throws Exception {
		//打开文件或者创建 默认目录下的filename文件
		FileOutputStream fo = MainActivity2.this.openFileOutput(
				filename, 
				Context.MODE_PRIVATE);	//文件的操作模式
		fo.write(content.getBytes());	//想输出流写入数据
		fo.close();						//关闭流对象
	}
});

//	2.读取文件操作
openButton.setOnClickListener(new View.OnClickListener() {
	public void onClick(View v) {
		String filename = filenameEdit.getText().toString();
		if ("".equals(filename)) {
			Toast.makeText(MainActivity2.this, "请完整输入!",
					Toast.LENGTH_SHORT).show();
			return;
		}
		try {
			byte[] bytes = read(filename);
			fileContentEdit.setText(new String(bytes));
		} catch (FileNotFoundException e) {
			Toast.makeText(MainActivity2.this, "文件不存在!",
					Toast.LENGTH_SHORT).show();
		} catch (Exception e) {
			Toast.makeText(MainActivity2.this, "读取失败!",
					Toast.LENGTH_SHORT).show();
		}
		Toast.makeText(MainActivity2.this, "读取成功!", Toast.LENGTH_SHORT)
				.show();
	}
	
	private byte[] read(String filename) throws FileNotFoundException,
			Exception {
		//打开文件或者创建 默认目录下的filename文件,得到输入流对象
		FileInputStream fi = MainActivity2.this.openFileInput(filename);
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		int len = -1;
		byte[] buffer = new byte[1024];
		while ((len = fi.read(buffer)) != -1) {
			bos.write(buffer, 0, len);
		}
		return bos.toByteArray();	//得到字节码文件
	}
});

//	3.删除files目录下指定的文件
deleteButton.setOnClickListener(new View.OnClickListener() {
	public void onClick(View v) {
		String filename = filenameEdit.getText().toString();
		if ("".equals(filename)) {
			Toast.makeText(MainActivity2.this, "请完整输入!",
					Toast.LENGTH_SHORT).show();
			return;
		}
		if (delete(filename)) {
			Toast.makeText(MainActivity2.this, "删除成功!",
					Toast.LENGTH_SHORT).show();
		} else {
			Toast.makeText(MainActivity2.this, "删除失败!",
						Toast.LENGTH_SHORT).show();
			}
		}
	});
	private boolean delete(String filename) {
		//得到files目录下指定的文件
		File file = this.getFileStreamPath(filename);
		return file.delete();	//删除文件
	}
}

2.保存至SDcard

可通过Environment.getExternalStorageDirectory()得到SDcard目录,为/mnt/scard

(1).操作权限

android.permission.READ_EXTERNAL_STORAGE
 <!-- Android 4.1 允许应用从SD中读取文件信息,在Android 4.1及以上版本需要声明该权限,为确保以后程序的正确运行,需要声明该权限! -->

android.permission.WRITE_EXTERNAL_STORAGE
<!-- targetSdkVersion 4 允许应用向SD写入文件信息,在targetSdkVersion 4版本及以上版本需要声明该权限-->

(2).常见细节

除上面需要声明的用户权限外,保存至SD卡,应该首先判断外设是否可读写,在通过Environment.getExternalStorageDirectory()得到外设的目录

//	1.得到外存储设备的状态
String state = Environment.getExternalStorageState();
//	2.判断当前的状态是否可读写
if (Environment.MEDIA_MOUNTED.equals(state)) {
//	3.得到外存储设备的目录
		File file = new File(Environment.getExternalStorageDirectory(),
			filename);
//	操作...
}

(3).操作实例

openButton.setOnClickListener(new View.OnClickListener() {
	public void onClick(View v) {
		String filename = filenameEdit.getText().toString();
		if("".equals(filename)){
			Toast.makeText(MainActivity.this, "请完整输入!", Toast.LENGTH_SHORT).show();
			return;
		}
		try {
			byte[] bytes = read(filename);
			fileContentEdit.setText(new String(bytes));
		} catch (FileNotFoundException e) {
			Toast.makeText(MainActivity.this, "文件不存在!", Toast.LENGTH_SHORT).show();
		}catch (Exception e) {
			Toast.makeText(MainActivity.this, "读取失败!", Toast.LENGTH_SHORT).show();
		}
		Toast.makeText(MainActivity.this, "读取成功!", Toast.LENGTH_SHORT).show();
	}
	private byte[] read(String filename) throws FileNotFoundException,Exception  {
		//	1.得到外存储设备的状态
		String state = Environment.getExternalStorageState();
		//	2.判断当前的状态是否可读写
		if (Environment.MEDIA_MOUNTED.equals(state)) {
		//	3.得到外存储设备的目录
			File file = new File(Environment.getExternalStorageDirectory(),
					filename);
		//	4.流操作
			FileInputStream fi = new FileInputStream(file);
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			int len = -1;
			byte[] buffer = new byte[1024];
			while ((len = fi.read(buffer)) != -1) {
				bos.write(buffer, 0, len);
			}
			return bos.toByteArray();
		}
		return null;
	}
});

3.查询手机的容量信息

public void getSize(){
	//	1.得到手机内存的根目录
	File file = Environment.getDataDirectory();
	//	2.创建StatFs对象
	StatFs statFs = new StatFs(file.getPath());
	//	3.根据statFs得到需要信息
	int blockSize = statFs.getBlockSize();			// 一个block的大小
	int totalBlock = statFs.getBlockCount();		// 总共的block数目
	int availBlock = statFs.getAvailableBlocks();	// 当前可用的block数目
	//	4.输出容量信息
	String avail = Formatter.formatFileSize(MainActivity.this, blockSize*availBlock);	// 大小*可用数目
	String total = Formatter.formatFileSize(MainActivity.this, blockSize*totalBlock);	// 大小*总数目
	fileContentEdit.setText(avail+"\n"+total);
}

 

你可能感兴趣的:(存储,Environment,sdcard,statfs)