戏编程肯定不光只是用手机内存还要访问外部存储空间,主要是访问SD卡。先从读取资源文件开始。
我们知道assets/和res/文件夹用于存放可在应用程序中的使用文件。
assets/用于存储各种应用程序中需要的文件(例如配置文件或音频文件等),这些文件会打包在Android应用程序中。
res/包含应用程序所需的各种资源文件,如icons、用于国际化的字符串文件和用于界面布局的XML文件。它们同样打包于应用文件中。
在这里我们不使用res/文件夹,因为它对我们构造文件集存在限制。而assets/目录才是我们存放的地方,无论如何层次结构的文件夹都可以。
Assets/文件夹中的文件通过一个AssetManager类显示出来,我们可以在应用程序中引用该管理器,如下所示:
AssetManager assetManager = context.getAssets();
一旦我们得到AssetManager,就可以容易地打开文件:
InputStream inputStream = assetManager.open("dir/dir2/filename.txt");
该方法将返回一个普通Java输入流InputStream,通过它我们可以读取任何类型的文件。AssetManager.open()方法的唯一参数是相对于asset目录的文件名,如果路径为dir/dir2/filename.txt,那么在Eclipse里就是assets/dir/dir2/filename.txt。
现在我们从assets/目录下的一个texts子目录来加载txt文件并将其显示在TextView中。
代码如下:
package org.example.ch04_android_basics;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import android.app.Activity;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.widget.TextView;
public class AssetsTest extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
TextView textView = new TextView(this);
setContentView(textView);
AssetManager assetManager = getAssets();
InputStream inputStream = null;
try{
inputStream = assetManager.open("texts/myawesometext.txt");
String text = loadTextFile(inputStream);
textView.setText(text);
}catch(IOException e){
textView.setText("Couldn't load file");
}finally{
if(inputStream != null)
try{
inputStream.close();
}catch(IOException e){
textView.setText("Couldn't close file");
}
}
}
public String loadTextFile(InputStream inputStream) throws IOException{
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
byte[] bytes = new byte[4096];
int len = 0;
while((len = inputStream.read(bytes)) > 0)
byteStream.write(bytes, 0, len);
return new String(byteStream.toByteArray(), "UTF-8");
}
}
运行效果如下:
这里用了一个小方法loadTextFile(),用于从InputStream中读取所有字节并将所有字节转换成字符串返回,并采用UTF-8编码。