解析Java的InputStream類并借助其讀取ppt文件
1. 關(guān)于InputStream.read()
在從數(shù)據(jù)流里讀取數(shù)據(jù)時(shí),為圖簡單,經(jīng)常用InputStream.read()方法。這個方法是從流里每次只讀取讀取一個字節(jié),效率會非常低。 更好的方法是用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,一次讀取多個字節(jié)。
2. 關(guān)于InputStream類的available()方法
要一次讀取多個字節(jié)時(shí),經(jīng)常用到InputStream.available()方法,這個方法可以在讀寫操作前先得知數(shù)據(jù)流里有多少個字節(jié)可以讀取。需要注意的是,如果這個方法用在從本
地文件讀取數(shù)據(jù)時(shí),一般不會遇到問題,但如果是用于網(wǎng)絡(luò)操作,就經(jīng)常會遇到一些麻煩。比如,Socket通訊時(shí),對方明明發(fā)來了1000個字節(jié),但是自己的程序調(diào)用available()方法卻只得到900,或者100,甚至是0,感覺有點(diǎn)莫名其妙,怎么也找不到原因。其實(shí),這是因?yàn)榫W(wǎng)絡(luò)通訊往往是間斷性的,一串字節(jié)往往分幾批進(jìn)行發(fā)送。本地程序調(diào)用available()方法有時(shí)得到0,這可能是對方還沒有響應(yīng),也可能是對方已經(jīng)響應(yīng)了,但是數(shù)據(jù)還沒有送達(dá)本地。對方發(fā)送了1000個字節(jié)給你,也許分成3批到達(dá),這你就要調(diào)用3次available()方法才能將數(shù)據(jù)總數(shù)全部得到。
如果這樣寫代碼:
int count = in.available(); byte[] b = new byte[count]; in.read(b);
在進(jìn)行網(wǎng)絡(luò)操作時(shí)往往出錯,因?yàn)槟阏{(diào)用available()方法時(shí),對發(fā)發(fā)送的數(shù)據(jù)可能還沒有到達(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)
這兩個方法都是用來從流里讀取多個字節(jié)的,有經(jīng)驗(yàn)的程序員就會發(fā)現(xiàn),這兩個方法經(jīng)常 讀取不到自己想要讀取的個數(shù)的字節(jié)。比如第一個方法,程序員往往希望程序能讀取到b.length個字節(jié),而實(shí)際情況是,系統(tǒng)往往讀取不了這么多。仔細(xì)閱讀Java的API說明就發(fā)現(xiàn)了,這個方法 并不保證能讀取這么多個字節(jié),它只能保證最多讀取這么多個字節(jié)(最少1個)。因此,如果要讓程序讀取count個字節(jié),最好用以下代碼:
byte[] b = new byte[count]; int readCount = 0; // 已經(jīng)成功讀取的字節(jié)的個數(shù) while (readCount < count) { readCount += in.read(bytes, readCount, count - readCount); }
用這段代碼可以保證讀取count個字節(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());//這里會將文字內(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)文章
java底層JDK?Logging日志模塊處理細(xì)節(jié)深入分析
這篇文章主要為大家介紹了java底層JDK?Logging日志模塊處理細(xì)節(jié)深入分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03SpringBoot在 POM 中引入本地 JAR 包的方法
在開發(fā) Spring Boot 應(yīng)用程序時(shí),您可能需要使用本地 JAR 包來添加自定義庫或功能,本文將介紹在 Spring Boot 項(xiàng)目的 POM 文件中如何引入本地 JAR 包,感興趣的朋友跟隨小編一起看看吧2023-08-08Java中的轉(zhuǎn)換流、壓縮流、序列化流、打印流及應(yīng)用場景
這篇文章主要介紹了Java中的轉(zhuǎn)換流、壓縮流、序列化流、打印流及應(yīng)用場景,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06springboot手動動態(tài)注入controller和service方式
這篇文章主要介紹了springboot手動動態(tài)注入controller和service方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03SpringBoot整合mybatis結(jié)合pageHelper插件實(shí)現(xiàn)分頁
在本篇文章里小編給大家整理的是關(guān)于SpringBoot整合mybatis使用pageHelper插件進(jìn)行分頁操作相關(guān)知識點(diǎn),需要的朋友們學(xué)習(xí)下。2020-02-02