您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關java 中如何使用 PipedInputStream管道流,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
public static void main(String[] args) { try (PipedOutputStream out = new PipedOutputStream(); PipedInputStream in = new PipedInputStream(out)) { new Thread(() -> { try { out.write("hello kl".getBytes(StandardCharsets.UTF_8)); out.close(); } catch (IOException e) { e.printStackTrace(); } }).start(); int receive; while ((receive = in.read()) != -1) { System.err.print((char) receive); } } catch (IOException e) { e.printStackTrace(); } }
上面代碼演示了,在一個線程里寫數據,然后在 main
線程讀數據的場景,完成了跨線程的數據傳輸。寫到這里,都挺干巴巴的,很多人看了后肯定也不知道它到底能干啥,有啥作用,繼續往下看。
簡單的理解了原理后,寫了一個簡單的演示 demo,但是 demo 不能說明啥問題,那從一個線程傳輸字節到另一個線程到底有啥用呢?博主,簡單的的總結下:通過 java 應用生成文件,然后需要將文件上傳到云端的場景,都可以用管道流。相同的業務場景,在沒了解管道流之前,都是先將文件寫入到本地磁盤,然后從文件磁盤讀出來上傳到云盤。了解這個后,可以腦補出很多的業務場景了(真實業務場景,都是博主遇到過的),比如:
之前有一個文件導出的功能,但是因為,導出的文件比較大,導出下載完的時間非常長,所以,設計成了,頁面點擊導出后,后臺觸發導出任務,然后將mysql
中的數據根據導出條件查詢出來,生成 Excel文件,然后將文件上傳到 oss
,最后像觸發導出任務的人的釘釘發一個下載文件的鏈接。之前的做法,正如上面所言,先將文件寫到本地,然后從本地目錄讀出來上傳到 oss
,下面演示下管道流一步到位的方式:
public static void main(String[] args) { try (PipedOutputStream out = new PipedOutputStream(); PipedInputStream in = new PipedInputStream(out)) { new Thread(() -> { List<String> database = new LinkedList<>(); try { //文件生成 ExcelUtils.getInstance().exportObjects2Excel(database,out); } catch (IOException e) { e.printStackTrace(); } }).start(); //文件上傳 ossClient.putObject("test","test.xlsx",in); } catch (IOException e) { e.printStackTrace(); } }
此類需求常見于和銀行以及金融機構對接時,要求上報一些 xml 格式的數據,給到指定的 ftp、或是 oss 的某個目錄下,用于對賬。其實從文件上傳的場景來說,和上面的案例一是一樣。也是我總結的那樣,在內存里生成文件,然后上傳到云端,偽代碼如下:
public static void main(String[] args) { try (PipedOutputStream out = new PipedOutputStream(); PipedInputStream in = new PipedInputStream(out)) { new Thread(() -> { List<String> database = new LinkedList<>(); try(GZIPOutputStream gzipOut = new GZIPOutputStream(out)) { Marshaller marshaller = JAXBContext.newInstance(Object.class).createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshaller.marshal(database,gzipOut); } catch (IOException | JAXBException e) { e.printStackTrace(); } }).start(); //文件上傳 ossClient.putObject("test","test.xml.gz",in); } catch (IOException e) { e.printStackTrace(); } }
以上就是java 中如何使用 PipedInputStream管道流,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。