解析Java的InputStream類並借助其讀取ppt文件。本站提示廣大學習愛好者:(解析Java的InputStream類並借助其讀取ppt文件)文章只能為提供參考,不一定能成為您想要的結果。以下是解析Java的InputStream類並借助其讀取ppt文件正文
1. 關於InputStream.read()
在從數據流裡讀取數據時,為圖簡略,常常用InputStream.read()辦法。這個辦法是從流裡每次只讀取讀取一個字節,效力會異常低。 更好的辦法是用InputStream.read(byte[] b)或許InputStream.read(byte[] b,int off,int len)辦法,一次讀取多個字節。
2. 關於InputStream類的available()辦法
要一次讀取多個字節時,常常用到InputStream.available()辦法,這個辦法可以在讀寫操作前先得知數據流裡有若干個字節可以讀取。須要留意的是,假如這個辦法用在從本
地文件讀取數據時,普通不會碰到成績,但假如是用於收集操作,就常常會碰到一些費事。好比,Socket通信時,對方明明發來了1000個字節,然則本身的法式挪用available()辦法卻只獲得900,或許100,乃至是0,感到有點莫明其妙,怎樣也找不到緣由。其實,這是由於收集通信常常是連續性的,一串字節常常分幾批停止發送。當地法式挪用available()辦法有時獲得0,這能夠是對方還沒有呼應,也能夠是對方曾經呼應了,然則數據還沒有投遞當地。對方發送了1000個字節給你,或許分紅3批達到,這你就要挪用3次available()辦法能力將數據總數全體獲得。
假如如許寫代碼:
int count = in.available(); byte[] b = new byte[count]; in.read(b);
在停止收集操作時常常失足,由於你挪用available()辦法時,對發發送的數據能夠還沒有達到,你獲得的count是0。
須要改成如許:
int count = 0; while (count == 0) { count = in.available(); } byte[] b = new byte[count]; in.read(b);
3. 關於InputStream.read(byte[] b)和InputStream.read(byte[] b,int off,int len)
這兩個辦法都是用來從流裡讀取多個字節的,有經歷的法式員就會發明,這兩個辦法常常 讀取不到本身想要讀取的個數的字節。好比第一個辦法,法式員常常願望法式能讀取到b.length個字節,而現實情形是,體系常常讀取不了這麼多。細心浏覽Java的API解釋就發明了,這個辦法 其實不包管能讀取這麼多個字節,它只能包管最多讀取這麼多個字節(起碼1個)。是以,假如要讓法式讀取count個字節,最好用以下代碼:
byte[] b = new byte[count]; int readCount = 0; // 曾經勝利讀取的字節的個數 while (readCount < count) { readCount += in.read(bytes, readCount, count - readCount); }
用這段代碼可以包管讀取count個字節,除非半途碰到IO異常或許到了數據流的開頭(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();//為了獲得幻燈片的文字內容,樹立TextRun for(int j=0;j<t.length;j++){ content.append(t[j].getText());//這裡會將文字內容加到content中去 } content.append(slides[i].getTitle()); } index.AddIndex(url, title, content.toString()); }catch(Exception ex){ System.out.println(ex.toString()); } return null; }