java IO
分类
-
字节流:数据流中最小的数据单元是字节 (InputStream,OutputStream)
-
字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节。 (Reader,Writer)
**文件:**File; RandomAccessFile
字符流和字节流的转换: InputStreamReader和 OutputStreamWriter 门面设计模式,内部使用 StreamEncoder 来实现。
FileWriter:可以简化使用
BufferedWriter bufferedWriter = new BufferedWriter(
//new FileWriter("src/testtxt/writerAndStream.txt"));
new OutputStreamWriter(
new FileOutputStream(
new File("src/testtxt/writerAndStream.txt")),"GBK"));
RandomAccessFile
**构造方法:**RandomAccessFile raf = newRandomAccessFile(File file, String mode); 其中参数 mode 的值可选 " r " :可读, " w " :可写, " rw " :可读性;
成员方法: seek(int index);可以将指针移动到某个位置开始读写; setLength(long len);给写入文件预留空间:
**可以读写:**RandomAccessFile不属于InputStream和OutputStream类系的它是一个完全独立的类,所有方 法(绝大多数都只属于它自己)都是自己从头开始规定的,这里面包含读写两种操作
可以一次读取整个文件到内存;
装饰器模式:
应用:1.Java IO;2. Android context
**Component:**抽象构建接口
**ConcreteComponent:**具体的构建对象,实现组件对象接口,通常就是被装饰的原始对象。就对这个对象添加功能。
**Decorator:**所有装饰器的抽象父类,需要定义 一个与组件接口一致的接口,内部持有一个 Component对象,就是持有一个被装饰的对象。
**ConreteDecoratorA/ConreteDecoratorB:**实际 的装饰器对象,实现具体添加功能。熟悉UML图 的基本就明白了,但是像我这样不熟悉的还是 写一点我们熟悉的代码描述吧。
字节流中/字符流
**Component:**OutputStream
**ConcreteComponent:**FileOutputStream,ObjectOutputStream,ByteArrayOutputStream,PipelOutputStream
**Decorator:**FilterOutputStream
**ConreteDecoratorA/ConreteDecoratorB:**BufferOutputStream,DataOutputStream
NIO
FileChannel配合着ByteBuffer,将读写的数据缓存到内存中,然后以批量/缓 存的方式read/write,省去了非批量操作时的重复中间操作,操纵大文件时可 以显著提高效率
apk加固
反编译
apk文件解压,找到dex文件;使用dex2jar工具,生成jar文件;使用jd_gui工具,查看class文件;
解压apk后的结构:多个classes.dex文件,Meta-Inf签名相关的文件夹
加固手段:
**反模拟器:**模拟器运行apk,可 以用模拟器监控到 apk的各种行为,所 以在实际的加固apk 运行中,一旦发现 模拟器在运行该APK, 就停止核心代码的 运行。
代码虚拟化: 代码虚拟化在桌面平台 应用保护中已经是非常 的常见了,主要的思路 是自建一个虚拟执行引 擎,然后把原生的可执 行代码转换成自定义的 指令进行虚拟执行。
加密: 样本的部分可执行代码 是以压缩或者加密的形 式存在的,比如,被保护过的代码被切割成多个小段,前面的一段代码先把后面的代码片段在内存中解密,然后再 去执行解密之后的代码, 如此一块块的迭代执行。
dex文件格式:文件头:checksum;siganature;file_size;索引区:数据区:类的定义;数据区;链接数据区
签名工具:jarSigenr;签名要执行命令
String cmd[] = {"cmd.exe", "/C ","jarsigner", "-sigalg", "MD5withRSA",
"-digestalg", "SHA1",
"-keystore", "C:/Users/allen/.android/debug.keystore",
"-storepass", "android",
"-keypass", "android",
"-signedjar", signedApk.getAbsolutePath(),
unsignedApk.getAbsolutePath(),
"androiddebugkey"};
Process process = Runtime.getRuntime().exec(cmd);
System.out.println("start sign");
try {
int waitResult = process.waitFor()
System.out.println("waitResult: " + waitResult);
} catch (InterruptedException e) {
e.printStackTrace();
throw e;
}
文件zip 操作(解压,压缩)