android文件访问技巧

转自: http://www.360doc.com/content/11/1230/12/7471983_176041552.shtml

首先内部存储路径为/data/data/youPackageName/,下面讲解的各路径都是基于你自己的应用的内部存储路径下。所有内部存储中保存的文件在用户卸载应用的时候会被删除。

一、 files
1. Context.getFilesDir(),该方法返回/data/data/youPackageName/files的File对象。
2. Context.openFileInput()与Context.openFileOutput(),只能读取和写入files下的文件,返回的是FileInputStream和FileOutputStream对象。
3. Context.fileList(),返回files下所有的文件名,返回的是String[]对象。
4. Context.deleteFile(String),删除files下指定名称的文件。

二、cache
1. Context.getCacheDir(),该方法返回/data/data/youPackageName/cache的File对象。

三、custom dir
getDir(String name, int mode),返回/data/data/youPackageName/下的指定名称的文件夹File对象,如果该文件夹不存在则用指定名称创建一个新的文件夹。

有了数据存储 API,您可以使用内部存储器存储数据。信息可以是私有的,您可以有选择地让其他应用程序对之具有读或写的访问权限。本节介绍这个存储私有数据的 API,它使用 android.content.Context.openFileInput、openFileOutput 和 getCacheDir() 来高速缓存数据,而不是永久地存储。

清单 20 中的代码片段展示了如何从内部私有存储器读取数据。使得存储器为私有的方法是对 openFileOutput() 使用MODE_PRIVATE。

