代码如何判断一个二进制文件(压缩jar包)

    最近做一个项目需要把文件打包压缩成java的jar包,由于jar是采用zip兼容的算法进行压缩的,在jar包可以不带文件清单的情况下可以采用zip的方式进行压缩,这样就可以采用大家熟悉的SharpZipLib开源项目处理了(另人不解的是开源项目自带的zip压缩sample却有问题,编译后运行文件越压越大,而且解压就会有问题)。

   由于打包文件是提供给unix下使用的,至于目录间隔符可以采用项目以提供的相应方法直接替换(unix和windows的文件分隔符方向不一样,但windows兼容unix)由于文本文件行结束标识有差别,如果不去掉windows下多的那个回车符(回车还是换行不记的了)的话在unix下默认使用vi读取会在每行的结尾处存在^M样的乱字符,所以在打包之前必须对需要打包的文件进行判断,如果是非二进制文件的话,需要把每行的结束符进行替换,去掉多余的那个回车符。

   由于SharpZipLib项目中zip部分没有对二进制文件进行判断的方法,那么我们可以接见SharpZipLib中tar部分的相关方法进行(很奇怪为什么同一项目居然zip没有):

     
  // TODO: TarArchive - Is there a better way to test for a text file?
  // It no longer reads entire files into memory but is still a weak test!
  // This assumes that byte values 0-7, 14-31 or 255 are binary
  // and that all non text files contain one of these values
  static bool IsBinary(string filename)
  {
   using (FileStream fs = File.OpenRead(filename))
   {
    int sampleSize = System.Math.Min(4096, (int)fs.Length);
    byte[] content = new byte[sampleSize];
   
    int bytesRead = fs.Read(content, 0, sampleSize);
   
    for (int i = 0; i < bytesRead; ++i) {
     byte b = content[i];
     if ( (b < 8) || ((b > 13) && (b < 32)) || (b == 255) ) {
      return true;
     }
    }
   }
   return false;
  } 

 

呵呵,可能眼力好的朋友已经看见了,该判断还是存在问题,不过对于一般的情况肯定适用啦。

4m也不是小啦 ^_^

ps:如果有需要从自己项目解压unix平台下的.Z文件的话,可以研究一下7Z这个项目,它提供了一个动态库,但偶始终没有找到文档,最后无奈下直接调用项目提供的7za.exe命令行工具进行解压的了。压缩.Z就不用想用这个了,以后不知道支持不。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值