本篇文章给大家分享的是有关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 应用生成文件,然后需要将文件上传到云端的场景,都可以用管道流。相同的业务场景,在没了解管道流之前,都是先将文件写入到本地磁盘,然后从文件磁盘读出来上传到云盘。了解这个后,可以脑补出很多的业务场景了(真实业务场景,都是博主遇到过的),比如:
之前有一个文件导出的功能,但是因为,导出的文件比较大,导出下载完的时间非常长,所以,设计成了,页面点击导出后,后台触发导出任务,然后将MySQL
中的数据根据导出条件查询出来,生成 Excel文件,然后将文件上传到 oss
,最后像触发导出任务的人的钉钉发一个下载文件的链接。之前的做法,正如上面所言,先将文件写到本地,然后从本地目录读出来上传到 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(); } }
此类需求常见于和银行以及金融机构对接时,要求上报一些 xml 格式的数据,给到指定的 ftp、或是 oss 的某个目录下,用于对账。其实从文件上传的场景来说,和上面的案例一是一样。也是我总结的那样,在内存里生成文件,然后上传到云端,伪代码如下:
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管道流,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。