Android 读取文件的正确打开方法
1.java 读取操作基本知识
图片来自:
从上图可以开出,java的读写操作(输入输出)可以用“流”这个概念来表示,总体而言,java的读写操作又分为两种:字符流和字节流。
1.1 流相关知识
流是一个抽象的概念。当java程序需要从数据源读取数据时,会开启一个到数据源的流。数据源可以是文件,内存或者网络等。同样,当程序需要输出数据到目的地时也一样会开启一个流,数据目的地也可以是文件、内存或者网络等。流的创建是为了更方便地处理数据的输入输出。
1.字节流和字符流的区别
1.字节流也称为原始数据,需要用户读入后进行相应的编码转换。而字符流的实现是基于自动转换的,读取数据时会把数据按照jvm的默认编码自动转换成字符。
2.字符流处理的单元为2个字节的unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。
所以字符流是由java将字节转化为2个字节的unicode字符为单位的字符而成的。
3.字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串,字节流提供了处理任何类型的io操作的功能,但它不能直接处理unicode字符,而字符流就可以;
2.字符流字节流如何选择
如果是音频文件、图片、歌曲,就用字节流好点;如果是中文(文本)的,用字符流更好;
3.使用步骤:
1 使用file类打开一个文件
2 通过字节流或字符流的子类,指定输出的位置,注,
3 进行读/写操作
4 关闭输入/输出
4。注意事项:
1.我们很容易搞混,或者弄不清inputstream和outpustream到底哪个是读数据,哪个是写数据,这里要说明的是,“读和写”是相对于程序本身而言的,主要记清楚一点即可,那就是凡是需要提供给程序处理的数据就是输入数据,当然就是inputstream,这里的in是要in到程序里面去,那么数据从哪里来呢,自然是从外界(网络,内存或者文件),那么针对文件而言,inputstream就是读文件了。反之,凡是程序已经处理过的数据,当然要流出程序啦,那就是out咯,所以outputstream就是输出的,那么从程序中流出,只能到外界(网络、内存或者文件),针对文件而言,就是写操作啦!(同样的道理可以针对字符流的操作)
2.错误的打开方式
需求描述:
需要获取手机里面一个txt文件的内容,里面为json数据。
于是乎,我写出了下面的代码
第一步:通过方法获取txt里面的数据:
private string gethardversioninformation(string key) { fileinputstream fis = null; string hardwareinfopath = "/firmware/verinfo/ver_info.txt"; byte[] bytes = new byte[1024];//一次读取1024字节的数据 int count; string allversioninfo = ""; string hardversioninfo = ""; try { fis = new fileinputstream(hardwareinfopath);//通过字节流获取 count = fis.read(bytes);//开始读取 fis.close();//关闭字节 allversioninfo = new string(bytes, 0, count);//转化为字符串 jsonobject jsonobject = new jsonobject(allversioninfo);//将字符串转化为json对象 jsonobject infojsonobject = jsonobject.getjsonobject("image_build_ids");//获取json对象 hardversioninfo = infojsonobject.getstring(key);获取json对象中的具体值 } catch (filenotfoundexception e) { e.printstacktrace(); } catch (ioexception ie) { ie.printstacktrace(); } catch (jsonexception e) { e.printstacktrace(); } finally { try { fis.close(); } catch (ioexception e) { e.printstacktrace(); } } return hardversioninfo; }
2.调用方法显示出来:
string gpsversion = gethardversioninformation("modem");//获取key为modem的数据 string wifiversion = gethardversioninformation("wcnss");//获取key为wcnss的数据 if (!textutils.isempty(gpsversion)) { setstringsummary(key_gps_version, gpsversion);//显示出来 } if (!textutils.isempty(wifiversion)) { setstringsummary(key_wifi_version, wifiversion);//显示出来 setstringsummary(key_bluetooth_version, wifiversion); }
这一顿操作也算是完成了任务。
但是大佬就只说了一句话,这个代码太low了。
针对上面的low代码,有下面几个地方有问题:
1.每次gethardversioninformation()是不是都是io操作,很耗时间呢
2.数据要是大于1kb怎么办?
3.如果 fis = new fileinputstream(hardwareinfopath);//通过字节流获取 这里发生异常,fis将为空,
finally { try { fis.close(); } catch (ioexception e) { e.printstacktrace(); } }
这里面的fis.close()方法将会出现空指针
4.如果这里异常jsonobject jsonobject = new jsonobject(allversioninfo);//将字符串转化为json对象,是不是fis会出现重复关闭呢
针对以上问题,给出正确的打开方式!
3.文件读取的正确方式
1.获取json对象,这样只需要一次操作
private jsonobject getjsonobject() { fileinputstream fis = null; string hardwareinfopath = "/firmware/verinfo/ver_info.txt"; byte[] bytes = new byte[1024]; int count; string allversioninfo = ""; string hardversioninfo = ""; try { fis = new fileinputstream(hardwareinfopath); stringbuilder stringbuilder = new stringbuilder();//stringbuilder效率比buffer高,如果多线程需要用buffer while ((count = fis.read(bytes)) != -1) { stringbuilder.append(new string(bytes, 0, count)); } jsonobject jsonobject = new jsonobject(stringbuilder.tostring()); jsonobject infojsonobject = jsonobject.getjsonobject("image_build_ids"); return infojsonobject;//正常情况下,走到这里就退出,此时finally代码也会执行,但是不会改变返回值。 } catch (filenotfoundexception e) { e.printstacktrace(); } catch (ioexception ie) { ie.printstacktrace(); } catch (jsonexception e) { e.printstacktrace(); } finally { try { if(fis != null) { fis.close();//在finally里面关闭流 } } catch (ioexception e) { e.printstacktrace(); } } }
2.获取
不贴代码!
4.try-catch-finally
1、不管有没有异常,finally中的代码都会执行
2、当try、catch中有return时,finally中的代码依然会继续执行
3、finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的。
4、finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值
上一篇: .Net Core 简单定时任务框架封装
下一篇: C# .NET枚举Enum项获取
推荐阅读
-
Android 读取文件的正确打开方法
-
把U盘文件的隐藏属性去掉打开U盘里文件的方法
-
Android logcat信息记录到手机文件的方法
-
Thinkphp restful 写法,可以使用curl 请求到对应的方法,但是android无法正确请求到指定的方法。
-
PHP读取大文件末尾N行的高效方法推荐,_PHP教程
-
获取资料列表,点击文件名打开文件的方法,哪位有时间帮帮忙
-
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
-
Python实现读取Properties配置文件的方法
-
python中利用h5py模块读取h5文件中的主键方法
-
Python3读取UTF-8文件及统计文件行数的方法