解析Java的InputStream類并借助其讀取ppt文件
1. 關(guān)于InputStream.read()
在從數(shù)據(jù)流里讀取數(shù)據(jù)時,為圖簡單,經(jīng)常用InputStream.read()方法。這個方法是從流里每次只讀取讀取一個字節(jié),效率會非常低。 更好的方法是用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,一次讀取多個字節(jié)。
2. 關(guān)于InputStream類的available()方法
要一次讀取多個字節(jié)時,經(jīng)常用到InputStream.available()方法,這個方法可以在讀寫操作前先得知數(shù)據(jù)流里有多少個字節(jié)可以讀取。需要注意的是,如果這個方法用在從本
地文件讀取數(shù)據(jù)時,一般不會遇到問題,但如果是用于網(wǎng)絡(luò)操作,就經(jīng)常會遇到一些麻煩。比如,Socket通訊時,對方明明發(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()方法有時得到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ò)操作時往往出錯,因?yàn)槟阏{(diào)用available()方法時,對發(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)文章
SpringBoot集成I18n國際化文件在jar包外生效問題
這篇文章主要介紹了SpringBoot集成I18n國際化文件在jar包外生效問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04
java synchronized加載加鎖-線程可重入詳解及實(shí)例代碼
這篇文章主要介紹了java synchronized加載加鎖-線程可重入詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02
完美解決java.lang.OutOfMemoryError處理錯誤的問題
下面小編就為大家?guī)硪黄昝澜鉀Qjava.lang.OutOfMemoryError處理錯誤的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01
老生常談Java?網(wǎng)絡(luò)編程?——?Socket?詳解
這篇文章主要介紹了Java?網(wǎng)絡(luò)編程?——?Socket?相關(guān)知識,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05
Java輕松掌握面向?qū)ο蟮娜筇匦苑庋b與繼承和多態(tài)
本文主要講述的是面向?qū)ο蟮娜筇匦裕悍庋b,繼承,多態(tài),內(nèi)容含括從封裝到繼承再到多態(tài)的所有重點(diǎn)內(nèi)容以及使用細(xì)節(jié)和注意事項(xiàng),內(nèi)容有點(diǎn)長,請大家耐心看完2022-05-05
java WebSocket實(shí)現(xiàn)聊天消息推送功能
這篇文章主要為大家詳細(xì)介紹了java WebSocket實(shí)現(xiàn)聊天消息推送功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07
Spring MVC的項(xiàng)目準(zhǔn)備和連接建立方法
SpringWebMVC是基于Servlet API的Web框架,屬于Spring框架的一部分,主要用于簡化Web應(yīng)用程序的開發(fā),SpringMVC通過控制器接收請求,使用模型處理數(shù)據(jù),并通過視圖展示結(jié)果,感興趣的朋友跟隨小編一起看看吧2024-10-10
解決spring-boot2.0.6中webflux無法獲得請求IP的問題
這幾天在用 spring-boot 2 的 webflux 重構(gòu)一個工程,寫到了一個需要獲得客戶端請求 IP 的地方,在寫的過程中遇到很多問題,下面小編通過一段代碼給大家介紹解決spring-boot2.0.6中webflux無法獲得請求IP的問題,感興趣的朋友跟隨小編一起看看吧2018-10-10

