使用BinCompiler将资源文件打包成二进制文件

 

转载 http://yarin.iteye.com/blog/546923#
文章分类:移动开发 关键字: bincompiler、bin文件、资源打包、j2me

版权申明:http://yarin.iteye.com/blog/453262  

 

在开发游戏时,总是要使用很多的资源文件,比如:图片、音乐等。而我们经常会遇到一些商业游戏中都看不到这些资源文件,那是因为商业游戏,一般都会将这些资源文件打包成二进制的文件,然后在程序中读取,并使用。这样的游戏看上去更显得专业一些,本文我们就来学习一个最简单的将资源文件打包成二进制文件的方法——使用BinCompiler将资源文件打包成二进制文件。

 

所需工具:BinCompiler(见附件)

 

运行“BinCompiler.exe”,指定要打包的资源文件的路径,和输出二进制文件的路径,如下图所示。


点击create按钮,即在我们制定的位置产生一个bin文件,当然在这个bin文件所在目录还会产生一个index.txt文件。我们在程序中读取这些资源时,需要使用这个index.txt。index.txt文件如下所示:

Java代码 复制代码
  1. FName   Index   Pos Size   
  2. A_04.png     0     0     4141   
  3. A_03.png     1     4145      3802   
  4. A_02.png     2     7951      3813   
  5. A_01.png     3     11768     3959   
FName	Index	Pos	Size
A_04.png	0	0	4141
A_03.png	1	4145	3802
A_02.png	2	7951	3813
A_01.png	3	11768	3959

接下来我们可以使用BinReader.java文件中的两个方法来读取这些资源文件了。

代码清单:BinReader.java

Java代码 复制代码
  1. /*******************************************************************************  
  2.  * Reads a file from the BIN file and return data as a byte buffer  
  3.  *******************************************************************************/   
  4. public   byte [] readFile(String binfile,  int  pos)   
  5. {   
  6.      byte  buffer[];   
  7.      int  len;   
  8.   
  9.      try  {   
  10.   
  11.         InputStream is = Class.getClass().getResourceAsStream( "/"  + binfile);   
  12.   
  13.         is.skip(pos);   
  14.   
  15.         len  = (is.read() &  0xFF ) <<  24 ;   
  16.         len  |= (is.read()  0xFF ) <<  16 ;   
  17.         len  |= (is.read() &  0xFF ) <<  8 ;   
  18.         len  |= (is.read() &  0xFF );   
  19.   
  20.         buffer =  new   byte [len];   
  21.        
  22.         is.read(buffer,  0 , buffer.length);   
  23.   
  24.         is.close();   
  25.         is =  null ;   
  26.        
  27.         System.gc();   
  28.     }  catch  (Exception e) {   
  29.         buffer =  null ;   
  30.         e.printStackTrace();   
  31.         System.gc();   
  32.          return   null ;   
  33.     }   
  34.   
  35.      return  buffer;   
  36. }   
  37.   
  38. /*******************************************************************************  
  39.  * Reads a file from the BIN file and return data as an Image  
  40.  *******************************************************************************/   
  41. public  Image readImage(String binfile,  long  pos)   
  42. {   
  43.      byte  buffer[];   
  44.      long  len;   
  45.   
  46.      try  {   
  47.         InputStream is = Class.getClass().getResourceAsStream( "/"  + binfile);   
  48.            
  49.         is.skip(pos);   
  50.            
  51.         len  = (is.read() &  0xFF ) <<  24 ;   
  52.         len  |= (is.read()  0xFF ) <<  16 ;   
  53.         len  |= (is.read() &  0xFF ) <<  8 ;   
  54.         len  |= (is.read() &  0xFF );   
  55.   
  56.         buffer =  new   byte [len];   
  57.        
  58.         is.read(buffer,  0 , buffer.length);   
  59.   
  60.         is.close();   
  61.         is =  null ;   
  62.        
  63.         System.gc();   
  64.     }  catch  (Exception e) {   
  65.         buffer =  null ;   
  66.         e.printStackTrace();   
  67.         System.gc();   
  68.          return   null ;   
  69.     }   
  70.   
  71.      return  Image.createImage(buffer,  0 , buffer.length);   
  72. }  
/*******************************************************************************
 * Reads a file from the BIN file and return data as a byte buffer
 *******************************************************************************/
public byte[] readFile(String binfile, int pos)
{
	byte buffer[];
	int len;

	try {

		InputStream is = Class.getClass().getResourceAsStream("/" + binfile);

		is.skip(pos);

		len  = (is.read() & 0xFF) << 24;
		len  |= (is.read() 0xFF) << 16;
		len  |= (is.read() & 0xFF) << 8;
		len  |= (is.read() & 0xFF);

		buffer = new byte[len];
	
		is.read(buffer, 0, buffer.length);

		is.close();
		is = null;
	
		System.gc();
	} catch (Exception e) {
		buffer = null;
		e.printStackTrace();
		System.gc();
		return null;
	}

	return buffer;
}

/*******************************************************************************
 * Reads a file from the BIN file and return data as an Image
 *******************************************************************************/
public Image readImage(String binfile, long pos)
{
	byte buffer[];
	long len;

	try {
		InputStream is = Class.getClass().getResourceAsStream("/" + binfile);
		
		is.skip(pos);
		
		len  = (is.read() & 0xFF) << 24;
		len  |= (is.read() 0xFF) << 16;
		len  |= (is.read() & 0xFF) << 8;
		len  |= (is.read() & 0xFF);

		buffer = new byte[len];
	
		is.read(buffer, 0, buffer.length);

		is.close();
		is = null;
	
		System.gc();
	} catch (Exception e) {
		buffer = null;
		e.printStackTrace();
		System.gc();
		return null;
	}

	return Image.createImage(buffer, 0, buffer.length);
}

可以看出,这两个方法都只需要传入bin文件名和图片对应的pos,pos值就在我们上面所说的index.txt文件中去找对应的就可以了。 

例如我们读取一个图片

Java代码 复制代码
  1. Image image = readimage( "images.bin"0 );  
Image image = readimage("images.bin", 0);

可以看出,我们传入的pos的值是0,对应index.txt中就应该是A_04.png。 

很简单,可以直接使用就是了。谢谢大家支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值