如何把檔案輸出流替換成位元組輸出流

imagination_wdq發表於2020-11-24

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);
    }

 

相關文章