Java和.NET的GZIP压缩功能对比

简介:

本文主要比较了Java和.NET提供的GZIP压缩功能。

介绍

在本文中,我们将讨论Java和.NET提供的GZIP压缩功能,并且用实例来说明哪个压缩方法更佳。

在Java中,我们有提供GZIP压缩的GZIPOutputStream类,这个类在Java.util.zip包中。而在.NET中,我们有执行GZIP压缩的GZipStream类,这个类在System.IO.Compression命名空间下。

我这里所说的更好方法针对的是小尺寸文件,因为我已经检验过小文件的效果,比如说当我们想在发送之前压缩我们的信息文件。

代码解析

1)Java GZIPOutputStream类

该GZIPOutputStream类为压缩数据在GZIP格式文件中创建了输入流。这个类有以下几种的构造函数:

1.创建具有默认大小的输出流:

GZIPOutputStream(OutputStream out);

2.创建新的具有默认缓冲区大小和指定刷新模式的输出流:

GZIPOutputStream(OutputStream out,boolean syncFlush);

3.创建新的具有指定缓冲区大小的输出流:

GZIPOutputStream(OutputStream out,int size);

4.创建新的具有指定的缓冲区大小和刷新模式的输出流:

GZIPOutputStream(OutputStream out,int size,boolean syncFlush);

我们需要编写以下代码来压缩文件:


 
 
  1. import java.io.*; 
  2. import java.util.zip.*; 
  3.  
  4. class abc{ 
  5.  
  6. public static void main(String args[]) 
  7.   { 
  8.    String srcfile="D:/abhi.txt"
  9.          String dstfile="D:/abhi1.txt"
  10.  
  11.   try
  12.  
  13.    FileInputStream fin= new FileInputStream(srcfile); 
  14.        GZIPOutputStream fout=new GZIPOutputStream(new FileOutputStream(dstfile)); 
  15.  
  16.              byte[] buffer = new byte[1024]; 
  17.              int bytesRead; 
  18.  
  19.              while ((bytesRead = fin.read(buffer)) != -1//srcfile.getBytes() 
  20.              { 
  21.                fout.write(buffer, 0, bytesRead); 
  22.              } 
  23.  
  24.                fin.close(); 
  25.                   fout.close(); 
  26.  
  27.                      File file =new File(srcfile); 
  28.                    System.out.println("Before Compression file Size : 
  29.                     " + file.length()+" Bytes"); 
  30.                      File file1 =new File(dstfile); 
  31.                      System.out.println("After Compression file Size : 
  32.                       " + file1.length()+" Bytes"); 
  33.  
  34.   }catch(Exception ex) 
  35.     { 
  36.   System.out.println(ex); 
  37.     } 
  38.    } 
  39.  

运行代码。输出如下,因为我提供的源文件只有481个字节大小,然后经过压缩后输出的文件大小为207个字节。

现在,我们用相同的输入文件来看看GZIP压缩后的效果。

2).NET GZipStream类

GZipStream压缩string或文件。它可以让你有效地保存数据,如压缩日志文件,消息文件。这个类存在于System.IO.Compression的命名空间。它创建GZIP文件,并将其写入磁盘。

GZipStream类提供以下构造函数:

1.通过使用指定字节流和压缩等级初始化GZipStream类的新实例:

GZipStream(Stream, CompressionLevel)

2.通过使用指定流和压缩模式初始化GZipStream类的新实例:

GZipStream(Stream, CompressionMode)

3.通过使用指定流和压缩等级初始化GZipStream类的新实例,并可选是否打开流:

GZipStream(Stream, CompressionLevel, Boolean)

4.通过使用指定流和压缩模式初始化GZipStream类的新实例,并可选是否打开流:

GZipStream(Stream, CompressionMode, Boolean)

我们需要编写以下代码来压缩文件:


 
 
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5. using System.IO; 
  6. using System.IO.Compression; 
  7.  
  8. namespace Compress 
  9.     class Program 
  10.     { 
  11.         static void Main(string[] args) 
  12.         { 
  13.             string srcfile = "D:\\abhi.txt"
  14.             string dstfile = "D:\\abhi2.txt"
  15.  
  16.             byte[] b; 
  17.  
  18.             using (FileStream f = new FileStream(srcfile, FileMode.Open)) 
  19.             { 
  20.                 b = new byte[f.Length]; 
  21.                 f.Read(b, 0, (int)f.Length); 
  22.             } 
  23.  
  24.             using (FileStream fs = new FileStream(dstfile, FileMode.Create)) 
  25.  
  26.             using (GZipStream gzip = new GZipStream(fs, CompressionMode.Compress, false)) 
  27.             { 
  28.                 gzip.Write(b, 0, b.Length); 
  29.             } 
  30.  
  31.             FileInfo f2 = new FileInfo(srcfile); 
  32.             System.Console.WriteLine("Size Of File Before Compression :"+f2.Length); 
  33.  
  34.             FileInfo f1 = new FileInfo(dstfile); 
  35.             System.Console.WriteLine("Size Of File Before Compression :" + f1.Length); 
  36.         } 

运行代码。输出如下,由于我提供的是481字节大小的源文件,然后压缩后的输出文件大小为353个字节。

大家可以看到,源文件为481字节,压缩文件大小为:

  1. .NET的GzipStream:353字节

  2. Java的GZIPOutputStream :207字节

压缩后的尺寸大小差距很明显。因此,我们可以得出结论,Java的GZIP压缩比.NET更好。

兴趣点

我是在使用IKVM.NET研究Java和.NET之间的互操作性时发现的。我认为这很有意思,所以分享给大家。


作者:王国峰

来源:51CTO

相关文章
|
8天前
|
存储 小程序 前端开发
微信小程序与Java后端实现微信授权登录功能
微信小程序极大地简化了登录注册流程。对于用户而言,仅仅需要点击授权按钮,便能够完成登录操作,无需经历繁琐的注册步骤以及输入账号密码等一系列复杂操作,这种便捷的登录方式极大地提升了用户的使用体验
94 12
|
2月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
115 34
|
2月前
|
Linux API C#
基于 .NET 开发的多功能流媒体管理控制平台
基于 .NET 开发的多功能流媒体管理控制平台
52 9
|
2月前
|
XML C# 数据格式
一个.NET开源、免费、功能强大的 PDF 处理工具
一个.NET开源、免费、功能强大的 PDF 处理工具
|
2月前
|
网络协议 C#
3款.NET开源、功能强大的通讯调试工具,效率提升利器!
3款.NET开源、功能强大的通讯调试工具,效率提升利器!
57 10
|
2月前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
|
3月前
|
安全 Java 测试技术
🎉Java零基础:全面解析枚举的强大功能
【10月更文挑战第19天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
142 60
|
3月前
|
消息中间件 监控 数据可视化
基于.NET开源、功能强大且灵活的工作流引擎框架
基于.NET开源、功能强大且灵活的工作流引擎框架
|
3月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
59 2
|
3月前
|
Java 网络安全 Maven
Exception in thread "main" java.lang.NoSuchMethodError: okhttp3.OkHttpClient$Builder.sslSocketFactory(Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/X509TrustManager;)Lokhttp3/OkHttpClient$Builder; 问题处理
【10月更文挑战第26天】Exception in thread "main" java.lang.NoSuchMethodError: okhttp3.OkHttpClient$Builder.sslSocketFactory(Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/X509TrustManager;)Lokhttp3/OkHttpClient$Builder; 问题处理
84 2

热门文章

最新文章