项目里需要按照二进制读取一个30M左右的.bin文件,并且赋值到char[]里面。
之前写过一篇文章 读取assets目录下的文件(.bin文件.txt文件) 当实际使用的时候会发现很多问题,例如:
1,读取的速度太慢(因为之前是按行读的,30M的文件按行读。。。我等了十分钟还没好,估计要很久很久)
2,读取的方式不正确,导致最终读出来的文件大小不正确。(因为之前那个连接里面的.bin文件是.txt文件的,所以实际上是按照txt文件读取的,所以不正确)
所以新写一篇,两篇差别还是挺大的、、、不过这一篇也是全部步骤都有,所以不用担心必须要看完前一篇才能看懂这一篇(其实我写的都挺傻瓜式的。。。一步一步照着做就 阔以了 现在文章里面关于原理解释方面的还是很少,主要偏向于实际应用。。。因为原理懂得不是很多,哈哈哈)
第一步:导入大文件 ExtFlashDat.bin
左边切换到Project 目录下面 在main目录下 新建 assets 文件,如图:
第二步: 新建一个工具类来调用 就命名为LcndUtil 吧
然后就是最重要的一步啦,,,很重要,就是把下面的带代码粘贴进那个工具类里面哈哈哈,
下面有讲解里面里面某些跟之前文章的区别:
LcndUtil 完整代码:
public class LcndUtil {
public static int qwe(Context c , char[] a ) {
AssetManager manager = c.getResources().getAssets();
try {
InputStream inputStream = manager.open("ExtFlashDat.bin");
InputStreamReader isr = new InputStreamReader(inputStream , "ISO-8859-1" );
BufferedReader br = new BufferedReader(isr);
int length;
length = br.read(a,0,32*1024*1024);
//关流
br.close();
isr.close();
inputStream.close();
return length;
} catch (IOException e) {
e.printStackTrace();
}
return 0;
}
}
方法的返回值是 长度(字节)。
可以看到AssetManager 有一个 open方法 里面输入的是 assets目录下的要读取那个文件的 名字(精确到后缀名),结果返回的是一个InputStream 对象
InputStreamReader 初始化传参 第一个很好理解 就是上面的InputStream 对象 第二个是一个String 类型,它代表的就是你要按照什么 编码格式 去读取这个文件 , 按照不同的编码格式去读取相同文件,读取出来的内容和大小都不一样(废话。。。),
那这个 “编码格式” 到底是啥呢? 听起来很熟悉 之前写过一篇关于乱码的文章 也讲到过,实际上就是AS 下面 那个我么你一般看起来是 “UTF-8” 的那个, 把那个点开, 下面有一个more 点开,会看到很多很多的 编码格式,其中我们要用的就是“ISO-8859-1” 这一种 这种就是按照二进制读取的。 下面是MainActivity里面调用的代码:
public char[] aaa;
aaa = new char[32 * 1024 * 1024];
LcndUtil.qwe(MainActivityAAA.this, aaa);
然后我用系统时间测试了一下执行时间,结果:0.5s 妈呀,很快很爽, 最后我是存到了一个char[] 里面。 --------------------------------------------------------------------------------------------------------------------------
下面可能有人会问: 你只是把char[] 传参进去了 可是返回值是int 那你没有改变char[] 的内容啊,应该最后返回值是char[]然后赋值给一个 char[]啊 ? 哈哈哈哈, 你可以在调用这个方法后试一试有没有改变这个值, 然后看一下我置顶的一篇文章 : Java 值传递和引用传递 OK 然后就没了