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

搜索引擎

开发平台:

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 IndexOutput}. </summary>
  20. public abstract class BufferedIndexOutput:IndexOutput
  21. {
  22. internal const int BUFFER_SIZE = 1024;
  23. private byte[] buffer = new byte[BUFFER_SIZE];
  24. private long bufferStart = 0; // position in file of buffer
  25. private int bufferPosition = 0; // position in buffer
  26. /// <summary>Writes a single byte.</summary>
  27. /// <seealso cref="IndexInput.ReadByte()">
  28. /// </seealso>
  29. public override void  WriteByte(byte b)
  30. {
  31. if (bufferPosition >= BUFFER_SIZE)
  32. Flush();
  33. buffer[bufferPosition++] = b;
  34. }
  35. /// <summary>Writes an array of bytes.</summary>
  36. /// <param name="b">the bytes to write
  37. /// </param>
  38. /// <param name="length">the number of bytes to write
  39. /// </param>
  40. /// <seealso cref="IndexInput.ReadBytes(byte[],int,int)">
  41. /// </seealso>
  42. public override void  WriteBytes(byte[] b, int length)
  43. {
  44. for (int i = 0; i < length; i++)
  45. WriteByte(b[i]);
  46. }
  47. /// <summary>Forces any buffered output to be written. </summary>
  48. public override void  Flush()
  49. {
  50. FlushBuffer(buffer, bufferPosition);
  51. bufferStart += bufferPosition;
  52. bufferPosition = 0;
  53. }
  54. /// <summary>Expert: implements buffer write.  Writes bytes at the current position in
  55. /// the output.
  56. /// </summary>
  57. /// <param name="b">the bytes to write
  58. /// </param>
  59. /// <param name="len">the number of bytes to write
  60. /// </param>
  61. public abstract void  FlushBuffer(byte[] b, int len);
  62. /// <summary>Closes this stream to further operations. </summary>
  63. public override void  Close()
  64. {
  65. Flush();
  66. }
  67. /// <summary>Returns the current position in this file, where the next write will
  68. /// occur.
  69. /// </summary>
  70. /// <seealso cref="Seek(long)">
  71. /// </seealso>
  72. public override long GetFilePointer()
  73. {
  74. return bufferStart + bufferPosition;
  75. }
  76. /// <summary>Sets current position in this file, where the next write will occur.</summary>
  77. /// <seealso cref="GetFilePointer()">
  78. /// </seealso>
  79. public override void  Seek(long pos)
  80. {
  81. Flush();
  82. bufferStart = pos;
  83. }
  84. /// <summary>The number of bytes in the file. </summary>
  85. public abstract override long Length();
  86. }
  87. }