使用ByteArrayOutputStream實(shí)現(xiàn)將數(shù)據(jù)寫(xiě)入本地文件
ByteArrayOutputStream將數(shù)據(jù)寫(xiě)入本地文件
在一個(gè)項(xiàng)目中做一次性校驗(yàn)部分,需要將校驗(yàn)后數(shù)據(jù)寫(xiě)入表格后上傳。巧的是,服務(wù)器Down了。作為一個(gè)新手實(shí)習(xí)生菜鳥(niǎo),為了測(cè)試自己的代碼和輸出結(jié)果有沒(méi)有毛病,在大神同事的指點(diǎn)下選擇了先將表格輸出到本地
于是在百度瘋狂搜索“輸出流”、“輸出文件到本地”、“文件流”等,經(jīng)過(guò)多方搜集和探查以及加工,最后加上了一小段代碼
//測(cè)試-將表格導(dǎo)入本地文件
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream("C:\\Users\\Administrator.DESKTOP-SFAEOA8\\Desktop\\consistencyCheckCommodityRuleTemplate.xlsx");
fileOutputStream.write(byteArrayOutputStream.toByteArray());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
以下是上傳Excel的部分代碼。將最后的上傳文件到dfs的方法注掉,以在準(zhǔn)備好的文件 C:\\Users\\Administrator.DESKTOP-SFAEOA8\\Desktop\\consistencyCheckCommodityRuleTemplate.xlsx 中輸出需要的結(jié)果
public void uploadExcel() {
//獲取校驗(yàn)數(shù)據(jù)
List<DTO> consistencyCheck = getConsistencyCheck();
//創(chuàng)建模板信息
DataModel dataModel = setDataModel();
......(此處省略一萬(wàn)字)
//創(chuàng)建ExcelData
ExcelData excelData = setExcelData();
......(此處也省略一萬(wàn)字)
//創(chuàng)建日志數(shù)據(jù)
ConsistencyCheckLog consistencyCheckLog = setConsistencyCheckLog();
......(此處又省略一萬(wàn)字)
//創(chuàng)建excel
ByteArrayOutputStream byteArrayOutputStream = createExcel(dataModel, excelData);
//測(cè)試-將表格導(dǎo)入本地文件
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream("C:\\Users\\Administrator.DESKTOP-SFAEOA8\\Desktop\\consistencyCheckCommodityRuleTemplate.xlsx");
fileOutputStream.write(byteArrayOutputStream.toByteArray());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//上傳excel(無(wú)法上傳 先注掉好了)
//uploadFileToDfs(consistencyCheckLog, byteArrayOutputStream);
}
這樣就OK了,只添加了測(cè)試的部分,得到數(shù)據(jù)后也是放下了這顆菜心
那來(lái)了解一下ByteArrayOutPutStream吧
- ByteArrayOutputStream類(lèi)是在創(chuàng)建它的實(shí)例時(shí),程序內(nèi)部創(chuàng)建一個(gè)byte型別數(shù)組的緩沖區(qū),然后利ByteArrayOutputStream和ByteArrayInputStream的實(shí)例向數(shù)組中寫(xiě)入或讀出byte型數(shù)據(jù)
- 字節(jié)數(shù)組輸出流在內(nèi)存中創(chuàng)建一個(gè)字節(jié)數(shù)組緩沖區(qū),所有發(fā)送到輸出流的數(shù)據(jù)保存在該字節(jié)數(shù)組緩沖區(qū)
- 成功創(chuàng)建字節(jié)數(shù)組輸出流對(duì)象后,可以參見(jiàn)以下列表中的方法,對(duì)流進(jìn)行寫(xiě)操作或其他操作
| 序號(hào) | 方法描述 |
|---|---|
| 1 | public void reset() 將此字節(jié)數(shù)組輸出流的 count 字段重置為零,從而丟棄輸出流中目前已累積的所有數(shù)據(jù)輸出。 |
| 2 | public byte[] toByteArray() 創(chuàng)建一個(gè)新分配的字節(jié)數(shù)組。數(shù)組的大小和當(dāng)前輸出流的大小,內(nèi)容是當(dāng)前輸出流的拷貝。 |
| 3 | public String toString() 將緩沖區(qū)的內(nèi)容轉(zhuǎn)換為字符串,根據(jù)平臺(tái)的默認(rèn)字符編碼將字節(jié)轉(zhuǎn)換成字符。 |
| 4 | public void write(int w) 將指定的字節(jié)寫(xiě)入此字節(jié)數(shù)組輸出流。 |
| 5 | public void write(byte []b, int off, int len) 將指定字節(jié)數(shù)組中從偏移量 off 開(kāi)始的 len 個(gè)字節(jié)寫(xiě)入此字節(jié)數(shù)組輸出流。 |
| 6 | public void writeTo(OutputStream outSt) 將此字節(jié)數(shù)組輸出流的全部?jī)?nèi)容寫(xiě)入到指定的輸出流參數(shù)中。 |
在表格輸出時(shí)
Java輸出流FileOutputStream也發(fā)揮了至關(guān)重要的作用
使用FileOutputStream寫(xiě)入文件的過(guò)程同使用FileInputStream過(guò)程相同,都是先用File類(lèi)打開(kāi)本地文件,實(shí)例化輸入輸出流,然后調(diào)用流的讀寫(xiě)方法讀取或?qū)懭霐?shù)據(jù),最后關(guān)閉流。
FileOutputStream的寫(xiě)入方法
FileOutputStream類(lèi)提供了多種文件寫(xiě)入方法,可以單獨(dú)寫(xiě)一個(gè)字節(jié)到文件,也可以寫(xiě)一個(gè)byte數(shù)組到文件,也可以取byte數(shù)組的部分?jǐn)?shù)據(jù)寫(xiě)入到文件。
把讀取的結(jié)果寫(xiě)入到ByteArrayOutputStream
FileOutputStream可以把數(shù)據(jù)寫(xiě)到文件中去ByteArrayOutputStream可以把其他地方的讀入的數(shù)據(jù)寫(xiě)到這里面,最后獲取數(shù)據(jù)所有的 byte[],相當(dāng)于可以把數(shù)據(jù)全部讀到內(nèi)存中來(lái).
// 把讀取的結(jié)果寫(xiě)入到ByteByteArrayOutputStream
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String s = "C:\\a.txt";
int len = 0;
FileInputStream stream = new FileInputStream(s);
ByteArrayOutputStream stream2 = new ByteArrayOutputStream();
byte[] buffer = new byte[5];
//先讀后寫(xiě),循環(huán)讀寫(xiě)
while ((len = stream.read(buffer)) != -1) {
stream2.write(buffer, 0, len);
}
byte[] data = stream2.toByteArray();
System.out.println(new String(data));
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
在IntelliJ IDEA中創(chuàng)建和運(yùn)行java/scala/spark程序的方法
這篇文章主要介紹了在IntelliJ IDEA中創(chuàng)建和運(yùn)行java/scala/spark程序的教程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
hutool實(shí)戰(zhàn):IoUtil 流操作工具類(lèi)(將內(nèi)容寫(xiě)到流中)
這篇文章主要介紹了Go語(yǔ)言的io.ioutil標(biāo)準(zhǔn)庫(kù)使用,是Golang入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下,如果能給你帶來(lái)幫助,請(qǐng)多多關(guān)注腳本之家的其他內(nèi)容2021-06-06
Java通過(guò)jersey實(shí)現(xiàn)客戶(hù)端圖片上傳示例
本篇文章主要介紹了Java通過(guò)jersey實(shí)現(xiàn)客戶(hù)端圖片上傳示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03
Java stringBuilder的使用方法及實(shí)例解析
這篇文章主要介紹了Java stringBuilder的使用方法及實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(3)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-07-07
Java 大小寫(xiě)最快轉(zhuǎn)換方式實(shí)例代碼
這篇文章主要介紹了Java 大小寫(xiě)最快轉(zhuǎn)換方式實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-07-07
Java中的Gradle與Groovy的區(qū)別及存在的關(guān)系
這篇文章主要介紹了Java中的Gradle與Groovy的區(qū)別及存在的關(guān)系,Groovy是一種JVM語(yǔ)言,它可以編譯為與Java相同的字節(jié)碼,并且可以與Java類(lèi)無(wú)縫地互操作,Gradle是Java項(xiàng)目中主要的構(gòu)建系統(tǒng)之一,下文關(guān)于兩者的詳細(xì)內(nèi)容,需要的小伙伴可以參考一下2022-02-02

