亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java 中如何使用 PipedInputStream管道流

發布時間:2021-06-30 18:01:42 來源:億速云 閱讀:684 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關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 應用生成文件,然后需要將文件上傳到云端的場景,都可以用管道流。相同的業務場景,在沒了解管道流之前,都是先將文件寫入到本地磁盤,然后從文件磁盤讀出來上傳到云盤。了解這個后,可以腦補出很多的業務場景了(真實業務場景,都是博主遇到過的),比如:

案例一:Excel 文件導出功能

之前有一個文件導出的功能,但是因為,導出的文件比較大,導出下載完的時間非常長,所以,設計成了,頁面點擊導出后,后臺觸發導出任務,然后將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 文件數據傳輸

此類需求常見于和銀行以及金融機構對接時,要求上報一些 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管道流,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

小金县| 增城市| 万全县| 金阳县| 嘉鱼县| 柯坪县| 林芝县| 青海省| 陇西县| 克东县| 孝感市| 报价| 麻栗坡县| 金湖县| 佛冈县| 晋州市| 仪征市| 广宁县| 惠水县| 景谷| 湾仔区| 句容市| 襄垣县| 柳河县| 焦作市| 酒泉市| 广丰县| 楚雄市| 洛扎县| 花垣县| 崇礼县| 渝北区| 贞丰县| 鹤峰县| 旌德县| 彭州市| 临漳县| 巧家县| 黑水县| 巨鹿县| 洛阳市|