最近做一个项目需要把文件打包压缩成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就不用想用这个了,以后不知道支持不。