assets英文单词的表面意思是资产、资源,顾名思义,这个文件夹下放的肯定是一些资源文件,而且 assets 文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像 xml, java 文件被预编译,可以存放一些图片,html,js, css 等文件。assets文件夹下的文件不会被映射到R.java中,访问的时候要用到AssetManager类。
可以通过以下方式获取输入流来进行写操作:
AssetManager am = null;
am = getAssets();
InputStream in = am.open("filename");
关于这个文件路径即filename,简单说一下。
现在assets文件夹下有一个images文件夹,iamges文件夹下有一张名为large.jpg 的图片。
filename=images/large.jpg
下面上代码具体看一下是怎么引用的(亲测好使)。这段代码实现的功能是将large.jpg复制到路径为/mnt/sdcard/Imagexiang/a.jpg上面 ,纸上得来终觉浅,绝知此事要躬行嘛。
package xiang.assetsdemotest;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.res.AssetManager;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AssetManager assetManager=getAssets();
InputStream asset = null;//用来获取从assets文件夹下的输入流
OutputStream out = null;//输出流,用来复制图片
BufferedInputStream bis=null;//缓存输入流
BufferedOutputStream bos=null;//缓存输出流
try {
asset=assetManager.open("images/large.jpg");
bis=new BufferedInputStream(asset);
out=new FileOutputStream(Environment.getExternalStorageDirectory().getPath()+"/Imagexiang/a.jpg");
bos=new BufferedOutputStream(out);
byte ima[]=new byte[1024];
int len;
while((len=bis.read(ima))!=-1)
{
bos.write(ima, 0, len);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try {
if(bos!=null)
{
bos.close();
}
if(out!=null)
{
out.close();
}
if(bis!=null)
{
bis.close();
}
if(asset!=null)
{
asset.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
还有一点:
Google的Android系统处理Assert有个bug,在AssertManager中不能处理单个超过1MB的文件,不然会报异常。
附:
outputStream与InputStream使用只能传输字节byte
InputStream
InputStream 是所有的输入字节流的父类,它是一个抽象类。
InputStream in=new FileInputStream(文件); //声明一个输入对象//多态的方式
byte[] b=new byte[1024];
in.read(b); //读取文件内容到b
in.close(); //关闭输入流
System.out.println(new String(b)); //输出
outputStream
OutputStream 是所有的输出字节流的父类,它也是一个抽象类。
OutputStream out = new FileOutputStream(文件); // 准备好一个输出的对象//多态
String str = "Hello World!!!" ; // 准备一个字符串
byte b[] = str.getBytes() ; // 只能输出byte数组,所以将字符串变为byte数组
out.write(b) ; // 将内容输出,保存文件
out.close() ; // 关闭输出流