java中如何使用PipedInputStream管道流

本篇文章给大家分享的是有关java 中如何使用 PipedInputStream管道流,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

成都创新互联是专业的苍溪网站建设公司,苍溪接单;提供成都网站建设、网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行苍溪网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

使用场景概述

    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 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 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管道流,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。


文章标题:java中如何使用PipedInputStream管道流
链接分享:http://myzitong.com/article/johsod.html