ByteArrayOutputStream.toByteArray

ByteArrayInputStream

StringWriter.toString

StringReader

字符流和二进制流是javaIO的两类流,

输入流和输出流是javaIO的两类流

如果你曾经使用过Java IO 编程,很可能会遇到这样一个状况,在一个类中向OutputStream里面写数据,而另一个类则从InputStream中读取这些数据。这时问题就出 现了,“如何才能把OutputStream里的数据转换为InputStream里的数据呢?”。

在Java里,并没有一个OutpStreamToInputStreamConverter 的类。 但庆幸的是还是有几个方法可以办到。

方法1:使用byte数组作为缓存

最简单的方法就是使用byte 数组作为缓存。代码示例如下:

ByteArrayOutputStream out = new ByteArrayOutputStream();

class1.putDataOnOutputStream(out);

class2.processDataFromInputStream(

new ByteArrayInputStream(out.toByteArray())

);

这样就行了,OutputStream已经转换为InputStream。

方法2:使用管道

方法1的问题是你必须有足够大的缓存来保存所有的数据。很可能就需要使用文件系统而不是内存,但是不论哪种方法都对能处理的数据存规模存在严格的限制。解 决的方法是在一个线程中往PipedOutputStream里面写数据,而当前线程则继续读另一个线程输入的数据。

PipedInputStream in = new PipedInputStream();

PipedOUtputStream out = new PipedOutputStream(in);

new Thread(

new Runnable(){

public void run(){

class1.putDataOnOutputStream(out);

}

}

).start();

class2.processDataFromInputStream(in);

方法3:使用循环缓存

方法2里面的两个管道实际上是维护了一个隐藏的循环缓存。所以明确的使用一个循环缓存可以更加简便。循环缓存提供了如下几种好处:

