BufferedFSInputStream.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.fs;
  19. import java.io.BufferedInputStream;
  20. import java.io.IOException;
  21. /**
  22.  * A class optimizes reading from FSInputStream by bufferring
  23.  */
  24. public class BufferedFSInputStream extends BufferedInputStream
  25. implements Seekable, PositionedReadable {
  26.   /**
  27.    * Creates a <code>BufferedFSInputStream</code>
  28.    * with the specified buffer size,
  29.    * and saves its  argument, the input stream
  30.    * <code>in</code>, for later use.  An internal
  31.    * buffer array of length  <code>size</code>
  32.    * is created and stored in <code>buf</code>.
  33.    *
  34.    * @param   in     the underlying input stream.
  35.    * @param   size   the buffer size.
  36.    * @exception IllegalArgumentException if size <= 0.
  37.    */
  38.   public BufferedFSInputStream(FSInputStream in, int size) {
  39.     super(in, size);
  40.   }
  41.   public long getPos() throws IOException {
  42.     return ((FSInputStream)in).getPos()-(count-pos);
  43.   }
  44.   public long skip(long n) throws IOException {
  45.     if (n <= 0) {
  46.       return 0;
  47.     }
  48.     seek(getPos()+n);
  49.     return n;
  50.   }
  51.   public void seek(long pos) throws IOException {
  52.     if( pos<0 ) {
  53.       return;
  54.     }
  55.     // optimize: check if the pos is in the buffer
  56.     long end = ((FSInputStream)in).getPos();
  57.     long start = end - count;
  58.     if( pos>=start && pos<end) {
  59.       this.pos = (int)(pos-start);
  60.       return;
  61.     }
  62.     // invalidate buffer
  63.     this.pos = 0;
  64.     this.count = 0;
  65.     ((FSInputStream)in).seek(pos);
  66.   }
  67.   public boolean seekToNewSource(long targetPos) throws IOException {
  68.     pos = 0;
  69.     count = 0;
  70.     return ((FSInputStream)in).seekToNewSource(targetPos);
  71.   }
  72.   public int read(long position, byte[] buffer, int offset, int length) throws IOException {
  73.     return ((FSInputStream)in).read(position, buffer, offset, length) ;
  74.   }
  75.   public void readFully(long position, byte[] buffer, int offset, int length) throws IOException {
  76.     ((FSInputStream)in).readFully(position, buffer, offset, length);
  77.   }
  78.   public void readFully(long position, byte[] buffer) throws IOException {
  79.     ((FSInputStream)in).readFully(position, buffer);
  80.   }
  81. }