清单 20. 从本地私有存储器读取数据:
/**
	 * Writes content to internal storage making the content private to the
	 * application. The method can be easily changed to take the MODE as
	 * argument and let the caller dictate the visibility: MODE_PRIVATE,
	 * MODE_WORLD_WRITEABLE, MODE_WORLD_READABLE, etc.
	 * 
	 * @param filename
	 *            - the name of the file to create
	 * @param content
	 *            - the content to write
	 */

	public void writeInternalStoragePrivate(String filename, byte[] content) {
		try {
			// MODE_PRIVATE creates/replaces a file and makes
			// it private to your application. Other modes:
			// MODE_WORLD_WRITEABLE
			// MODE_WORLD_READABLE
			// MODE_APPEND
			FileOutputStream fos = openFileOutput(filename,
					Context.MODE_PRIVATE);
			fos.write(content);
			fos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

清单 21 中的代码片段展示了如何从内部私有存储器读取数据;注意 openFileInput() 的使用。

清单 21. 从内部私有存储器读取数据
/**
	 * Reads a file from internal storage
	 * 
	 * @param filename
	 *            the file to read from
	 * @return the file content
	 */
	public byte[] readInternalStoragePrivate(String filename) {
		int len = 1024;
		byte[] buffer = new byte[len];
		try {
			FileInputStream fis = openFileInput(filename);
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			int nrb = fis.read(buffer, 0, len); // read up to len bytes
			while (nrb != -1) {
				baos.write(buffer, 0, nrb);
				nrb = fis.read(buffer, 0, len);
			}
			buffer = baos.toByteArray();
			fis.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return buffer;
	}


清单 22 展示了如何从内部私有存储器删除数据。
清单 22. 从本地私有存储器删除数据
/**
	 * Delete internal private file
	 * 
	 * @param filename
	 *            - the filename to delete
	 */
	public void deleteInternalStoragePrivate(String filename) {
		File file = getFileStreamPath(filename);
		if (file != null) {
			file.delete();
		}
	}


现在可以来看为公共数据使用外部存储器了。

回页首

为公共数据使用设备的外部存储器


有了数据存储 API,您可以使用外部存储器存储数据。信息可以是私有的,您可以有选择地让其他应用程序对之具有读或写的访问权限。本节您将对此 API 进行编程,以便使用包括getExternalStorageState()、getExternalFilesDir()、getExternalStorageDirectory() 和

getExternalStoragePublicDirectory() 在内的很多 API 来存储公共数据。您为公共数据使用下面的路径:/Android/data/<package_name>/files/。

在使用外部存储器之前,必须看看它是否可用,是否可写。下面两个代码片段展示了测试这些条件的帮助器方法。


清单 23 测试外部存储器是否可用。

清单 23. 测试外部存储器是否可用
/**
	 * Helper Method to Test if external Storage is Available
	 */
	public boolean isExternalStorageAvailable() {
		boolean state = false;
		String extStorageState = Environment.getExternalStorageState();
		if (Environment.MEDIA_MOUNTED.equals(extStorageState)) {
			state = true;
		}
		return state;
	}


清单 24 测试外部存储器是否只可读。

清单 24. 测试外部存储器是否只可读
/**
	 * Helper Method to Test if external Storage is read only
	 */
	public boolean isExternalStorageReadOnly() {
		boolean state = false;
		String extStorageState = Environment.getExternalStorageState();
		if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(extStorageState)) {
			state = true;
		}
		return state;
	}


清单 25 展示了如何写到外部存储器,以存储公共数据。

清单 25. 写到外部内存
/**
	 * Write to external public directory
	 * 
	 * @param filename
	 *            - the filename to write to
	 * @param content
	 *            - the content to write
	 */
	public void writeToExternalStoragePublic(String filename, byte[] content) {
		// API Level 7 or lower, use getExternalStorageDirectory()
		// to open a File that represents the root of the external
		// storage, but writing to root is not recommended, and instead
		// application should write to application-specific directory, as shown
		// below.

		String packageName = this.getPackageName();
		String path = "/Android/data/" + packageName + "/files/";

		if (isExternalStorageAvailable() && !isExternalStorageReadOnly()) {
			try {
				File file = new File(path, filename);
				file.mkdirs();
				FileOutputStream fos = new FileOutputStream(file);
				fos.write(content);
				fos.close();
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}


清单 26 展示了如何从外部存储器读取数据。

清单 26. 从外部内存读取数据
/**
	 * Reads a file from internal storage
	 * 
	 * @param filename
	 *            - the filename to read from
	 * @return the file contents
	 */
	public byte[] readExternallStoragePublic(String filename) {
		int len = 1024;
		byte[] buffer = new byte[len];
		String packageName = this.getPackageName();
		String path = "/Android/data/" + packageName + "/files/";

		if (!isExternalStorageReadOnly()) {
			try {
				File file = new File(path, filename);
				FileInputStream fis = new FileInputStream(file);
				ByteArrayOutputStream baos = new ByteArrayOutputStream();
				int nrb = fis.read(buffer, 0, len); // read up to len bytes
				while (nrb != -1) {
					baos.write(buffer, 0, nrb);
					nrb = fis.read(buffer, 0, len);
				}
				buffer = baos.toByteArray();
				fis.close();
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return buffer;
	}


清单 27 中的代码片段展示了如何从外部内存删除文件。

清单 27. 从外部内存删除文件
/**
	 * Delete external public file
	 * 
	 * @param filename
	 *            - the filename to write to
	 */
	void deleteExternalStoragePublicFile(String filename) {
		String packageName = this.getPackageName();
		String path = "/Android/data/" + packageName + "/files/" + filename;
		File file = new File(path, filename);
		if (file != null) {
			file.delete();
		}
	}


处理外部存储器需要特殊的权限 WRITE_EXTERNAL_STORAGE,它通过 AndroidManifest.xml 请求得到(参见 清单 28)。

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


外部存储 API 通过根据文件类型(比如 Pictures、Ringtones)将文件存储在预先确定的目录中,允许您公共地存储文件。本文没有介绍这种方法,但是您应该熟悉它。此外,记住外部存储器中的文件任何时候都可能消失。

回页首

相关的方法

如果您具有不需要长期永久保存的临时文件,那么可以将这些文件存储在高速缓存中。高速缓存是一种特殊的内存,可以用于存储中小型数据(少于兆字节),但是您一定要知道,取决于有多少内存可用,高速缓存的内容任何时候都可能被清除。


清单 29 展示了一个帮助器方法,它返回到内部内存中高速缓存的路径。

清单 29. 检索到内部内存高速缓存的路径
/**
	 * Helper method to retrieve the absolute path to the application specific
	 * internal cache directory on the file system. These files will be ones
	 * that get deleted when the application is uninstalled or when the device
	 * runs low on storage. There is no guarantee when these files will be
	 * deleted.
	 * 
	 * Note: This uses a Level 8+ API.
	 * 
	 * @return the absolute path to the application specific cache directory
	 */
	public String getInternalCacheDirectory() {
		String cacheDirPath = null;
		File cacheDir = getCacheDir();
		if (cacheDir != null) {
			cacheDirPath = cacheDir.getPath();
		}
		return cacheDirPath;
	}


清单 30 展示了一个帮助器方法,它返回到外部内存中高速缓存的路径。

清单 30. 检索到外部内存高速缓存的路径
/**
	 * Helper method to retrieve the absolute path to the application specific
	 * external cache directory on the file system. These files will be ones
	 * that get deleted when the application is uninstalled or when the device
	 * runs low on storage. There is no guarantee when these files will be
	 * deleted.
	 * 
	 * Note: This uses a Level 8+ API.
	 * 
	 * @return the absolute path to the application specific cache directory
	 */
	public String getExternalCacheDirectory() {
		String extCacheDirPath = null;
		File cacheDir = getExternalCacheDir();
		if (cacheDir != null) {
			extCacheDirPath = cacheDir.getPath();
		}
		return extCacheDirPath;
	}

通过使用示例应用程序,您现在应该很好地理解了如何为公共数据使用设备的外部存储器。






转载于:https://www.cnblogs.com/sesexxoo/archive/2013/02/25/6189962.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值