本篇文章給大家分享的是有關(guān)java 中如何使用 PipedInputStream管道流,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
成都創(chuàng)新互聯(lián)是專業(yè)的蒼溪網(wǎng)站建設(shè)公司,蒼溪接單;提供成都網(wǎng)站建設(shè)、網(wǎng)站制作,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行蒼溪網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
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(); } }
上面代碼演示了,在一個線程里寫數(shù)據(jù),然后在 main
線程讀數(shù)據(jù)的場景,完成了跨線程的數(shù)據(jù)傳輸。寫到這里,都挺干巴巴的,很多人看了后肯定也不知道它到底能干啥,有啥作用,繼續(xù)往下看。
簡單的理解了原理后,寫了一個簡單的演示 demo,但是 demo 不能說明啥問題,那從一個線程傳輸字節(jié)到另一個線程到底有啥用呢?博主,簡單的的總結(jié)下:通過 java 應(yīng)用生成文件,然后需要將文件上傳到云端的場景,都可以用管道流。相同的業(yè)務(wù)場景,在沒了解管道流之前,都是先將文件寫入到本地磁盤,然后從文件磁盤讀出來上傳到云盤。了解這個后,可以腦補出很多的業(yè)務(wù)場景了(真實業(yè)務(wù)場景,都是博主遇到過的),比如:
之前有一個文件導(dǎo)出的功能,但是因為,導(dǎo)出的文件比較大,導(dǎo)出下載完的時間非常長,所以,設(shè)計成了,頁面點擊導(dǎo)出后,后臺觸發(fā)導(dǎo)出任務(wù),然后將MySQL
中的數(shù)據(jù)根據(jù)導(dǎo)出條件查詢出來,生成 Excel文件,然后將文件上傳到 oss
,最后像觸發(fā)導(dǎo)出任務(wù)的人的釘釘發(fā)一個下載文件的鏈接。之前的做法,正如上面所言,先將文件寫到本地,然后從本地目錄讀出來上傳到 oss
,下面演示下管道流一步到位的方式:
public static void main(String[] args) { try (PipedOutputStream out = new PipedOutputStream(); PipedInputStream in = new PipedInputStream(out)) { new Thread(() -> { Listdatabase = 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(); } }
此類需求常見于和銀行以及金融機構(gòu)對接時,要求上報一些 xml 格式的數(shù)據(jù),給到指定的 ftp、或是 oss 的某個目錄下,用于對賬。其實從文件上傳的場景來說,和上面的案例一是一樣。也是我總結(jié)的那樣,在內(nèi)存里生成文件,然后上傳到云端,偽代碼如下:
public static void main(String[] args) { try (PipedOutputStream out = new PipedOutputStream(); PipedInputStream in = new PipedInputStream(out)) { new Thread(() -> { Listdatabase = 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管道流,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。