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

搜索引擎

开发平台:

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>Abstract base class for input from a file in a {@link Directory}.  A
  20. /// random-access input stream.  Used for all Lucene index input operations.
  21. /// </summary>
  22. /// <seealso cref="Directory">
  23. /// </seealso>
  24. public abstract class IndexInput : System.ICloneable
  25. {
  26. private char[] chars; // used by readString()
  27. /// <summary>Reads and returns a single byte.</summary>
  28. /// <seealso cref="IndexOutput.WriteByte(byte)">
  29. /// </seealso>
  30. public abstract byte ReadByte();
  31. /// <summary>Reads a specified number of bytes into an array at the specified offset.</summary>
  32. /// <param name="b">the array to read bytes into
  33. /// </param>
  34. /// <param name="offset">the offset in the array to start storing bytes
  35. /// </param>
  36. /// <param name="len">the number of bytes to read
  37. /// </param>
  38. /// <seealso cref="IndexOutput.WriteBytes(byte[],int)">
  39. /// </seealso>
  40. public abstract void  ReadBytes(byte[] b, int offset, int len);
  41. /// <summary>Reads four bytes and returns an int.</summary>
  42. /// <seealso cref="IndexOutput.WriteInt(int)">
  43. /// </seealso>
  44. public virtual int ReadInt()
  45. {
  46. return ((ReadByte() & 0xFF) << 24) | ((ReadByte() & 0xFF) << 16) | ((ReadByte() & 0xFF) << 8) | (ReadByte() & 0xFF);
  47. }
  48. /// <summary>Reads an int stored in variable-length format.  Reads between one and
  49. /// five bytes.  Smaller values take fewer bytes.  Negative numbers are not
  50. /// supported.
  51. /// </summary>
  52. /// <seealso cref="IndexOutput.WriteVInt(int)">
  53. /// </seealso>
  54. public virtual int ReadVInt()
  55. {
  56. byte b = ReadByte();
  57. int i = b & 0x7F;
  58. for (int shift = 7; (b & 0x80) != 0; shift += 7)
  59. {
  60. b = ReadByte();
  61. i |= (b & 0x7F) << shift;
  62. }
  63. return i;
  64. }
  65. /// <summary>Reads eight bytes and returns a long.</summary>
  66. /// <seealso cref="IndexOutput.WriteLong(long)">
  67. /// </seealso>
  68. public virtual long ReadLong()
  69. {
  70. return (((long) ReadInt()) << 32) | (ReadInt() & 0xFFFFFFFFL);
  71. }
  72. /// <summary>Reads a long stored in variable-length format.  Reads between one and
  73. /// nine bytes.  Smaller values take fewer bytes.  Negative numbers are not
  74. /// supported. 
  75. /// </summary>
  76. public virtual long ReadVLong()
  77. {
  78. byte b = ReadByte();
  79. long i = b & 0x7F;
  80. for (int shift = 7; (b & 0x80) != 0; shift += 7)
  81. {
  82. b = ReadByte();
  83. i |= (b & 0x7FL) << shift;
  84. }
  85. return i;
  86. }
  87. /// <summary>Reads a string.</summary>
  88. /// <seealso cref="IndexOutput.WriteString(String)">
  89. /// </seealso>
  90. public virtual System.String ReadString()
  91. {
  92. int length = ReadVInt();
  93. if (chars == null || length > chars.Length)
  94. chars = new char[length];
  95. ReadChars(chars, 0, length);
  96. return new System.String(chars, 0, length);
  97. }
  98. /// <summary>Reads UTF-8 encoded characters into an array.</summary>
  99. /// <param name="buffer">the array to read characters into
  100. /// </param>
  101. /// <param name="start">the offset in the array to start storing characters
  102. /// </param>
  103. /// <param name="length">the number of characters to read
  104. /// </param>
  105. /// <seealso cref="IndexOutput.WriteChars(String,int,int)">
  106. /// </seealso>
  107. public virtual void  ReadChars(char[] buffer, int start, int length)
  108. {
  109. int end = start + length;
  110. for (int i = start; i < end; i++)
  111. {
  112. byte b = ReadByte();
  113. if ((b & 0x80) == 0)
  114. buffer[i] = (char) (b & 0x7F);
  115. else if ((b & 0xE0) != 0xE0)
  116. {
  117. buffer[i] = (char) (((b & 0x1F) << 6) | (ReadByte() & 0x3F));
  118. }
  119. else
  120. buffer[i] = (char) (((b & 0x0F) << 12) | ((ReadByte() & 0x3F) << 6) | (ReadByte() & 0x3F));
  121. }
  122. }
  123. /// <summary>Closes the stream to futher operations. </summary>
  124. public abstract void  Close();
  125. /// <summary>Returns the current position in this file, where the next read will
  126. /// occur.
  127. /// </summary>
  128. /// <seealso cref="Seek(long)">
  129. /// </seealso>
  130. public abstract long GetFilePointer();
  131. /// <summary>Sets current position in this file, where the next read will occur.</summary>
  132. /// <seealso cref="GetFilePointer()">
  133. /// </seealso>
  134. public abstract void  Seek(long pos);
  135. /// <summary>The number of bytes in the file. </summary>
  136. public abstract long Length();
  137. /// <summary>Returns a clone of this stream.
  138. /// 
  139. /// <p>Clones of a stream access the same data, and are positioned at the same
  140. /// point as the stream they were cloned from.
  141. /// 
  142. /// <p>Expert: Subclasses must ensure that clones may be positioned at
  143. /// different points in the input from each other and from the stream they
  144. /// were cloned from.
  145. /// </summary>
  146. public virtual System.Object Clone()
  147. {
  148. IndexInput clone = null;
  149. try
  150. {
  151. clone = (IndexInput) base.MemberwiseClone();
  152. }
  153. catch (System.Exception)
  154. {
  155. }
  156. clone.chars = null;
  157. return clone;
  158. }
  159. }
  160. }