BZip2Codec.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:8k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.io.compress;
  19. import java.io.BufferedInputStream;
  20. import java.io.IOException;
  21. import java.io.InputStream;
  22. import java.io.OutputStream;
  23. import org.apache.hadoop.io.compress.bzip2.BZip2DummyCompressor;
  24. import org.apache.hadoop.io.compress.bzip2.BZip2DummyDecompressor;
  25. import org.apache.hadoop.io.compress.bzip2.CBZip2InputStream;
  26. import org.apache.hadoop.io.compress.bzip2.CBZip2OutputStream;
  27. /**
  28.  * This class provides CompressionOutputStream and CompressionInputStream for
  29.  * compression and decompression. Currently we dont have an implementation of
  30.  * the Compressor and Decompressor interfaces, so those methods of
  31.  * CompressionCodec which have a Compressor or Decompressor type argument, throw
  32.  * UnsupportedOperationException.
  33.  */
  34. public class BZip2Codec implements
  35.     org.apache.hadoop.io.compress.CompressionCodec {
  36.   private static final String HEADER = "BZ";
  37.   private static final int HEADER_LEN = HEADER.length();
  38.   /**
  39.   * Creates a new instance of BZip2Codec
  40.   */
  41.   public BZip2Codec() {
  42.   }
  43.   /**
  44.   * Creates CompressionOutputStream for BZip2
  45.   *
  46.   * @param out
  47.   *            The output Stream
  48.   * @return The BZip2 CompressionOutputStream
  49.   * @throws java.io.IOException
  50.   *             Throws IO exception
  51.   */
  52.   public CompressionOutputStream createOutputStream(OutputStream out)
  53.       throws IOException {
  54.     return new BZip2CompressionOutputStream(out);
  55.   }
  56.   /**
  57.    * This functionality is currently not supported.
  58.    *
  59.    * @throws java.lang.UnsupportedOperationException
  60.    *             Throws UnsupportedOperationException
  61.    */
  62.   public CompressionOutputStream createOutputStream(OutputStream out,
  63.       Compressor compressor) throws IOException {
  64.     return createOutputStream(out);
  65.   }
  66.   /**
  67.   * This functionality is currently not supported.
  68.   *
  69.   * @throws java.lang.UnsupportedOperationException
  70.   *             Throws UnsupportedOperationException
  71.   */
  72.   public Class<? extends org.apache.hadoop.io.compress.Compressor> getCompressorType() {
  73.     return BZip2DummyCompressor.class;
  74.   }
  75.   /**
  76.   * This functionality is currently not supported.
  77.   *
  78.   * @throws java.lang.UnsupportedOperationException
  79.   *             Throws UnsupportedOperationException
  80.   */
  81.   public Compressor createCompressor() {
  82.     return new BZip2DummyCompressor();
  83.   }
  84.   /**
  85.   * Creates CompressionInputStream to be used to read off uncompressed data.
  86.   *
  87.   * @param in
  88.   *            The InputStream
  89.   * @return Returns CompressionInputStream for BZip2
  90.   * @throws java.io.IOException
  91.   *             Throws IOException
  92.   */
  93.   public CompressionInputStream createInputStream(InputStream in)
  94.       throws IOException {
  95.     return new BZip2CompressionInputStream(in);
  96.   }
  97.   /**
  98.   * This functionality is currently not supported.
  99.   *
  100.   * @throws java.lang.UnsupportedOperationException
  101.   *             Throws UnsupportedOperationException
  102.   */
  103.   public CompressionInputStream createInputStream(InputStream in,
  104.       Decompressor decompressor) throws IOException {
  105.     return createInputStream(in);
  106.   }
  107.   /**
  108.   * This functionality is currently not supported.
  109.   *
  110.   * @throws java.lang.UnsupportedOperationException
  111.   *             Throws UnsupportedOperationException
  112.   */
  113.   public Class<? extends org.apache.hadoop.io.compress.Decompressor> getDecompressorType() {
  114.     return BZip2DummyDecompressor.class;
  115.   }
  116.   /**
  117.   * This functionality is currently not supported.
  118.   *
  119.   * @throws java.lang.UnsupportedOperationException
  120.   *             Throws UnsupportedOperationException
  121.   */
  122.   public Decompressor createDecompressor() {
  123.     return new BZip2DummyDecompressor();
  124.   }
  125.   /**
  126.   * .bz2 is recognized as the default extension for compressed BZip2 files
  127.   *
  128.   * @return A String telling the default bzip2 file extension
  129.   */
  130.   public String getDefaultExtension() {
  131.     return ".bz2";
  132.   }
  133.   private static class BZip2CompressionOutputStream extends CompressionOutputStream {
  134.     // class data starts here//
  135.     private CBZip2OutputStream output;
  136.     private boolean needsReset; 
  137.     // class data ends here//
  138.     public BZip2CompressionOutputStream(OutputStream out)
  139.         throws IOException {
  140.       super(out);
  141.       needsReset = true;
  142.     }
  143.     private void writeStreamHeader() throws IOException {
  144.       if (super.out != null) {
  145.         // The compressed bzip2 stream should start with the
  146.         // identifying characters BZ. Caller of CBZip2OutputStream
  147.         // i.e. this class must write these characters.
  148.         out.write(HEADER.getBytes());
  149.       }
  150.     }
  151.     public void finish() throws IOException {
  152.       this.output.finish();
  153.       needsReset = true;
  154.     }
  155.     private void internalReset() throws IOException {
  156.       if (needsReset) {
  157.         needsReset = false;
  158.         writeStreamHeader();
  159.         this.output = new CBZip2OutputStream(out);
  160.       }
  161.     }    
  162.     
  163.     public void resetState() throws IOException {
  164.       // Cannot write to out at this point because out might not be ready
  165.       // yet, as in SequenceFile.Writer implementation.
  166.       needsReset = true;
  167.     }
  168.     public void write(int b) throws IOException {
  169.       if (needsReset) {
  170.         internalReset();
  171.       }
  172.       this.output.write(b);
  173.     }
  174.     public void write(byte[] b, int off, int len) throws IOException {
  175.       if (needsReset) {
  176.         internalReset();
  177.       }
  178.       this.output.write(b, off, len);
  179.     }
  180.     public void close() throws IOException {
  181.       this.output.flush();
  182.       this.output.close();
  183.       needsReset = true;
  184.     }
  185.   }// end of class BZip2CompressionOutputStream
  186.   private static class BZip2CompressionInputStream extends CompressionInputStream {
  187.     // class data starts here//
  188.     private CBZip2InputStream input;
  189.     boolean needsReset;
  190.     // class data ends here//
  191.     public BZip2CompressionInputStream(InputStream in) throws IOException {
  192.       super(in);
  193.       needsReset = true;
  194.     }
  195.     private BufferedInputStream readStreamHeader() throws IOException {
  196.       // We are flexible enough to allow the compressed stream not to
  197.       // start with the header of BZ. So it works fine either we have
  198.       // the header or not.
  199.       BufferedInputStream bufferedIn = null;
  200.       if (super.in != null) {
  201.         bufferedIn = new BufferedInputStream(super.in);
  202.         bufferedIn.mark(HEADER_LEN);
  203.         byte[] headerBytes = new byte[HEADER_LEN];
  204.         int actualRead = bufferedIn.read(headerBytes, 0, HEADER_LEN);
  205.         if (actualRead != -1) {
  206.           String header = new String(headerBytes);
  207.           if (header.compareTo(HEADER) != 0) {
  208.             bufferedIn.reset();
  209.           }
  210.         }
  211.       }
  212.       if (bufferedIn == null) {
  213.         throw new IOException("Failed to read bzip2 stream.");
  214.       }
  215.       return bufferedIn;
  216.     }// end of method
  217.     public void close() throws IOException {
  218.       if (!needsReset) {
  219.         input.close();
  220.         needsReset = true;
  221.       }
  222.     }
  223.     public int read(byte[] b, int off, int len) throws IOException {
  224.       if (needsReset) {
  225.         internalReset();
  226.       }
  227.       return this.input.read(b, off, len);
  228.     }
  229.     private void internalReset() throws IOException {
  230.       if (needsReset) {
  231.         needsReset = false;
  232.         BufferedInputStream bufferedIn = readStreamHeader();
  233.         input = new CBZip2InputStream(bufferedIn);
  234.       }
  235.     }    
  236.     
  237.     public void resetState() throws IOException {
  238.       // Cannot read from bufferedIn at this point because bufferedIn might not be ready
  239.       // yet, as in SequenceFile.Reader implementation.
  240.       needsReset = true;
  241.     }
  242.     public int read() throws IOException {
  243.       if (needsReset) {
  244.         internalReset();
  245.       }
  246.       return this.input.read();
  247.     }
  248.   }// end of BZip2CompressionInputStream
  249. }