专栏首页老欧说安卓Android开发笔记(二十五)assets目录下的文件读取

Android开发笔记(二十五)assets目录下的文件读取

AssetManager工具类

assets目录用于存放应用程序的资产文件,该目录下的文件不会被系统编译,所以无法通过R.*.*这种方式来访问。Android专门为assets目录提供了一个工具类AssetManager,通过该工具,我们能够以字节流方式打开assets下的文件,并将字节流转换为文本或者图像。 AssetManager提供了如下方法用于处理assets: 1、 String[] list(String path); 列出该目录下的下级文件和文件夹名称 2、 InputStream open(String fileName); 以顺序读取模式打开文件,默认模式为ACCESS_STREAMING 3、 InputStream open(String fileName, int accessMode); 以指定模式打开文件。读取模式有以下几种: ACCESS_UNKNOWN : 未指定具体的读取模式 ACCESS_RANDOM : 随机读取 ACCESS_STREAMING : 顺序读取 ACCESS_BUFFER : 缓存读取 4、 void close() 关闭AssetManager实例

assets下的文件操作

assets目录下主要存放四种文件:文本文件、图像文件、网页文件(包括html中引用的js/ccs/jpg等资源)、音频视频文件 文本文件的读取操作:使用InputStream的read方法读出字节数组,然后按照指定字符编码将其转换为字符串。 图像文件的读取操作:使用BitmapFactory的decodeStream方法,将字节流转化为位图。 网页文件的读取操作:使用WebView的loadUrl方法,直接将网页文件加载到WebView控件中。 音频视频文件的读取操作:暂无 下面是完整的示例代码

import java.io.IOException;
import java.io.InputStream;

import com.example.exmassets.R;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {
	private final String TAG = "MainActivity";

	private TextView tvHint;
	private TextView tvTxt;
	private ImageView ivImg;
	private WebView wvHtm;
	private String fileName;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		tvHint = (TextView) findViewById(R.id.tvHint);
		tvTxt = (TextView) findViewById(R.id.tvTxt);
		ivImg = (ImageView) findViewById(R.id.ivImg);
		wvHtm = (WebView) findViewById(R.id.wvHtm);
		
		Button btn_txt = (Button) findViewById(R.id.btn_txt);
		Button btn_img = (Button) findViewById(R.id.btn_img);
		Button btn_htm = (Button) findViewById(R.id.btn_htm);
		btn_txt.setOnClickListener(this);
		btn_img.setOnClickListener(this);
		btn_htm.setOnClickListener(this);

		tvHint.setVisibility(View.VISIBLE);
		try {
			String[] fileNames = getAssets().list("");
			if (fileNames != null) {
				String fileDesc = String.format("assets根目录下找到%d个文件(夹):", fileNames.length);
				for (int i=0; i<fileNames.length; i++) {
					if (i != 0) {
						fileDesc = fileDesc + "、";
					}
					fileDesc = fileDesc + fileNames[i];
				}
				fileDesc = fileDesc + "。";
				tvHint.setText(fileDesc);
			} else {
				tvHint.setText("assets根目录下没有找到任何文件(夹)。");
			}
			Log.d(TAG, String.format("assets根目录下找到%d个文件(夹):", fileNames.length));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private String getTxtFromAssets(String fileName) {
		String result = "";
		try {
			InputStream is = getAssets().open(fileName);
			int lenght = is.available();
			byte[]  buffer = new byte[lenght];
			is.read(buffer);
			result = new String(buffer, "utf8");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}
	
	private Bitmap getImgFromAssets(String fileName) {
		Bitmap bitmap = null;
		try {
			InputStream is = getAssets().open(fileName);
			bitmap = BitmapFactory.decodeStream(is);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return bitmap;
	}

	@Override
	public void onClick(View v) {
		if (v.getId() == R.id.btn_txt) {
			fileName = "txt/libai.txt";
			tvHint.setText("当前打开的文本文件名是:"+fileName);
			tvTxt.setVisibility(View.VISIBLE);
			ivImg.setVisibility(View.GONE);
			wvHtm.setVisibility(View.GONE);
			tvTxt.setText(getTxtFromAssets(fileName));
		} else if (v.getId() == R.id.btn_img) {
			fileName = "images/water.jpg";
			tvHint.setText("当前打开的图像文件名是:"+fileName);
			tvTxt.setVisibility(View.GONE);
			ivImg.setVisibility(View.VISIBLE);
			wvHtm.setVisibility(View.GONE);
			ivImg.setImageBitmap(getImgFromAssets(fileName));
		} else if (v.getId() == R.id.btn_htm) {
			fileName = "file:///android_asset/html/index.html";
			tvHint.setText("当前打开的网页文件名是:"+fileName);
			tvTxt.setVisibility(View.GONE);
			ivImg.setVisibility(View.GONE);
			wvHtm.setVisibility(View.VISIBLE);
			wvHtm.loadUrl(fileName);
			wvHtm.setWebViewClient(mWebViewClient);
		}
	}
	private WebViewClient mWebViewClient = new WebViewClient();

}

下面是assets文件读取的效果图

点击下载本文用到的assets文件读取的工程代码

点此查看Android开发笔记的完整目录

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android开发笔记(九十九)圆形转盘

    圆形转盘的运用场景常见的有:抽奖转盘、圆形菜单列表、热点客户端环状列表等等。对于圆形转盘的编码实现,主要难点除了手势的触摸控制之外,就在于旋转角度的计算了。...

    用户4464237
  • Android开发笔记(一百零八)智能语音

    如今越来越多的app用到了语音播报功能,例如地图导航、天气预报、文字阅读、口语训练等等。语音技术主要分两块,一块是语音转文字,即语音识别;另一块是文字转语音...

    用户4464237
  • Android开发笔记(九十六)集合动画与属性动画

    补间动画有四大类:透明度动画AlphaAnimation、旋转动画RotateAnimation、缩放动画ScaleAnimation、平移动画Transl...

    用户4464237
  • springboot-2-springboot的文件上传和下载

    1, 需要使用thymeleaf模板: http://www.cnblogs.com/wenbronk/p/6565834.html

    用户5640963
  • Python随笔(三)虚拟机运行原理 原

    说到Python的运行机制,就不得不从.pyc文件和字节码说起 PyCodeObject对象的创建时机是模块加载的时候,即import。

    Pulsar-V
  • 魅族 成也黄章败也黄章

    罗超为网易科技专栏撰稿,2013年6月18日发表。 声明:本文发出后,Super的微博微信都收到前所未有的攻击甚至谩骂,网易的评论1400多条也基本是骂声一片。...

    罗超频道
  • MySQL的异步复制、全同步复制与半同步复制

    今天主要聊一下MySQL的异步复制、全同步复制与半同步复制,目前我们生产库实际上用的就是异步复制了,后面再转成半同步复制。

    木禾wen
  • 大会 | CVPR 2018,AI科技评论将亲临美国盐湖城现场!

    CVPR 2018 即将开幕,届时AI 科技评论将带来专题报道,欢迎大家持续关注。

    AI科技评论
  • 安卓开发_浅谈ListView(ArrayAdapter数组适配器)

    听着music睡
  • WMS图例展示

    在OGC标准中,可以通过GetLegendGraphic接口来获取图例,本文讲述如何结合WMS的REST接口,实现唯一值渲染图层每个值对应的图例的获取。

    lzugis

扫码关注云+社区

领取腾讯云代金券