Java 將文件轉(zhuǎn)為字節(jié)數(shù)組知識(shí)總結(jié)及實(shí)例詳解
Java將文件轉(zhuǎn)為字節(jié)數(shù)組
關(guān)鍵字:文件,文件流,字節(jié)流,字節(jié)數(shù)組,二進(jìn)制
摘要:最近工作中碰到的需求是,利用http傳輸二進(jìn)制數(shù)據(jù)到服務(wù)器對(duì)應(yīng)接口,需要傳輸userId, file(加密后)等一系列混合后的二進(jìn)制數(shù)據(jù)。本文旨在記錄自己在使用Java將文件轉(zhuǎn)為字節(jié)數(shù)組的一些知識(shí)理解與匯總。
FileInputStream
利用FileInputStream讀取文件
FileInputStream是InputStream的子類(lèi),用于從文件中讀取信息,構(gòu)造器接收一個(gè)File類(lèi)型或表示文件路徑的String類(lèi)型。
File file = new File("filePath"); FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream
利用ByteArrayOutputStream將FileInputStream中的文件數(shù)據(jù)讀出來(lái)
ByteArrayOutputStream是用來(lái)在內(nèi)存中創(chuàng)建緩沖區(qū),所有送往“流”的數(shù)據(jù)都要放置在此緩沖區(qū)中。
ByteArrayOutputStream bos = new ByteArrayOutputStream(fis); byte[] b = new byte[1024]; int len = -1; while((len = fis.read(b)) != -1) { bos.write(b, 0, len); }
注意:ByteArrayOutputStream的write方法有三種重載形式:
write(int b)
寫(xiě)入指定字節(jié)
write(byte[] b)
寫(xiě)入整個(gè)字節(jié)數(shù)組b
write(byte[] b, int off, int len)
寫(xiě)入字節(jié)數(shù)組b,從b的第off下標(biāo)開(kāi)始,寫(xiě)入len個(gè)字節(jié)。
這里沒(méi)有使用第二中,而是使用了第三種,在代碼中每次獲取讀入緩沖區(qū)b中的數(shù)量,一般為1024(因?yàn)槎xb的時(shí)候顯示指定了長(zhǎng)度),只有當(dāng)讀到結(jié)尾的時(shí)候,可能不夠1024個(gè)字節(jié)了,也會(huì)讀取實(shí)際的讀取字節(jié)數(shù),但是在寫(xiě)入緩沖區(qū)的時(shí)候,如果不指定寫(xiě)入的數(shù)量,即不指定len,那么就會(huì)將整個(gè)b全部寫(xiě)入,即使b中只有一部分內(nèi)容,但是依然會(huì)寫(xiě)入1024個(gè)字節(jié)。這將導(dǎo)致使用toByteArray時(shí),得到的字節(jié)數(shù)組不是實(shí)際長(zhǎng)度!
這樣就將文件流從InputStream中寫(xiě)入了ByteArrayOutputStream中。
利用ByteArrayOutputStream的toByteArray()方法得到文件的字節(jié)數(shù)組。
byte[] fileByte = bos.toByteArray();
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
分布式調(diào)度XXL-Job整合Springboot2.X實(shí)戰(zhàn)操作過(guò)程(推薦)
這篇文章主要介紹了分布式調(diào)度XXL-Job整合Springboot2.X實(shí)戰(zhàn)操作,包括定時(shí)任務(wù)的使用場(chǎng)景和常見(jiàn)的定時(shí)任務(wù),通過(guò)本文學(xué)習(xí)幫助大家該選擇哪個(gè)分布式任務(wù)調(diào)度平臺(tái),對(duì)此文感興趣的朋友一起看看吧2022-04-04spring注入配置文件屬性到j(luò)ava類(lèi)
這篇文章主要為大家介紹了spring注入配置文件屬性到j(luò)ava類(lèi)實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Maven發(fā)布封裝到中央倉(cāng)庫(kù)時(shí)候報(bào)錯(cuò):no default secret key
這篇文章主要介紹了Maven發(fā)布封裝到中央倉(cāng)庫(kù)時(shí)候報(bào)錯(cuò):no default secret key,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12詳解java中動(dòng)態(tài)代理實(shí)現(xiàn)機(jī)制
這篇文章主要為大家介紹了java中動(dòng)態(tài)代理實(shí)現(xiàn)機(jī)制的相關(guān)資料,需要的朋友可以參考下2016-01-01AJAX?SpringBoot?前后端數(shù)據(jù)交互的項(xiàng)目實(shí)現(xiàn)
本文主要介紹了AJAX?SpringBoot?前后端數(shù)據(jù)交互的項(xiàng)目實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Java使用JDK與Cglib動(dòng)態(tài)代理技術(shù)統(tǒng)一管理日志記錄
這篇文章主要介紹了Java使用JDK與Cglib動(dòng)態(tài)代理技術(shù)統(tǒng)一管理日志記錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05