通过CompressionCodecFActory 推断 CompressCodec
在读取一个压缩文件时,通常可以通过文件扩展名推断需要使用哪个codec。如果文件以.gz结尾,则可以用Gzipcodec来读取,如此推断等。
各种压缩格式的文件拓展名:Hadoop中的codec
当在读取一个压缩文件的时候,可能并不知道压缩文件用的是哪种压缩算法,那么无法完成解压任务。在Hadoop中,CompressionCodecFactory通过使用其getCodec()方法,可以通过文件扩展名映射到一个与其对应的CompressionCodec类,如README.txt.gz通过getCodec()方法后,GipCodec类。关于Hadoop的压缩,
下面是参考博文:CompreassionCodecFactory
再下边是范例(我在hadoop文件系统测试了.gz文件):
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.CompressionCodecFactory;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
public class Main {
public static void main(String[] args) throws Exception{
String uri=args[0];
Configuration conf=new Configuration();
FileSystem fs=FileSystem.get(URI.create(uri),conf);
Path inputpath=new Path(uri);
CompressionCodecFactory factory=new CompressionCodecFactory(conf);
CompressionCodec codec=factory.getCodec(inputpath);
if(codec == null){
System.err.println(" NO Codec found for" + uri);
System.exit(1);
}
String outputUri=CompressionCodecFactory.removeSuffix(uri, codec.getDefaultExtension());
InputStream in =null;
OutputStream out=null;
try {
in=codec.createInputStream(fs.open(inputpath));//读取压缩文件
out=fs.create(new Path(outputUri));
IOUtils.copyBytes(in,out,conf);
}
finally {
IOUtils.closeStream(in);
IOUtils.closeStream(out);
}
}
}
文件目录:
运行:
可以看到将testout.gz解压完成。