如何把檔案輸出流替換成位元組輸出流
1、比如要輸出一個zip,zip可以放進FileOutputStream,也可以放進ByteArrayOutputStream裡;
2、輸出流轉換成輸入流
byte[] content = fileOut.toByteArray();
ByteArrayInputStream is = new ByteArrayInputStream(content);
BufferedInputStream in = new BufferedInputStream(is);
比較下面的兩段程式碼,就可以發現規律:
/**
* 測試 檔案輸出流
* @throws IOException
*/
@Test
public void testZip() throws IOException {
// copy檔案到zip輸出流中
byte[] buf = new byte[1024];
int cnt = 1,len;
FileOutputStream out = new FileOutputStream("D:\\test_zip.zip");
ZipOutputStream zos = new ZipOutputStream(out);
// 1、讀取模板--模板圖在下面,可以自己畫一個
FileInputStream fileIn = new FileInputStream("D:\\test.xls");
// 獲取excel物件
HSSFWorkbook wb = new HSSFWorkbook(fileIn);
// 讀取第一個sheet頁
HSSFSheet sheet = wb.getSheetAt(0);
// 模擬迴圈10次,壓縮10個excel到壓縮包裡面
for (int i = 0; i < 10; i++) {
// 2、填寫資料
// 獲取第1行,第1列的單元格,然後填寫資料
// 一個excel有多個sheet
// 一個sheet有多個row
// 一個row有多個cell
// HSSFRow row = sheet.getRow(0);
// HSSFCell cell = row.getCell(0);
// cell.setCellValue("【2020】年【"+(cnt)+"】月");
// 下面這一行與上面三行等價
sheet.getRow(0).getCell(0).setCellValue( "【2020】年【"+(cnt)+"】月" );
// 3、儲存到輸出流
ByteArrayOutputStream fileOut = new ByteArrayOutputStream();
wb.write(fileOut);
// 4、輸出流轉換成輸入流
byte[] content = fileOut.toByteArray();
ByteArrayInputStream is = new ByteArrayInputStream(content);
BufferedInputStream in = new BufferedInputStream(is);
// 5、放到壓縮流--填寫待檔案的名稱
zos.putNextEntry(new ZipEntry("test-wdq"+(cnt++)+".xls"));
while ((len = in.read(buf)) != -1) {
zos.write(buf, 0, len);
}
// 關閉流的順序不能變,遵從"先開後關"的原則
// 關閉流的順序不對,會導致壓縮包的檔案損壞
zos.flush();
fileOut.close();
zos.closeEntry();
}
// 關閉流的順序不能變,遵從"先開後關"的原則
wb.close();
zos.close();
out.close();
}
/**
* 測試輸出流
* @throws IOException
*/
@Test
public void testStream() throws IOException {
// copy檔案到zip輸出流中
int len;
byte[] buf = new byte[1024];
int cnt = 1;
ByteArrayOutputStream out = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(out);
// 1、讀取模板
FileInputStream fileIn = new FileInputStream("D:\\test.xls");
HSSFWorkbook wb = new HSSFWorkbook(fileIn);
HSSFSheet sheet = wb.getSheetAt(0);
//迴圈
for (int i = 0; i < 10; i++) {
// 2、填寫資料
sheet.createRow(0).createCell(0).setCellValue( "【2020】年【"+(cnt)+"】月服務支撐結算單" );
// 3、儲存到輸出流
ByteArrayOutputStream fileOut = new ByteArrayOutputStream();
wb.write(fileOut);
// 4、輸出流轉換成輸入流
byte[] content = fileOut.toByteArray();
ByteArrayInputStream is = new ByteArrayInputStream(content);
BufferedInputStream in = new BufferedInputStream(is);
// 5、放到壓縮流--填寫待檔案的名稱
zos.putNextEntry(new ZipEntry("test-wdq"+(cnt++)+".xls"));
while ((len = in.read(buf)) != -1) {
zos.write(buf, 0, len);
}
// 關閉各種流
zos.flush();
fileOut.close();
zos.closeEntry();
}
wb.close();
zos.close();
out.close();
// 將壓縮輸出流轉換成輸入流
byte[] content = out.toByteArray();
ByteArrayInputStream is = new ByteArrayInputStream(content);
BufferedInputStream in = new BufferedInputStream(is);
}
相關文章
- 檔案輸入輸出處理(二)-位元組流
- IO流的位元組輸入輸出流(InputStream,OutputStream)
- 標準的位元組輸出流 & 如何用它寫一篇日誌檔案
- C++ 中輸入輸出流及檔案流操作筆記C++筆記
- 輸入輸出流
- C++中的檔案輸入/輸出(3):掌握輸入/輸出流 (轉)C++
- Java 輸入輸出流Java
- JAVA輸入輸出流Java
- Java&Android 基礎知識梳理(6) 位元組輸入輸出流JavaAndroid
- JavaIO流(一)-位元組輸入流與字元輸入流JavaAI字元
- 資料流輸出
- Java緩衝輸出位元組流BufferedOutputStreamJava
- 字元輸出流_Writer類&FileWriter類介紹和字元輸出流的基本使用_寫出單個字元到檔案字元
- hexdump如何按照單位元組格式輸出
- outputStream(輸出流)轉inputstream(輸入流)以及輸入流如何複用
- 第九章:輸入/輸出流與檔案操作 習題
- c++入門:輸入輸出流C++
- [C++]輸入/輸出流類庫C++
- 【Java基礎知識】IO流--標準輸入輸出流、列印流PrintStreamJava
- [java IO流]之 萬能輸出流列印流printWriterJava
- [java IO流]之 基本資料型別輸入輸出流Java資料型別
- 重學java中的輸入輸出流Java
- [java IO流]之 鍵盤顯示器輸入輸出流(System)Java
- 詳解Java中的IO輸入輸出流!Java
- Java中資料輸入輸出流——DataInputStream和DataOutputStreamJavaAI
- java中基本輸入輸出流的解釋Java
- 023--C++養成之路(io流:流的初始化以及基本的輸入輸出)C++
- [譯] 用 Flask 輸出視訊流Flask
- 29.企業級開發進階1:檔案輸入輸出流[IO操作]
- 排序,檔案輸入輸出排序
- 檔案操作-輸入輸出
- int型別按位元組列印輸出型別
- 位元組流
- 如何讓sqlplus spool輸出的檔案成excel檔案SQLExcel
- C輸入輸出與檔案
- js 匯出檔案流JS
- 02-Tcl輸出、賦值與替換賦值
- java 位元組流檔案複製方法總結Java