缓冲读取txt文本的封装类:

缓冲读取txt文本的封装类:(转载)
  1 
http://topic.csdn.net/u/20111214/20/2534c03f-5447-4541-91e2-1ee2ca97c786.html?2906

  2  package  Cool;
  3 
  4  import  java.io.UnsupportedEncodingException;
  5  import  java.util.ArrayList;
  6  import  java.util.List;
  7 
  8  import  Adapter.MyTextView;
  9  import  Util.CT;
 10  import  android.widget.TextView;
 11 
 12  public   class  TextReader {
 13       /**  文件的显示控件  */
 14       private  TextView mTextView;
 15 
 16       /**  文件名  */
 17       private  String mFilePath  =   null ;
 18 
 19       /**  默认的文件编码形式  */
 20       private  String mEncoding  =   " gb2312 " ;
 21 
 22       /**  文件末尾  */
 23       private   boolean  mEndOfDoc  =   false ;
 24 
 25       /**  文件开头  */
 26       private   boolean  mBeforeOfDoc  =   true ;
 27 
 28       /**  当前显示缓冲的显示行列表  */
 29       private  List < TxtLine >  mCurrentList  =   new  ArrayList < TxtLine > ();
 30 
 31       /**  读取文件的输入流工具类  */
 32       private  RandomAccessRead mRaf  =   null ;
 33 
 34       /**  用于保存部分文件的缓冲区大小  */
 35       private   int  mDataLengthOfOneDoc  =   100   *   1024 ;
 36 
 37       /**  屏幕宽度和高度  */
 38       private   int  mViewWidth, mViewHeight;
 39 
 40       /**  文件大小  */
 41       private   long  mFileLength;
 42 
 43       /**  缓冲区中用于显示当前页面的第一行  */
 44       private   int  mCurrentLine  =   0 ;
 45 
 46       /**  缓冲区中用于显示当前页面的起始索引  */
 47       private   int  mCurrentOffset  =   0 ;
 48 
 49       /**  文件中用于显示当前页面的起始索引  */
 50       private   int  mStartOffset  =   0 ;
 51 
 52       /**  用于显示当前页面的数组的起始索引  */
 53       private   int  mDataStartLocation  =   0 ;
 54 
 55       /**  用于显示当前页面的数组的结尾索引  */
 56       private   int  mDataEndLocation  =   0 ;
 57 
 58       /**  当前显示的文件大小百分比  */
 59       private   int  mPercent  =   0 ;
 60 
 61       /**  文件中用于显示当前页面的结尾索引  */
 62       private   int  mEndOffset  =   0 ;
 63 
 64       /**  用于显示当前页面的数组  */
 65       private   byte [] mScreenData  =   null ;
 66 
 67       /**  用于显示的缓冲数组  */
 68       private   byte [] mDisplayBuffer  =   null ;
 69 
 70       /**
 71       * 构造函数
 72       * 
 73       *  @param  mTextView
 74       *            显示控件
 75       *  @param  mScreenWidth
 76       *            屏幕宽度
 77       *  @param  mScreenHeight
 78       *            屏幕高度
 79       *  @param  mFilePath
 80       *            文件路径
 81       *  @param  mEncoding
 82       *            文件编码
 83        */
 84       public  TextReader(MyTextView mTextView,  int  mScreenWidth,  int  mScreenHeight,
 85              String mFilePath, String mEncoding) {
 86           this .mTextView  =  mTextView;
 87           this .mFilePath  =  mFilePath;
 88           this .mEncoding  =  mEncoding;
 89           this .mViewWidth  =  mScreenWidth;
 90           this .mViewHeight  =  mScreenHeight;
 91          init();
 92      }
 93 
 94       public   void  readFile() {
 95          readNextBuffer();
 96          analyzeDisplayBuffer();
 97          displayNextScreen( 0 );
 98      }
 99 
100       /**
101       * 获取读取文件的输入流以及文件大小
102        */
103       private   void  init() {
104           //  TODO Auto-generated method stub
105           this .mRaf  =   new  RandomAccessRead(mFilePath);
106           this .mFileLength  =  mRaf.length();
107           if  ( this .mFileLength  ==   0 ) {
108              mTextView.setText(Constant.NODATAINFILE);
109               return ;
110          }
111      }
112 
113       /**
114       * 获取下一个缓冲区
115        */
116       private   void  readNextBuffer() {
117          mRaf.openNewStream();
118          mRaf.locate(mStartOffset);
119           byte [] b  =   new   byte [mDataLengthOfOneDoc];
120          mCurrentOffset  =  mStartOffset;
121           int  actualLength  =  mRaf.readBytes(b);
122           if  (mStartOffset  ==   0 ) {
123              mBeforeOfDoc  =   true ;
124          }  else  {
125              mBeforeOfDoc  =   false ;
126          }
127           if  (actualLength  <  mDataLengthOfOneDoc) {
128              mEndOfDoc  =   true ;
129          }  else  {
130              mEndOfDoc  =   false ;
131          }
132 
133           if  (actualLength  ==   - 1   &&  mScreenData.length  ==   0 ) { //  意外到了文件流的末尾或者
134              mTextView.setText( " 读取文件失或者文件缓冲区失败 " );
135               return ;
136          }
137 
138           if  (mEndOfDoc) {
139              mDisplayBuffer  =   new   byte [actualLength];
140              System.arraycopy(b,  0 , mDisplayBuffer,  0 , actualLength);
141              b  =   null ;
142              System.gc();
143               return ;
144          }
145           /**  最后一个换行符的索引  */
146           int  readDataLength  =  actualLength;
147           int  nLocation  =   0 ;
148           while  (readDataLength  >   0 ) {
149               if  ((b[readDataLength  -   1 &   0xff ==   10 ) {
150                  nLocation  =  readDataLength;
151                   break ;
152              }
153              readDataLength -- ;
154          }
155           if  (nLocation  ==   0 ) {
156              System.exit( 1 );
157          }
158           int  displayLength  =  nLocation;
159          mDisplayBuffer  =   new   byte [displayLength];
160          System.arraycopy(b,  0 , mDisplayBuffer,  0 , displayLength);
161          b  =   null ;
162          System.gc();
163      }
164 
165       /**
166       * 获取上一个缓冲区
167        */
168       private   void  readPreBuffer() {
169           int  offsetOfLastScreen  =  mCurrentList.get(mCurrentLine).offset;
170           if  (offsetOfLastScreen  <=  mDataLengthOfOneDoc) {
171              mBeforeOfDoc  =   true ;
172               //  if(offsetOfLastScreen>=mFileLength){
173               //  mEndOfDoc=true;
174               //  }
175               byte [] b  =   new   byte [offsetOfLastScreen];
176              mRaf.openNewStream();
177               int  actualLength  =  mRaf.readBytes(b);
178               if  (actualLength  <  offsetOfLastScreen) {
179                  mEndOfDoc  =   true ;
180              }  else  {
181                  mEndOfDoc  =   false ;
182              }
183               if  (actualLength  ==   - 1   &&  mScreenData.length  ==   0 ) { //  意外到了文件流的末尾或者
184                  mTextView.setText( " 读取文件失或者文件缓冲区失败 " );
185                   return ;
186              }
187 
188               if  (mEndOfDoc) {
189                  mDisplayBuffer  =   new   byte [actualLength];
190                  System.arraycopy(b,  0 , mDisplayBuffer,  0 , actualLength);
191                  b  =   null ;
192                  System.gc();
193                  mCurrentOffset  =   0 ;
194                   return ;
195              }
196               /**  最后一个换行符的索引  */
197               int  readDataLength  =  actualLength;
198               int  nLocation  =   0 ;
199               while  (readDataLength  >   0 ) {
200                   if  ((b[readDataLength  -   1 &   0xff ==   10 ) {
201                      nLocation  =  readDataLength;
202                       break ;
203                  }
204                  readDataLength -- ;
205              }
206               if  (nLocation  ==   0 ) {
207                  System.exit( 1 );
208              }
209               int  displayLength  =  nLocation;
210              mDisplayBuffer  =   new   byte [displayLength];
211              System.arraycopy(b,  0 , mDisplayBuffer,  0 , displayLength);
212              b  =   null ;
213              System.gc();
214              mCurrentOffset  =   0 ;
215               return ;
216          }
217 
218           int  skipLength  =  offsetOfLastScreen  -  mDataLengthOfOneDoc;
219          mRaf.openNewStream();
220          mRaf.locate(skipLength);
221          mCurrentOffset  =  skipLength;
222           byte [] b  =   new   byte [mDataLengthOfOneDoc];
223           int  readLength  =  mRaf.readBytes(b);
224          mBeforeOfDoc  =   false ;
225           if  (readLength  <  mDataLengthOfOneDoc) {
226              mEndOfDoc  =   true ;
227          }
228           if  (readLength  ==   - 1   &&  mScreenData.length  ==   0 ) { //  意外到了文件流的末尾或者
229              mTextView.setText( " 读取文件失或者文件缓冲区失败 " );
230               return ;
231          }
232 
233           int  nlocation  =   0 ;
234           while  (nlocation  <  readLength) {
235               if  ((b[readLength  -   1 &   0xff ==   10 ) {
236                  nlocation  =  readLength;
237                   break ;
238              }
239              readLength -- ;
240          }
241           if  (nlocation  ==   0 ) {
242              System.exit( 1 );
243          }
244 
245          mDisplayBuffer  =   new   byte [readLength];
246          System.arraycopy(b,  0 , mDisplayBuffer,  0 , readLength);
247          b  =   null ;
248          System.gc();
249      }
250 
251 
http://topic.csdn.net/u/20111026/15/18c77efa-f41c-4315-8023-550a3732bd76.html?14299
   

你可能感兴趣的:(缓冲读取txt文本的封装类:)