目录
上次任务已经使用Hex Editor Neo工具成功修改游戏存档,具体实现探索和步骤请参考:修改植物大战僵尸游戏存档——跳关并快速实现财富自由,本次任务目的将使用java代码替换工具,实现同样的修改功能。
一、实现思路
- 读取数据:修改的user1.dat文件的本地路径已知,使用IO流知识读取数据并存放在程序中。
- 修改数据:利用控制台输入,获取用户修改意向,并根据任务的不同采取不同的修改策略。
- 写入数据:将修改后的数据重新写入到原文件中。
二、实现过程
1. 创建Java类
按图示创建Java工程。
之后在创建好的Java工程src目录下创建Java类。
输入类名称就可以进行敲代码啦。如下图,定义两个全局变量,分别是可变数组userIndex,用来存放.dat文件下读取出来的数据、.dat所在的本地路径。并设为static类型,可以不用创建类对象就能使用。
2. 实现读取数据方法
有两种读取文件方式,读取文本形式使用Reader,读取二进制数据使用InputStream。FileInputStream是InputStream的一个子类。顾名思义,FileInputStream就是从文件流中读取数据。BufferedInputStream继承于FilterInputStream,提供缓冲输入流功能。缓冲输入流相对于普通输入流的优势是,它提供了一个缓冲数组,每次调用read方法的时候,它首先尝试从缓冲区里读取数据,若读取失败(缓冲区无可读数据),则选择从物理数据源(譬如文件)读取新数据(这里会尝试尽可能读取多的字节)放入到缓冲区中,最后再将缓冲区中的内容部分或全部返回给用户。由于从缓冲区里读取数据远比直接从物理数据源读取速度快。代码如下:
// 从二进制文件中读取数据(读取到的数据从十六进制数据自动转成十进制)
public static void readData(){
try
{
FileInputStream fis= new FileInputStream(fileName);
BufferedInputStream br = new BufferedInputStream(fis);
int record = -1;
while((record = br.read()) != -1)
{
userIndex.add(record); //将读到的数据添加到可变数组中(全局变量)
}
System.out.println("从文档中读取第一行数据显示(十进制):");
for(int i=0; i<16; i++){
System.out.print(userIndex.get(i) + " ");
}
System.out.println();
}
catch(Exception e)
{
System.out.print(e.toString());
}
}
3. 实现修改数据方法
修改数据思路是:主方法中先用Scanner获取用户输入的任务类型,将用户输入数据以参数方式传给changeData方法,在方法内部判断,根据类型采取不同的修改方式。具体措施如下: