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

网格计算

开发平台:

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;
  19. import java.io.IOException;
  20. import java.io.DataInput;
  21. import java.io.DataOutput;
  22. import java.io.DataOutputStream;
  23. import java.io.DataInputStream;
  24. import java.io.ByteArrayOutputStream;
  25. import java.io.ByteArrayInputStream;
  26. import java.util.zip.Deflater;
  27. import java.util.zip.DeflaterOutputStream;
  28. import java.util.zip.InflaterInputStream;
  29. /** A base-class for Writables which store themselves compressed and lazily
  30.  * inflate on field access.  This is useful for large objects whose fields are
  31.  * not be altered during a map or reduce operation: leaving the field data
  32.  * compressed makes copying the instance from one file to another much
  33.  * faster. */
  34. public abstract class CompressedWritable implements Writable {
  35.   // if non-null, the compressed field data of this instance.
  36.   private byte[] compressed;
  37.   public CompressedWritable() {}
  38.   public final void readFields(DataInput in) throws IOException {
  39.     compressed = new byte[in.readInt()];
  40.     in.readFully(compressed, 0, compressed.length);
  41.   }
  42.   /** Must be called by all methods which access fields to ensure that the data
  43.    * has been uncompressed. */
  44.   protected void ensureInflated() {
  45.     if (compressed != null) {
  46.       try {
  47.         ByteArrayInputStream deflated = new ByteArrayInputStream(compressed);
  48.         DataInput inflater =
  49.           new DataInputStream(new InflaterInputStream(deflated));
  50.         readFieldsCompressed(inflater);
  51.         compressed = null;
  52.       } catch (IOException e) {
  53.         throw new RuntimeException(e);
  54.       }
  55.     }
  56.   }
  57.   /** Subclasses implement this instead of {@link #readFields(DataInput)}. */
  58.   protected abstract void readFieldsCompressed(DataInput in)
  59.     throws IOException;
  60.   public final void write(DataOutput out) throws IOException {
  61.     if (compressed == null) {
  62.       ByteArrayOutputStream deflated = new ByteArrayOutputStream();
  63.       Deflater deflater = new Deflater(Deflater.BEST_SPEED);
  64.       DataOutputStream dout =
  65.         new DataOutputStream(new DeflaterOutputStream(deflated, deflater));
  66.       writeCompressed(dout);
  67.       dout.close();
  68.       deflater.end();
  69.       compressed = deflated.toByteArray();
  70.     }
  71.     out.writeInt(compressed.length);
  72.     out.write(compressed);
  73.   }
  74.   /** Subclasses implement this instead of {@link #write(DataOutput)}. */
  75.   protected abstract void writeCompressed(DataOutput out) throws IOException;
  76. }