`
jiuyuehe
  • 浏览: 181354 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java 根据特定数据结构 打自定义包

阅读更多
  组长分配了一个任务,按照特定的数据结果打一个 xxx.pkg的包,然后解压出来后不变~
刚刚开始觉得蛮难的,感觉无从下手,认真分析了20分钟,有思路了!
  首先看特定的数据格式
  
	public static void message(){
//		String  package_header_signature = "hello";

//		int  file_num=8;
//		
//		for(int i=0;i<8;i++){
//			int file_path_length="";
                        int file_size ="";
//			String file_path="";
			
//		}
//	只列了简单几个,原因都懂的!	

//		}
   

大概就是这样子,其实信息再多思路一样也没问题!下面是打包的方法!!
思路是将所有的信息全部转化为二进制存储!

public static void test(String src,String target) throws Exception{
		File file =new File(src);
		//String target = "g://test.pkg";
		File targetFile = new File(target);
		if(!targetFile.exists()){
			targetFile.createNewFile();
		}
		OutputStream os = new FileOutputStream(targetFile);
		
		//write some message
		String  package_header_signature = "hello";
		
		addByte(package_header_signature.getBytes(), os, 4);
		//文件个数
		int filesum=0;
		//文件路径
		List<String> strList = new ArrayList<String>();
		filesum =listFlieSum(file,strList);
		
		//加入文件个数
		addByte(intToByte(filesum,1),os, 1);
		
		for(int i=0;i<strList.size();i++){
			File fileInfo = new File(strList.get(i));
			String file_path = fileInfo.getAbsolutePath();
			int file_path_length = file_path.length();
			int file_size = getFileSize(fileInfo);
			//加入文件路径长度
			addByte(intToByte(file_path_length,1), os, 1);//文件路径的长度
			//加入文件大小
			addByte(intToByte(file_size,4), os, 4);//文件大小
			//加入文件路径
			addByte(file_path.getBytes(), os, file_path.length());//文件路径
		}
		listFile(file,os);
		
		String crc32 = getFileCRCCode(targetFile);
		byte[] crcbyte = crc32.getBytes();
		
		os.close();
		
		
	}


经常碰到的问题就是:bit byte byte[] int 之间的转化!
这里谢谢javaeye的一个网友。

/**
	 * int to byte[] 支持 1或者 4 个字节
	 * @param i
	 * @param len
	 * @return
	 */
	 public static byte[] intToByte(int i,int len) {
	        byte[] abyte=null;
	        if(len==1){
	        	abyte = new byte[len];
	        	abyte[0] = (byte) (0xff & i);
	        }else{
	        	abyte = new byte[len];
	        	abyte[0] = (byte) (0xff & i);
	        	abyte[1] = (byte) ((0xff00 & i) >> 8);
		        abyte[2] = (byte) ((0xff0000 & i) >> 16);
		        abyte[3] = (byte) ((0xff000000 & i) >> 24);
	        }
	        return abyte;
	    }
	   public  static int bytesToInt(byte[] bytes) {
		   int addr=0;
		   if(bytes.length==1){
	        addr = bytes[0] & 0xFF;
		   }else{
			   addr = bytes[0] & 0xFF;
			   addr |= ((bytes[1] << 8) & 0xFF00);
			   addr |= ((bytes[2] << 16) & 0xFF0000);
			   addr |= ((bytes[3] << 24) & 0xFF000000);
		   }
		   return addr;
	    }


/**
	 * 读取byte []
	 * @param b
	 * @param target
	 * @throws Exception
	 */
	public static void addByte(byte[] b,OutputStream os, int len) throws Exception{
		//	File targetpkg  = new File(target);
			byte[] by = new byte[len];
			if (b.length > len) {
				os.write(b, 0, len);
			} else {
				int l = len - (b.length-1);
				
				while (--l > 0) {
					os.write(0);
				}
				os.write(b, 0, b.length);
			}
		}


ok! 打包基本基本没问题了,解包才是关键。请看下一篇!
1
0
分享到:
评论

相关推荐

    java开源包8

    使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的...

    java开源包4

    使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的...

    java开源包6

    使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的...

    java开源包11

    使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的...

    java开源包9

    使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的...

    java开源包101

    使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的...

    java开源包5

    使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的...

    java开源包10

    使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的...

    java开源包1

    使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的...

    java开源包3

    使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的...

    JAVA上百实例源码以及开源项目源代码

    Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来...

    src.zip Java的注解讲解案例代码( 元注解、自定义注解、常用内置注解等)

    Java注解的目标是为了提供一种声明性的方式来描述和配置程序行为、结构和属性的元数据。它可以帮助开发者更好地理解和维护代码,并提供灵活性和可读性。注解为开发者提供了与其他工具和框架集成的机制,使他们能够更...

    JAVA上百实例源码以及开源项目

    Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP  Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件...

    报表自定义工具(自定义查询部分)

    主要特性:1)采用B/S结构(也给出了C/S结构的接口)支持多种浏览器:IE、FIRFOX。2)excel做报表设计器。3)可以支持多种数据库:ORACLE、MS SQL SERVER、SYBASE、MYSQL、DB2。4)支持多种平台:Linux、Unix、Windows。...

    java开源包2

    使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的...

    java开源包7

    使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的...

    Java资源包01

    使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的...

    java集合资料整理

    关于java集合资料的整理 集合接口:6个接口,表示不同集合类型,是集合框架的基础。 抽象类:5个抽象类,对集合接口的部分实现。可扩展为自定义集合类。...因此,允许您更改基本的数据结构而不必改变其它代码。

    word源码java-officeexport-java:三行代码导出自定义样式word

    提供数据处理的插件,通过添加处理器可定制任意输出值,例如:特定项的日期、数字等文本格式转换 图片保留样式的输出。 现有实现方案的对比 方案 跨平台 易用性 Freemarker 跨平台 需要掌握freemarker的语法,配置...

Global site tag (gtag.js) - Google Analytics