(译者注:JDK中并没有提供这种解决方案,感兴趣的话可以去http://ostermiller.org/utils/ 下载)

一个循环缓存类替代两个管道类

可以很容易的在“缓存所有数据”和“多线程”方法间切换

你可以改变缓存的大小,而不是依赖于管道内硬编码的1k的缓存

多线程使用循环缓存的示例如下:

CircularByteBuffer cbb = new CircularByteBuffer();

new Thread(

new Runnable(){

public void run(){

class1.putDataOnOutputStream(cbb.getOutputStream());

}

}

).start();

class2.processDataFromInputStream(cbb.getInputStream());

单线程循环缓存示例如下:

// buffer all data in a circular buffer of infinite size

CircularByteBuffer cbb = new CircularByteBuffer(CircularByteBuffer.INFINITE_SIZE);

class1.putDataOnOutputStream(cbb.getOutputStream());

class2.processDataFromInputStream(cbb.getInputStream());

Writer到Reader 的转换方法与上述方法类似,下面仅举例,不做详细说明了。

方法4:使用缓存数组

StringWriter out = new StringWriter();

class1.putDataOnWriter(out);

class2.processDataFromReader(

new StringReader(out.toString())

);

方法5:使用管道

PipedReader in = new PipedReader();

PipedWriter out = new PipedWriter(in);

new Thread(

new Runnable(){

public void run(){

class1.putDataOnWriter(out);

}

}

).start();

class2.processDataFromReader(in);

方法6:使用循环缓存

多线程示例

CircularCharBuffer ccb = new CircularCharBuffer();

new Thread(

new Runnable(){

public void run(){

class1.putDataOnWriter(ccb.getWriter());

}

}

).start();

class2.processDataFromReader(ccb.getReader());

单线程示例

// buffer all data in a circular buffer of infinite size

CircularCharBuffer ccb = new CircularCharBuffer(CircularCharBuffer.INFINITE_SIZE);

class1.putDataOnWriter(ccb.getWriter());

class2.processDataFromReader(ccb.getReader());

JAVA输出流与输入流

输出流 编程入门的第一个程序,输出一串字符串 public class C { public static void main(String[] args) { System.out.println( ...

【转】JAVA输出内容打印到TXT以及不同系统中如何换行

JAVA输出内容打印到TXT以及不同系统中如何换行 http://xiyang.09.blog.163.com/blog/static/59827615201172552755293/ 2011-08 ...

java输出双引号

java输出双引号 直接看例子 //输出双引号 public class Test { public static void main(String[] args) { System.out.prin ...

java输出一个目录下的子目录

java输出一个目录下的子目录 package com.vfsd.core; import java.io.File; public class ListDir { public static voi ...

[Java] Steam文件输入流

package test.stream; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...

java输出重定向

Java的标准输入,输出分别是通过System.in和System.out来代表.默认情况下他们分别代表键盘和显示器. System类里提供了3个重定向标准输入,输出的方法. static void ...

系统学习 Java IO (一)----输入流和输出流 InputStream/OutputStream

目录:系统学习 Java IO ---- 目录,概览 InputStream 是Java IO API中所有输入流的父类. 表示有序的字节流,换句话说,可以将 InputStream 中的数据作为有序 ...

Day_14【IO流】扩展案例2_缓冲字符输出、输入流进行用户名的创建

需求分析 1.项目根目录下建立文件: user.txt,文件中存放用户名和登录密码,格式:用户名,密码,如:aaa,123: 2.user.txt文件中初始存放的用户信息有如下: jack,123 r ...

PHP、Java输出json格式数据

PHP 输出json. $result = mysql_query($sql); //查询结果 $users=array(); $i=0; while($row=mysql_fetch_array ...

随机推荐

Freemarker与Springmvc

1.导入springmvc和freemarker的jar包 2.web.xml中配置Spring和Springmvc <?xml version="1.0" encoding ...

D:Wordpress&lowbar;AFC插件常用代码

获取自定义变量 //输出自定义字段title的值<?php the_field('title','options'); ?> //获取自定义字段title的值 <?php echo ...

html(单纯html标签)

html是超文本标记语言, 不是编程语言. 单标签:
..hr(水平线).input, 双标签:h1~h6,p,a,div,head,body,title,s ...

总结XX网app中webapp常见的前端错误。

在2016年12月至2017年1月,这一个月的时间内,我参与了易政网app中webapp前端项目的工作,下面将我在此次项目中犯的错误总结起来,以防下次再犯.也终于知道之前看的文章中的一段话所代表的意义 ...

演示 Calendar 的一般操作

package com.yixin.webbrower; /* * 演示 Calendar 的一般操作 */ import java.util.Date; import java.text.Simpl ...

jvm内存溢出问题

 Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 J ...

scrapy instantiation

start from scrapy.cmdline import execute execute(['scrapy', 'crawl', 'jokespider']) items.py import ...

通过JavaScript自由切换iframe

我发现我有很大的强迫症,如果看到别人的文章没有最终的效果图,我会毫不犹豫关掉这个页面.真的很炸毛这种,让我有很不舒服的体验:所以纵使网上有类似的了,我还是写一篇给那些跟我有同样症状的人阅读. 首先来学 ...

使用DataTables插件与后台对接表格

function getResults(){ var callResults = $.ajax({ url: "....", //接口url type: "GET&quo ...

微信小程序7 - 页面命名规范

/pages/{module}/{page}/index.js   这个是目录结构 所有单个页面(Page)目录内, 都叫做index,如 index.js  index.wxss  ,不需要起其他名 ...

java输入流转成输出流,[转]java 输出流转输入流相关推荐

  1. Java 输入一个正整数的字符串,输出与它最接近的对称数字(不包括它自己)的字符串

    题目描述: 输入一个正整数的字符串,输出与它最接近的对称数字(不包括它自己)的字符串 注1: 输入字符串的长度最多不会超过18 注2: 当大于输入数字和小于输入数字的对称数字与输入数字距离相同时,取小 ...

  2. java 程序打包成jar_把Java程序打包成jar文件包并执行的方法

    本文介绍了把Java程序打包成jar文件包并执行的方法,分享给大家,具体如下: 1.首先要确认自己写的程序有没有报错. 2.第一次我写的是Web Project到现在,我一直没有执行成功,所以最好创建 ...

  3. java输入一个字符串_在java中如何用键盘输入一个数,字符,字符串

    一,利用 Scanner 实现从键盘读入integer或float 型数据 1 import java.util.*;2 public classtest {3 public static voidm ...

  4. java输入字符串并将每个字符输出

    import java.util.Scanner; public class Main{public static void main(String[] args){int i,len;String ...

  5. java输入最大10位数,倒数输出(很鸡肋)

    public class D { public static void main(String[] args) { System.out.println("请输入数字(最大十位数):&quo ...

  6. java输入日期计算天数_(JAVA)输入年月日,计算日期是今年的第几天?

    展开全部 import java.util.Scanner; /** * Created by xpf on 2018/6/22 :) * GitHub:xinpengfei520 * Functio ...

  7. java 168转换成861_java实验-java语言面向对象编程基础

    java实验-java语言面向对象编程基础 (12页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 8.90 积分 广州大学学生实验报告广州大学学生实验报告 ...

  8. java强制转换成float_在Java中什么时候double必须强制转换成float 就是要在数值后加f或者强制转换...

    满意答案 auyps 2013.08.05 采纳率:47%    等级:12 已帮助:8409人 好吧,我也来说说double与float之间的转换 首先,我说一下定义时赋值的情况 比如: 你可以这样 ...

  9. java float转换成long_在Java中如何将float转换为long或int数据类型?

    float f=1.2f;double d=Double.parseDouble(String.valueOf(f));System.out.println(d);直接转换会设计到精度问题,所以需要借 ...

最新文章

  1. 电压放大倍数公式运放_【专题2:电子工程师 之 硬件】 之 【43.运算放大器详解e 运算放大器虚短和虚断】...
  2. 分布式任务队列 Celery — Overview
  3. Python3 turtle教程
  4. sap可配置BOM的主要流程
  5. 高并发 python socket send 异步_对于Python中socket.listen()与多线程结合的困惑?
  6. Vuex新手的理解与使用
  7. Arm v8 中断处理
  8. JSF2.0与纯JS框架
  9. win7重装系统后设置Python2.7环境
  10. XML文档注释(C#)
  11. 使用Spring Boot自动发布和监视API
  12. 徐扬:互联网营销下的移动营销
  13. 2018年网络规划设计师上午真题及答案解析
  14. DOM4J介绍与代码示例【转载】
  15. StudyTonight 中文系列教程【翻译完成】
  16. HCK哈士奇x可口可乐联名潮酷冰吧,你还没入手吗?
  17. 《中国新能源汽车舆情报告2021》发布 |特斯拉“车顶维权”占据年度十大舆情事件之首...
  18. 迎向阳光,ACCUSYS世仰 确定2021首届年度色
  19. 《哲学100问》读书感想:为什么要做一个道德的人
  20. 微软edge浏览器不显示图片问题

热门文章

  1. 新手必须学习ABAP内容
  2. 环保监测设备 环保监测智能终端 环保数采仪
  3. C# 下载文件到本地(两步到位)
  4. 网维大师系统虚拟盘控制台 网络中存在另外一台主服务器,网维大师系统虚拟盘性能优化及常见问题...
  5. 淘宝客APP开发定制都需要什么功能
  6. [HFCTF 2021 Final]easyflask
  7. Oracle Flashback 技术总结
  8. 00后在线自习,实则涉黄?
  9. 2010十大最热门IT职位
  10. Nginx进程杀不完解决方法