IO体系
装饰模式
文件IO中,一层套一层的读写用的叫装饰模式。
装饰模式就像穿衣服一样,一层套一层。有一个底层抽象(人),然后可以有单独的实现(穿睡衣,不必穿其他的),也可以有抽象父类+无限的装饰实现(穿内衣,长袖,毛衣,棉袄)
Context就是装饰模式
流式部分
字节流与字符流的对应关系
一个字符=2个字节。
英文占一个字节,中文和标点,符号等占两个字节。如果全是用英文存写的,那就用字节流就行,但是如果里面有中文,那么用字节流读取出来就全是乱码了。没有意义了。所以字节流,字符流本质区别就是读写的方式规则不同
字节流与字符流的对应关系图
字节流
对应关系表
以什么样的方式写的,就要用什么方式读。顺序也要一样,要不然底层全是01,本来前8个01代表的意义是int但是读成boolean显然就乱了。
outPut(输出)代码
inPut(输入)代码
读写完事一定要in.close() 把流关上
BufferedInputStream---用缓存读数据,如果不用缓存直接用FileInputStream也能完成任务,但是FileInputStream是一个字符一个字符的读,会频繁的磁盘IO,非常慢,耗性能!!!但是BufferedInputStream是一块一块这样读,速度快
字符流
对应关系表
outWriter
new FileWriter(PATH) == new OutputStreamWriter( new FileOutputStream( new File(PATH)), "GBK")
只不过FileWriter内部将文件自动转换成File-->FileOutputStream流-->OutputStreamWriter
编码格式用默认的,但是需要自定义编码格式的话,就得写完整的
inReader
File
Java文件类以抽象的方式代表文件名和目录路径名。 该类主要用于文件和目录的创建、文件的查找和文件的删除等。
File对象代表磁盘中实际存在的文件和目录
RandomAccessFile
随机读写文件,RandomAccessFile区别于File类的地方在于,RandomAccessFile可以定义文件的长度,指针的位置(从第100个字符后开始写)seek()定义指针位置
因为可以自定义指针从哪个位置读写,所以可以断点续传!!!(1线程从0-100读取,2线程100-200读取)
(File只能从头开始读写)
NIO——FileChannel
Channel(翻译 渠道,管道)。读大文件的时候用FileChannel能显著的提高读写速度。(几十倍)
FileInputStream == 一壶一壶的搬油。
BufferedInputStream == 一卡车一卡车的搬油。
FileChannel == 输油管道运。
实战 - dex文件加密(apk加固)
apk加固
反编译
apk解压以后的文件,其中.dex文件是Android系统的可执行文件,包含应用程序的全部操作指令以及运行时数据。
反编译流程:1.解压apk 2.将.dex文件转成.jar(有工具) 3.用jd-gui工具看.jar文件
具体操作
blog.csdn.net/qq_34801506…
加固方案
常见的加固方案有三种:1.反模拟器,遇到模拟器不执行核心代码。2.代码虚拟化,代码虚拟化在桌面平台 应用保护中已经是非常的常见了,主要的思路是自建一个虚拟执行引擎,然后把原生的可执行代码转换成自定义的指令进行虚拟执行。3.加密,现在app主要的加固方案,给代码加密
加固的思路
1.解压自己的apk包,提取出.dex文件
2.将.dex文件转成byte[],然后对二进制加密
3.通过新建的.aar提取出.jar,然后转成.dex文件,做一个.dex空壳
4.将加密的.dex和空壳.dex和apk其他文件,重新打包成新的apk
5.将新apk签名
.dex文件的文件结构
APK打包流程 面试题
1.资源文件被aapt解析成R.java + .aidl文件被aidl解析成java文件 + 本来的java文件
2..java被编译器解析成.class文件
3..class+lib被解析成.dex文件
4..dex文件+其他(res等)被打包成没签名apk
5.apk签名
apk加固源码
1.解压自己的apk包,提取出.dex文件
第一步 main.java
解压代码,Zip.java
将.dex文件转成byte[],然后对二进制加密
具体代码
2.处理aar文件,获得壳dex
具体代码
3.打包签名
通过cmd签名