欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解析Java的InputStream類(lèi)并借助其讀取ppt文件

 更新時(shí)間:2015年11月13日 17:39:17   作者:MyFavorite  
這篇文章主要介紹了Java的InputStream類(lèi)并借助其讀取ppt文件,講到了InputStream類(lèi)中一些常用的方法的問(wèn)題,需要的朋友可以參考下

1. 關(guān)于InputStream.read()
     在從數(shù)據(jù)流里讀取數(shù)據(jù)時(shí),為圖簡(jiǎn)單,經(jīng)常用InputStream.read()方法。這個(gè)方法是從流里每次只讀取讀取一個(gè)字節(jié),效率會(huì)非常低。     更好的方法是用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,一次讀取多個(gè)字節(jié)。


2. 關(guān)于InputStream類(lèi)的available()方法
    要一次讀取多個(gè)字節(jié)時(shí),經(jīng)常用到InputStream.available()方法,這個(gè)方法可以在讀寫(xiě)操作前先得知數(shù)據(jù)流里有多少個(gè)字節(jié)可以讀取。需要注意的是,如果這個(gè)方法用在從本
地文件讀取數(shù)據(jù)時(shí),一般不會(huì)遇到問(wèn)題,但如果是用于網(wǎng)絡(luò)操作,就經(jīng)常會(huì)遇到一些麻煩。比如,Socket通訊時(shí),對(duì)方明明發(fā)來(lái)了1000個(gè)字節(jié),但是自己的程序調(diào)用available()方法卻只得到900,或者100,甚至是0,感覺(jué)有點(diǎn)莫名其妙,怎么也找不到原因。其實(shí),這是因?yàn)榫W(wǎng)絡(luò)通訊往往是間斷性的,一串字節(jié)往往分幾批進(jìn)行發(fā)送。本地程序調(diào)用available()方法有時(shí)得到0,這可能是對(duì)方還沒(méi)有響應(yīng),也可能是對(duì)方已經(jīng)響應(yīng)了,但是數(shù)據(jù)還沒(méi)有送達(dá)本地。對(duì)方發(fā)送了1000個(gè)字節(jié)給你,也許分成3批到達(dá),這你就要調(diào)用3次available()方法才能將數(shù)據(jù)總數(shù)全部得到。
      如果這樣寫(xiě)代碼:

 int count = in.available();
 byte[] b = new byte[count];
 in.read(b);

      在進(jìn)行網(wǎng)絡(luò)操作時(shí)往往出錯(cuò),因?yàn)槟阏{(diào)用available()方法時(shí),對(duì)發(fā)發(fā)送的數(shù)據(jù)可能還沒(méi)有到達(dá),你得到的count是0。
         需要改成這樣:

 int count = 0;
 while (count == 0) {
  count = in.available();
 }
 byte[] b = new byte[count];
 in.read(b);

3. 關(guān)于InputStream.read(byte[] b)和InputStream.read(byte[] b,int off,int len)

這兩個(gè)方法都是用來(lái)從流里讀取多個(gè)字節(jié)的,有經(jīng)驗(yàn)的程序員就會(huì)發(fā)現(xiàn),這兩個(gè)方法經(jīng)常 讀取不到自己想要讀取的個(gè)數(shù)的字節(jié)。比如第一個(gè)方法,程序員往往希望程序能讀取到b.length個(gè)字節(jié),而實(shí)際情況是,系統(tǒng)往往讀取不了這么多。仔細(xì)閱讀Java的API說(shuō)明就發(fā)現(xiàn)了,這個(gè)方法 并不保證能讀取這么多個(gè)字節(jié),它只能保證最多讀取這么多個(gè)字節(jié)(最少1個(gè))。因此,如果要讓程序讀取count個(gè)字節(jié),最好用以下代碼:

 byte[] b = new byte[count];
 int readCount = 0; // 已經(jīng)成功讀取的字節(jié)的個(gè)數(shù)
 while (readCount < count) {
  readCount += in.read(bytes, readCount, count - readCount);
 }

      用這段代碼可以保證讀取count個(gè)字節(jié),除非中途遇到IO異常或者到了數(shù)據(jù)流的結(jié)尾(EOFException)

4.讀取PowerPoint文件的例子

import java.io.InputStream; 
 
import org.apache.lucene.document.Document; 
import org.apache.poi.hslf.HSLFSlideShow; 
import org.apache.poi.hslf.model.TextRun; 
import org.apache.poi.hslf.model.Slide; 
import org.apache.poi.hslf.usermodel.SlideShow; 
 
public Document getDocument(Index index, String url, String title, InputStream is) 
throws DocCenterException { 
 StringBuffer content = new StringBuffer(""); 
 try{ 
  SlideShow ss = new SlideShow(new HSLFSlideShow(is));//is 為文件的InputStream,建立SlideShow 
  Slide[] slides = ss.getSlides();//獲得每一張幻燈片 
  for(int i=0;i<slides.length;i++){ 
  TextRun[] t = slides[i].getTextRuns();//為了取得幻燈片的文字內(nèi)容,建立TextRun 
  for(int j=0;j<t.length;j++){ 
   content.append(t[j].getText());//這里會(huì)將文字內(nèi)容加到content中去 
  } 
  content.append(slides[i].getTitle()); 
  } 
  index.AddIndex(url, title, content.toString()); 
 }catch(Exception ex){ 
  System.out.println(ex.toString()); 
 } 
 return null; 
} 

相關(guān)文章

最新評(píng)論