使用ByteArrayOutputStream實現將數據寫入本地文件

ByteArrayOutputStream將數據寫入本地文件

在一個項目中做一次性校驗部分,需要將校驗後數據寫入表格後上傳。巧的是,服務器Down瞭。作為一個新手實習生菜鳥,為瞭測試自己的代碼和輸出結果有沒有毛病,在大神同事的指點下選擇瞭先將表格輸出到本地

於是在百度瘋狂搜索“輸出流”、“輸出文件到本地”、“文件流”等,經過多方搜集和探查以及加工,最後加上瞭一小段代碼

//測試-將表格導入本地文件
        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的方法註掉,以在準備好的文件 C:\\Users\\Administrator.DESKTOP-SFAEOA8\\Desktop\\consistencyCheckCommodityRuleTemplate.xlsx 中輸出需要的結果

public void uploadExcel() {
 
        //獲取校驗數據
        List<DTO> consistencyCheck = getConsistencyCheck();
 
        //創建模板信息
        DataModel dataModel = setDataModel();
        ......(此處省略一萬字)
 
        //創建ExcelData
        ExcelData excelData = setExcelData();
        ......(此處也省略一萬字)
 
        //創建日志數據
        ConsistencyCheckLog consistencyCheckLog = setConsistencyCheckLog();
        ......(此處又省略一萬字)
 
        //創建excel
        ByteArrayOutputStream  byteArrayOutputStream = createExcel(dataModel, excelData);
 
        //測試-將表格導入本地文件
        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(無法上傳 先註掉好瞭)
        //uploadFileToDfs(consistencyCheckLog, byteArrayOutputStream);
    }

這樣就OK瞭,隻添加瞭測試的部分,得到數據後也是放下瞭這顆菜心

那來瞭解一下ByteArrayOutPutStream吧

  • ByteArrayOutputStream類是在創建它的實例時,程序內部創建一個byte型別數組的緩沖區,然後利ByteArrayOutputStream和ByteArrayInputStream的實例向數組中寫入或讀出byte型數據
  • 字節數組輸出流在內存中創建一個字節數組緩沖區,所有發送到輸出流的數據保存在該字節數組緩沖區
  • 成功創建字節數組輸出流對象後,可以參見以下列表中的方法,對流進行寫操作或其他操作
序號 方法描述
1 public void reset() 將此字節數組輸出流的 count 字段重置為零,從而丟棄輸出流中目前已累積的所有數據輸出。
2 public byte[] toByteArray() 創建一個新分配的字節數組。數組的大小和當前輸出流的大小,內容是當前輸出流的拷貝。
3 public String toString() 將緩沖區的內容轉換為字符串,根據平臺的默認字符編碼將字節轉換成字符。
4 public void write(int w) 將指定的字節寫入此字節數組輸出流。
5 public void write(byte []b, int off, int len) 將指定字節數組中從偏移量 off 開始的 len 個字節寫入此字節數組輸出流。
6 public void writeTo(OutputStream outSt) 將此字節數組輸出流的全部內容寫入到指定的輸出流參數中。

在表格輸出時

Java輸出流FileOutputStream也發揮瞭至關重要的作用

使用FileOutputStream寫入文件的過程同使用FileInputStream過程相同,都是先用File類打開本地文件,實例化輸入輸出流,然後調用流的讀寫方法讀取或寫入數據,最後關閉流。

FileOutputStream的寫入方法

FileOutputStream類提供瞭多種文件寫入方法,可以單獨寫一個字節到文件,也可以寫一個byte數組到文件,也可以取byte數組的部分數據寫入到文件。

把讀取的結果寫入到ByteArrayOutputStream

  • FileOutputStream 可以把數據寫到文件中去
  • ByteArrayOutputStream 可以把其他地方的讀入的數據寫到這裡面,最後獲取數據所有的 byte[],相當於可以把數據全部讀到內存中來.
 // 把讀取的結果寫入到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];
  //先讀後寫,循環讀寫
  while ((len = stream.read(buffer)) != -1) {
   stream2.write(buffer, 0, len);
  }
  byte[] data = stream2.toByteArray();
  System.out.println(new String(data));
 }

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: