真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java中如何使用PipedInputStream管道流

本篇文章給大家分享的是有關(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ù)往下看。

實際應(yīng)用

簡單的理解了原理后,寫了一個簡單的演示 demo,但是 demo 不能說明啥問題,那從一個線程傳輸字節(jié)到另一個線程到底有啥用呢?博主,簡單的的總結(jié)下:通過 java 應(yīng)用生成文件,然后需要將文件上傳到云端的場景,都可以用管道流。相同的業(yè)務(wù)場景,在沒了解管道流之前,都是先將文件寫入到本地磁盤,然后從文件磁盤讀出來上傳到云盤。了解這個后,可以腦補出很多的業(yè)務(wù)場景了(真實業(yè)務(wù)場景,都是博主遇到過的),比如:

案例一:Excel 文件導(dǎo)出功能

之前有一個文件導(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(() -> {
                List 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 文件數(shù)據(jù)傳輸

此類需求常見于和銀行以及金融機構(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(() -> {
                List 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管道流,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


當前文章:java中如何使用PipedInputStream管道流
網(wǎng)址分享:http://weahome.cn/article/johsod.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部