`

[转] lzo本地压缩与解压缩实例

阅读更多
  1. /** 
  2.  * @author HJX 
  3.  * @version 1.0,2013-01-16 
  4.  * @since JDK1.7,Ubuntu-12.04-64bit 
  5.  * 在hadoop环境下运行 
  6.  * 将一个String写入到本地lzo文件中(不是hadoop的hdfs上) 
  7.  * 再从该lzo文件中读取出来并与原String进行校对 
  8.  */  
  9.   
  10. import java.io.BufferedReader;  
  11. import java.io.FileInputStream;  
  12. import java.io.FileNotFoundException;  
  13. import java.io.FileOutputStream;  
  14. import java.io.IOException;  
  15. import java.io.InputStream;  
  16. import java.io.InputStreamReader;  
  17. import java.io.OutputStream;  
  18. import java.util.ArrayList;  
  19. import java.util.List;  
  20.   
  21. import org.apache.hadoop.conf.Configuration;  
  22.   
  23. import com.hadoop.compression.lzo.LzopCodec;  
  24.   
  25. public class LzoCompress {  
  26.   
  27.     /** 
  28.      * @param args 
  29.      */  
  30.     public static void main(String[] args) {  
  31.         //生成数据  
  32.         String dataSource = "abcdefghijklmnopqrstuvwxyz0123456789~!%#^@*#*%$(\n";  
  33.         dataSource = dataSource.concat(dataSource);  
  34.         dataSource = dataSource.concat(dataSource);  
  35.         dataSource = dataSource.concat(dataSource);  
  36. /*        System.out.println("dataSource = " + dataSource);*/  
  37.         String lzoFilePath = "/home/hadoop/LzoCompressTest.lzo";  
  38.           
  39.         //写入到lzo文件,即lzo压缩  
  40.         write2LzoFile(lzoFilePath, getDefaultConf(),dataSource.getBytes());  
  41.         StringBuilder sb = new StringBuilder();  
  42.           
  43.         //读取lzo文件,即lzo解压缩  
  44.         List<String> lines = readLzoFile(lzoFilePath, getDefaultConf());  
  45.         for(String line : lines) {  
  46.             sb.append(line);  
  47.             //LINUX/UNIX 下添加一个换行符  
  48.             sb.append("\n");              
  49. /*            //Windows 下添加一个换行符 
  50.             sb.append("\r\n");*/  
  51.         }  
  52.         if (sb.toString().equals(dataSource)) {  
  53.             System.out.println(sb.toString());  
  54.         } else {  
  55.             System.err.println("Error line : " + sb.toString());  
  56.         }  
  57.     }  
  58.   
  59.     private static Configuration getDefaultConf(){  
  60.         Configuration conf = new Configuration();  
  61.         conf.set("mapred.job.tracker""local");  
  62.         conf.set("fs.default.name""file:///");  
  63.         conf.set("io.compression.codecs""com.hadoop.compression.lzo.LzoCodec");  
  64.         return conf;  
  65.     }  
  66.       
  67.     /** 
  68.      * 写数据到lzo文件,即lzo压缩 
  69.      * @param destLzoFilePath 
  70.      * @param conf 
  71.      * @param datas 
  72.      * @return void 
  73.      */  
  74.     public static void write2LzoFile(String destLzoFilePath,Configuration conf,byte[] datas) {  
  75.         LzopCodec lzo = null;  
  76.         OutputStream out = null;  
  77.           
  78.         try {  
  79. /*          System.setProperty("java.library.path", "/usr/local/hadoop/lib/native/Linux-amd64-64/lib");*/  
  80.             lzo = new LzopCodec();  
  81.             lzo.setConf(conf);  
  82.             out = lzo.createOutputStream(new FileOutputStream(destLzoFilePath));  
  83.             out.write(datas);  
  84.         } catch (FileNotFoundException e) {  
  85.             e.printStackTrace();  
  86.         } catch (IOException e) {  
  87.             e.printStackTrace();  
  88.         } finally {  
  89.             try {  
  90.                 if(out != null) {  
  91.                     out.close();  
  92.                 }  
  93.             } catch (IOException e) {  
  94.                 e.printStackTrace();  
  95.             }  
  96.         }  
  97.     }  
  98.       
  99.     /** 
  100.      * 从lzo文件中读取数据,即lzo解压缩 
  101.      * @param lzoFilePath 
  102.      * @param conf 
  103.      * @return void 
  104.      */  
  105.     public static List<String> readLzoFile(String lzoFilePath,Configuration conf) {  
  106.         LzopCodec lzo = null;  
  107.         InputStream is = null;  
  108.         InputStreamReader isr = null;  
  109.         BufferedReader reader = null;  
  110.         List<String> result = null;  
  111.         String line = null;  
  112.           
  113.         try {  
  114. /*          System.setProperty("java.library.path", "/usr/local/hadoop/lib/native/Linux-amd64-64/lib");*/  
  115.             lzo = new LzopCodec();  
  116.             lzo.setConf(conf);  
  117.             is = lzo.createInputStream(new FileInputStream(lzoFilePath));  
  118.             isr = new InputStreamReader(is);  
  119.             reader = new BufferedReader(isr);  
  120.             result = new ArrayList<String>();  
  121.             while((line = reader.readLine()) != null) {  
  122.                 result.add(line);  
  123.             }  
  124.         } catch (FileNotFoundException e) {  
  125.             e.printStackTrace();  
  126.         } catch (IOException e) {  
  127.             e.printStackTrace();  
  128.         } finally {  
  129.             try {  
  130.                 if (reader != null) {  
  131.                     reader.close();  
  132.                 }  
  133.                 if (isr != null) {  
  134.                     isr.close();  
  135.                 }  
  136.                 if (is != null) {  
  137.                     is.close();  
  138.                 }  
  139.             } catch (IOException e) {  
  140.                 e.printStackTrace();  
  141.             }  
  142.         }  
  143.           
  144.         return result;  
  145.     }  
  146. }  

 

 

 

程序是没有错的,但是一开始运行的时候总会提示无法读取libgplcompression这个库,其实我知道少了哪些库的,分别是
libgplcompression.a
libgplcompression.la
libgplcompression.so
libgplcompression.so.0
libgplcompression.so.0.0.0
可问题是把这些库放在哪里。尝试过把这几个库放在$CLASSPATH下面,但没用。于是查看了错误提示,提示缺少的这个库在 com.hadoop.compression.lzo.GPLNativeCodeLoader这个类里面被引用到,于是看了一下hadoop- lzo-0.45.jar的源文件(当时编译hadoop-lzo-0.45.jar时留下的源文件,在kevinweil-hadoop-lzo- 6bb1b7f/src/java/com/hadoop/compression/lzo/里),GPLNativeCodeLoader.java的 内容是这样的:

 

  1. package com.hadoop.compression.lzo;  
  2.   
  3. import org.apache.commons.logging.Log;  
  4. import org.apache.commons.logging.LogFactory;  
  5.   
  6. public class GPLNativeCodeLoader {  
  7.   
  8.   private static final Log LOG = LogFactory.getLog(GPLNativeCodeLoader.class);  
  9.   private static boolean nativeLibraryLoaded = false;  
  10.   
  11.   static {  
  12.     try {  
  13.       //try to load the lib  
  14.       System.loadLibrary("gplcompression");  
  15.       nativeLibraryLoaded = true;  
  16.       LOG.info("Loaded native gpl library");  
  17.     } catch (Throwable t) {  
  18.       LOG.error("Could not load native gpl library", t);  
  19.       nativeLibraryLoaded = false;  
  20.     }  
  21.   }  
  22.   
  23.   /** 
  24.    * Are the native gpl libraries loaded? 
  25.    * @return true if loaded, otherwise false 
  26.    */  
  27.   public static boolean isNativeCodeLoaded() {  
  28.     return nativeLibraryLoaded;  
  29.   }  
  30.   
  31. }  


这里跟load那个libgplcompression库 有关的语句应该是try语句块里面的那个System.loadLibrary("gplcompression");

 

于是我再查了一下这个loadLibrary的动作到底是怎样的动作。于是在这篇blog里找到了解答:http://blog.csdn.net/forandever/article/details/5983846

 

System.loadLibrary()load的是 java.library.path这一jvm变量所指向的路径中的库。那我只要把那些libgplcompression库 所在的文件夹加入到java.library.path里面不就行了~于是我查找设置java.library.path的方法,

 

方法1:命令行

 

java -Djava.library.path=/path/to/libgplcompression/ ***.class

 

方法2:java语句

 

在程序里加入这么一句,System.setProperty("java.library.path", "/path/to/libgplcompression/");

 

就找了这么2个方法,可是这2个方法都只能临时改变java.library.path的值!

 

除了这2个方法,我找不到别的方法了,累死了,不再找了,索性把libgplcompression这些库给copy到java.library.path指向的文件夹里!

 

copy完后,再次执行,OK了!

 

要获取java.library.path的值,可以用java语句

 

System.out.println(System.getProperty("java.library.path"));

 

我的是

/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
参考资料:

 

 

gpllibcompression库以及hadoop-lzo-0.4.15.jar下载链接

http://pan.baidu.com/s/1mgJQ1tQ

分享到:
评论

相关推荐

    Lzo压缩算法.例子(vs2005)

    3. **接口调用:** LZO库提供了一系列的函数,如`lzo1x_1_compress`用于压缩数据,`lzo1x_decompress`用于解压缩数据。在项目中,你需要调用这些函数并传递适当的参数,例如原始数据缓冲区、目标压缩缓冲区和工作...

    lzo.rar_decompression_lzo_minilzo

    《LZO压缩与解压缩——以minilzo库为例》 在信息技术领域,数据压缩是一项重要的技术,它能够有效地减少存储空间,加快数据传输速度。LZO(Lempel-Ziv-Oberhumer)是一种快速的无损数据压缩算法,而minilzo是LZO的...

    lzo压缩算法 例子

    4. **预处理和后处理**:在某些情况下,LZO压缩前可能需要对数据进行预处理(如去除字节对齐、添加结束标记),解压缩后可能需要进行后处理(如恢复原始字节对齐)。 5. **优化和变体**:虽然基础的LZO算法已经很...

    lzo压缩算法源码

    3. `lzo1y.c` 和 `lzo1y.h`:可能包含LZO1Y压缩算法的实现,这是一种与LZO1X相似但略有不同的压缩方法。 4. `lzodefs.h`:定义了LZO的各种常量、宏和数据结构,是理解LZO实现的关键。 5. `test-lzo.c`:测试程序,...

    STM32移植 MINI LZO2.09压缩算法

    STM32移植MINI LZO 2.09压缩算法是一项在嵌入式系统中实现高效数据压缩的技术。STM32是意法半导体(STMicroelectronics)推出的一种基于ARM Cortex-M内核的微控制器系列,广泛应用在各种嵌入式设计中,而LZO(Lempel...

    无损数据解压缩LZO Decompression IP

    LZOAccel-D是一款专为无损数据解压缩设计的FPGA硬件实现方案,它基于LZO 2.10标准,能够高效地处理压缩数据块,并生成解压缩后的数据流。该核心具有强大的错误检测与恢复能力,能够在遇到压缩数据中的错误时仍保持...

    LZO数据压缩算法库

    LZO是致力于解压速度的一种数据压缩算法,LZO是Lempel-Ziv-Oberhumer的缩写。这个算法是无损算法,参考实现程序是线程安全的。 LZO库实现了许多有下述特点的算法: • 解压简单,速度非常快。 • 解压不需要内存。 ...

    Lzo压缩安装包

    Lzo压缩技术是一种高效的数据压缩算法,主要应用于大数据处理和存储场景。它的全称为"Lossless Data Compression...在大数据领域,Lzo及其相关工具是不可或缺的组成部分,尤其是在需要平衡压缩效率与压缩比的场景下。

    22、MapReduce使用Gzip压缩、Snappy压缩和Lzo压缩算法写文件和读取相应的文件

    Lzo压缩速度快,但解压缩速度较慢,通常在需要快速写入数据而不太关心读取性能的场景下使用。 压缩算法的选择取决于具体的应用需求,如压缩效率、解压速度以及对压缩比的需求。在实际应用中,可能还需要考虑其他...

    lzo2.0.9压缩工具

     (5)、允许在压缩部分以损失压缩速度为代价提高压缩率,解压速度不会降低。  (6)、包括生成预先压缩数据的压缩级别,这样可以得到相当有竞争力的压缩比。  (7)、另外还有一个只需要8 kB内存的压缩级别。  ...

    LZO 压缩算法 纯pascal 语言

    7. **API 设计**:一个完整的LZO库通常会提供一系列函数,如初始化、压缩、解压缩和清理等。在Pascal实现中,这些函数的接口设计和错误处理机制是关键,应确保易于使用且健壮。 8. **性能测试**:描述中提到“压缩...

    图形图像压缩资料(LZO+LZSS+LZW)

    本文将深入探讨三种常见的无损压缩算法:LZO(Lempel-Ziv-Oberhumer)、LZSS(Lempel-Ziv-Storer-Szymanski)以及LZW(Lempel-Ziv-Welch)。这些算法广泛应用于图像、文本和其他数据类型的压缩,以减少存储需求和...

    lzo压缩算法

    lzo压缩算法,windows 32位。lzop is a file compressor which is very similar to gzip. lzop uses the LZO data compression library for compression services, and its main advantages over gzip are much ...

    Go-go-lzop-生成LZOP文件兼容LZO压缩库

    Go-lzop是一个开源项目,专门用于生成与LZO压缩库兼容的LZOP文件。在Go编程语言中,这个工具提供了一种高效且便捷的方式来处理数据压缩,特别是在需要快速存档和传输大量数据时。LZOP(Lempel-Ziv-Oberhumer ...

    LZO 库源代码 以及所有资源

    1. `lzo1x.c` 和 `lzo1y.c`:这是LZO的主要压缩函数实现,有不同的速度与压缩率平衡选项。 2. `lzo1x_1.c` 和 `lzo1y_1.c`:这是优化过的压缩函数,适用于单线程环境。 3. `lzo1x_decompress_safe.c` 和 `lzo1y_...

    GZIP、LZO、Zippy Snappy压缩算法应用场景小结

    GZIP、LZO、Zippy/Snappy是三种广泛使用的数据压缩算法,每种算法都有其特定的应用场景和性能特点,合理选择压缩算法对于提升系统性能和节约资源至关重要。 首先,GZIP是一种广泛使用的文件压缩工具,它基于DEFLATE...

Global site tag (gtag.js) - Google Analytics