本文接着我的博客文章Java如何读取Excel表中的数据继续谈谈读取Excel表数据在实际开发游戏时的作用。
有些同学可能会问“总不能把Excel文件放在游戏资源包里读取数据吧,那样岂不太浪费空间了?”。这要看大家开发的是什么游戏:
如果是单击PC游戏问题不大,如果是单击手机游戏难免有些浪费空间并且移动平台不管是IOS还是android出于效率问题最好不是在客户端直接读取Excel文件来获取数据。
如果大家开发的是网络版游戏,那么数据表可以直接放入服务器,服务器根据客户端的不同请求读取对应数据表里的数据,当然也可以通过数据库工具将Excel表里的数据导入数据库服务器根据客户端的不同请求对数据库进行查询、修改等操作。
本文谈谈单击游戏利用Excel表数据的方法,主要解决2个问题:
1,将Excel表直接放在客户端,由程序直接读取效率慢
2,将Excel表直接放在客户端,数据对用户是透明的,用户随时可以修改数据而作弊
对以上2个问题,本人的解决办法是:首先将需要的数据从Excel文件读出,然后再将读出的数据写入到二进制文件里。游戏客户端只需读取二进制文件而不是直接读取Excel文件,这样做即解决了资源文件过大问题(毕竟二进制文件只存储了有效数据,相比原始的Excel文件占用空间小了很多),而且解决了以上2个主要问题。用户直接查看二进制文件将以乱码出现。
以下代码片段是解决以上2个问题思路的演示,供大家参考:
package tool.excel.test;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import tool.excel.reader.ExcelReader;
public class WriteToFile {
public static void main(String[] args) throws BiffException, IOException {
// 生成File实例并指向需要读取的Excel表文件
File file = null;
file = new File("E:/Excel读取测试/excel.xls");
Workbook wb = ExcelReader.getWorkBook(file);
// 读取Excel表里的2-4行和1-5列区间的3*4数据
String[][] area_data = ExcelReader.readExcelAreaData(wb, 0, 2, 4, 1,5);
// 建立输出流并连接到文件Test.bin
FileOutputStream fos = new FileOutputStream("Test.bin");
DataOutputStream dos = new DataOutputStream(fos);//包装Data流以便可以写入Java的所有基本类型数据
/** 将读出的字符串数据转为整数并写入文件Test.bin*/
dos.writeInt(area_data.length);//写入行数
dos.writeInt(area_data[0].length);//写入列数
//写入真实数据
for (int i = 0; i < area_data.length; i++) {
for(int j = 0; j < area_data[i].length; j++){
int data = Integer.parseInt(area_data[i][j]);
dos.writeInt(data);
}
}
dos.close();//关闭流,如果E盘下没有Test.bin文件,程序将自动生成此文件
/**程序到这已经实现了读取Excel文件中的数据并写入到二进制文件Test.bin中的功能。
* Test.bin将作为游戏客户端的资源文件供客户端使用
* 以下演示下Java客户端读取Test.bin文件的功能,Test.bin请放在当前类的同级路径下测试
* 不同客户端请留意文件名称和路径的写法
*/
//建立输入流连接Test.bin文件
InputStream is = "".getClass().getResourceAsStream("/Test.bin");
DataInputStream dis = new DataInputStream(is);
//读取数据放入二维数组并打印输出测试
int row = dis.readInt();//读取行数(和上面写入顺序相同)
int col = dis.readInt();//读取列数(和上面写入顺序相同)
//根据读出的行数,列数生成对应的二维数组
int[][] data = new int[row][col];
//为data填充数据
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
data[i][j] = dis.readInt();
System.out.print(data[i][j]+",");//测试输出
}
System.out.println();
}
dis.close();
}
}
如果大家还有什么疑问请给我留言,一定尽力回答!