BufferedIndexInput.cs
上传用户:zhangkuixh
上传日期:2013-09-30
资源大小:5473k
文件大小:4k
源码类别:

搜索引擎

开发平台:

C#

  1. /*
  2.  * Copyright 2004 The Apache Software Foundation
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License");
  5.  * you may not use this file except in compliance with the License.
  6.  * You may obtain a copy of the License at
  7.  * 
  8.  * http://www.apache.org/licenses/LICENSE-2.0
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software
  11.  * distributed under the License is distributed on an "AS IS" BASIS,
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  * See the License for the specific language governing permissions and
  14.  * limitations under the License.
  15.  */
  16. using System;
  17. namespace Lucene.Net.Store
  18. {
  19. /// <summary>Base implementation class for buffered {@link IndexInput}. </summary>
  20. public abstract class BufferedIndexInput : IndexInput, System.ICloneable
  21. {
  22. internal static readonly int BUFFER_SIZE;
  23. private byte[] buffer;
  24. private long bufferStart = 0; // position in file of buffer
  25. private int bufferLength = 0; // end of valid bytes
  26. private int bufferPosition = 0; // next byte to read
  27. public override byte ReadByte()
  28. {
  29. if (bufferPosition >= bufferLength)
  30. Refill();
  31. return buffer[bufferPosition++];
  32. }
  33. public override void  ReadBytes(byte[] b, int offset, int len)
  34. {
  35. if (len < BUFFER_SIZE)
  36. {
  37. for (int i = 0; i < len; i++)
  38.     // read byte-by-byte
  39. b[i + offset] = (byte) ReadByte();
  40. }
  41. else
  42. {
  43. // read all-at-once
  44. long start = GetFilePointer();
  45. SeekInternal(start);
  46. ReadInternal(b, offset, len);
  47. bufferStart = start + len; // adjust stream variables
  48. bufferPosition = 0;
  49. bufferLength = 0; // trigger refill() on read
  50. }
  51. }
  52. private void  Refill()
  53. {
  54. long start = bufferStart + bufferPosition;
  55. long end = start + BUFFER_SIZE;
  56. if (end > Length())
  57.     // don't read past EOF
  58. end = Length();
  59. bufferLength = (int) (end - start);
  60. if (bufferLength <= 0)
  61. throw new System.IO.IOException("read past EOF");
  62. if (buffer == null)
  63. buffer = new byte[BUFFER_SIZE]; // allocate buffer lazily
  64. ReadInternal(buffer, 0, bufferLength);
  65. bufferStart = start;
  66. bufferPosition = 0;
  67. }
  68. /// <summary>Expert: implements buffer refill.  Reads bytes from the current position
  69. /// in the input.
  70. /// </summary>
  71. /// <param name="b">the array to read bytes into
  72. /// </param>
  73. /// <param name="offset">the offset in the array to start storing bytes
  74. /// </param>
  75. /// <param name="length">the number of bytes to read
  76. /// </param>
  77. public abstract void  ReadInternal(byte[] b, int offset, int length);
  78. public override long GetFilePointer()
  79. {
  80. return bufferStart + bufferPosition;
  81. }
  82. public override void  Seek(long pos)
  83. {
  84. if (pos >= bufferStart && pos < (bufferStart + bufferLength))
  85. bufferPosition = (int) (pos - bufferStart);
  86.     // seek within buffer
  87. else
  88. {
  89. bufferStart = pos;
  90. bufferPosition = 0;
  91. bufferLength = 0; // trigger refill() on read()
  92. SeekInternal(pos);
  93. }
  94. }
  95. /// <summary>Expert: implements seek.  Sets current position in this file, where the
  96. /// next {@link #ReadInternal(byte[],int,int)} will occur.
  97. /// </summary>
  98. /// <seealso cref="ReadInternal(byte[],int,int)">
  99. /// </seealso>
  100. public abstract void  SeekInternal(long pos);
  101. public override System.Object Clone()
  102. {
  103. BufferedIndexInput clone = (BufferedIndexInput) base.Clone();
  104. if (buffer != null)
  105. {
  106. clone.buffer = new byte[BUFFER_SIZE];
  107. Array.Copy(buffer, 0, clone.buffer, 0, bufferLength);
  108. }
  109. return clone;
  110. }
  111.         static BufferedIndexInput()
  112. {
  113. BUFFER_SIZE = BufferedIndexOutput.BUFFER_SIZE;
  114. }
  115. }
  116. }