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目录下主要存放四种文件:文本文件、图像文件、网页文件(包括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文件读取的效果图