如何把檔案輸出流替換成位元組輸出流
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)
- 標準的位元組輸出流 & 如何用它寫一篇日誌檔案
- 輸入輸出流
- Java 輸入輸出流Java
- JavaIO流(一)-位元組輸入流與字元輸入流JavaAI字元
- 資料流輸出
- 字元輸出流_Writer類&FileWriter類介紹和字元輸出流的基本使用_寫出單個字元到檔案字元
- 第九章:輸入/輸出流與檔案操作 習題
- Java緩衝輸出位元組流BufferedOutputStreamJava
- outputStream(輸出流)轉inputstream(輸入流)以及輸入流如何複用
- hexdump如何按照單位元組格式輸出
- [java IO流]之 基本資料型別輸入輸出流Java資料型別
- [java IO流]之 萬能輸出流列印流printWriterJava
- 023--C++養成之路(io流:流的初始化以及基本的輸入輸出)C++
- 重學java中的輸入輸出流Java
- [java IO流]之 鍵盤顯示器輸入輸出流(System)Java
- 排序,檔案輸入輸出排序
- 詳解Java中的IO輸入輸出流!Java
- [譯] 用 Flask 輸出視訊流Flask
- int型別按位元組列印輸出型別
- 02-Tcl輸出、賦值與替換賦值
- js 匯出檔案流JS
- Flink 的側輸出流,怎麼玩?
- python:檔案的輸入與輸出Python
- 把Oracle的命令輸出傳送到檔案的命令Oracle
- JDK 18 及以上使用標準輸出流中文輸出亂碼問題JDK
- 執行緒間的協作(3)——管道輸入/輸出流執行緒
- 位元組流
- 轉載:字元輸出流Writer簡要概括字元
- java 位元組流檔案複製方法總結Java
- python輸出如何不換行?Python
- python輸出時如何換行Python
- MySQL輸出html格式檔案MySqlHTML
- 第10章 對檔案的輸入輸出
- Java位元組流檔案複製及效率比較Java
- 瞭解下C# 檔案的輸入與輸出C#
- matlab輸出複數到檔案Matlab