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

搜索引擎

开发平台:

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 output to a file in a Directory.  A random-access
  20. /// output stream.  Used for all Lucene index output operations.
  21. /// </summary>
  22. /// <seealso cref="Directory">
  23. /// </seealso>
  24. /// <seealso cref="IndexInput">
  25. /// </seealso>
  26. public abstract class IndexOutput
  27. {
  28. /// <summary>Writes a single byte.</summary>
  29. /// <seealso cref="IndexInput.ReadByte()">
  30. /// </seealso>
  31. public abstract void  WriteByte(byte b);
  32. /// <summary>Writes an array of bytes.</summary>
  33. /// <param name="b">the bytes to write
  34. /// </param>
  35. /// <param name="length">the number of bytes to write
  36. /// </param>
  37. /// <seealso cref="IndexInput.ReadBytes(byte[],int,int)">
  38. /// </seealso>
  39. public abstract void  WriteBytes(byte[] b, int length);
  40. /// <summary>Writes an int as four bytes.</summary>
  41. /// <seealso cref="IndexInput.ReadInt()">
  42. /// </seealso>
  43. public virtual void  WriteInt(int i)
  44. {
  45. WriteByte((byte) (i >> 24));
  46. WriteByte((byte) (i >> 16));
  47. WriteByte((byte) (i >> 8));
  48. WriteByte((byte) i);
  49. }
  50. /// <summary>Writes an int in a variable-length format.  Writes between one and
  51. /// five bytes.  Smaller values take fewer bytes.  Negative numbers are not
  52. /// supported.
  53. /// </summary>
  54. /// <seealso cref="IndexInput.ReadVInt()">
  55. /// </seealso>
  56. public virtual void  WriteVInt(int i)
  57. {
  58. while ((i & ~ 0x7F) != 0)
  59. {
  60. WriteByte((byte) ((i & 0x7f) | 0x80));
  61. i = SupportClass.Number.URShift(i, 7);
  62. }
  63. WriteByte((byte) i);
  64. }
  65. /// <summary>Writes a long as eight bytes.</summary>
  66. /// <seealso cref="IndexInput.ReadLong()">
  67. /// </seealso>
  68. public virtual void  WriteLong(long i)
  69. {
  70. WriteInt((int) (i >> 32));
  71. WriteInt((int) i);
  72. }
  73. /// <summary>Writes an long in a variable-length format.  Writes between one and five
  74. /// bytes.  Smaller values take fewer bytes.  Negative numbers are not
  75. /// supported.
  76. /// </summary>
  77. /// <seealso cref="IndexInput.ReadVLong()">
  78. /// </seealso>
  79. public virtual void  WriteVLong(long i)
  80. {
  81. while ((i & ~ 0x7F) != 0)
  82. {
  83. WriteByte((byte) ((i & 0x7f) | 0x80));
  84. i = (int) (((uint) i) >> 7);    // {{Aroush-1.9}} Is this OK?!  long to uint, to int conversion.
  85. }
  86. WriteByte((byte) i);
  87. }
  88. /// <summary>Writes a string.</summary>
  89. /// <seealso cref="IndexInput.ReadString()">
  90. /// </seealso>
  91. public virtual void  WriteString(System.String s)
  92. {
  93. int length = s.Length;
  94. WriteVInt(length);
  95. WriteChars(s, 0, length);
  96. }
  97. /// <summary>Writes a sequence of UTF-8 encoded characters from a string.</summary>
  98. /// <param name="s">the source of the characters
  99. /// </param>
  100. /// <param name="start">the first character in the sequence
  101. /// </param>
  102. /// <param name="length">the number of characters in the sequence
  103. /// </param>
  104. /// <seealso cref="IndexInput.ReadChars(char[],int,int)">
  105. /// </seealso>
  106. public virtual void  WriteChars(System.String s, int start, int length)
  107. {
  108. int end = start + length;
  109. for (int i = start; i < end; i++)
  110. {
  111. int code = (int) s[i];
  112. if (code >= 0x01 && code <= 0x7F)
  113. WriteByte((byte) code);
  114. else if (((code >= 0x80) && (code <= 0x7FF)) || code == 0)
  115. {
  116. WriteByte((byte) (0xC0 | (code >> 6)));
  117. WriteByte((byte) (0x80 | (code & 0x3F)));
  118. }
  119. else
  120. {
  121. WriteByte((byte) (0xE0 | (SupportClass.Number.URShift(code, 12))));
  122. WriteByte((byte) (0x80 | ((code >> 6) & 0x3F)));
  123. WriteByte((byte) (0x80 | (code & 0x3F)));
  124. }
  125. }
  126. }
  127. /// <summary>Forces any buffered output to be written. </summary>
  128. public abstract void  Flush();
  129. /// <summary>Closes this stream to further operations. </summary>
  130. public abstract void  Close();
  131. /// <summary>Returns the current position in this file, where the next write will
  132. /// occur.
  133. /// </summary>
  134. /// <seealso cref="Seek(long)">
  135. /// </seealso>
  136. public abstract long GetFilePointer();
  137. /// <summary>Sets current position in this file, where the next write will occur.</summary>
  138. /// <seealso cref="GetFilePointer()">
  139. /// </seealso>
  140. public abstract void  Seek(long pos);
  141. /// <summary>The number of bytes in the file. </summary>
  142. public abstract long Length();
  143. }
  144. }