首页 > android > android复制assets中的文件夹到指定目录

android复制assets中的文件夹到指定目录

android的assets中的文件是通过AssetManager拿InputStream去读取的,所以正常的文件接口,如判断文件是否存在、判断是否是目录等都不能用。因此不能用普通文件操作的方法,通过判断是否是目录,而递归遍历某个文件夹。

对上述情况,我采用的方法是:用AssetManager的open方法去打开一个文件,如果打开成功,证明是文件,直接拷贝;如果打开不成功,则有可能是目录,则进行递归。

具体代码如下:

	/**
	 * 复制assets中的文件到指定目录下
	 * @param context
	 * @param assetsFileName
	 * @param targetPath
	 * @return
	 */
	public static boolean copyAssetData(Context context, String assetsFileName, String targetPath) {
		try {
			InputStream inputStream = context.getAssets().open(assetsFileName);
			FileOutputStream output = new FileOutputStream(targetPath + File.separator + assetsFileName);
			byte[] buf = new byte[10240];
			int count = 0;
			while ((count = inputStream.read(buf)) > 0) {
				output.write(buf, 0, count);
			}
			output.close();
			inputStream.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
		return true;
	}

	public static void copyAssetsDir(Context context, String dirName, String targetFolder) {
		try {
			File f = new File(targetFolder + File.separator + dirName);
			if(!f.exists() && !f.isDirectory())
				f.mkdirs();

			String[] filenames = context.getAssets().list(dirName);
			InputStream inputStream = null;
			for(String filename : filenames) {
				String name = dirName + File.separator + filename;
				//如果是文件,则直接拷贝,如果是文件夹,就会抛出异常,捕捉后递归拷贝
				try {
					inputStream = context.getAssets().open(name);
					inputStream.close();
					copyAssetData(context, name, targetFolder);
				} catch (Exception e) {
					copyAssetsDir(context, name, targetFolder);
				} finally {
					inputStream = null;
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
分类: android 标签: