Convert a Java OutputStream to an InputStream
来源:互联网 发布:myeclipse mac版 编辑:程序博客网 时间:2024/05/29 16:53
Convert a Java OutputStream to an InputStream
If you have ever programmed using Java IO, you will quickly run into a situation in which a class creates data on an OutputStream and you need to send it to another class that expects to read the data from an input stream. You'll soon be asking the question, "How do I convert an OutputStream to an InputStream?"
Nowhere in Java will you find a OutpStreamToInputStreamConverter class. Luckily, there are several ways to go about this.
Method 1: Buffer the data using a byte array
The easiest method is to buffer the data using a byte array. The code will look something like this:
ByteArrayOutputStream out = new ByteArrayOutputStream(); class1.putDataOnOutputStream(out); class2.processDataFromInputStream( new ByteArrayInputStream(out.toByteArray()) );
That's it! The OutputStream has been converted to an InputStream.
Method 2: Use pipes
The problem with the first method is that you must actually have enough memory to buffer the entire amount of data. You could buffer larger amounts of data by using the filesystem rather than memory, but either way there is a hard limit to the size of the data that can be handled. The solution is create a thread to produce the data to the PipedOutputStream. The current thread can then read the data as it comes in.
PipedInputStream in = new PipedInputStream(); PipedOUtputStream out = new PipedOutputStream(in); new Thread( new Runnable(){ public void run(){ class1.putDataOnOutputStream(out); } } ).start(); class2.processDataFromInputStream(in);
Method 3: Use Circular Buffers
The two piped streams in method two actually manage a hidden circular buffer. It is conceptually easier to use an explicitCircular Buffer. CircularBuffers offer several advantages:- One CircularBuffer class rather than two pipe classes.
- It is easier to convert between the "buffer all data" and "extra threads" approaches.
- You can change the buffer size rather than relying on the hard-coded 1k of buffer in the pipes.
Multiple Threaded Example of a Circular Buffer
CircularByteBuffer cbb = new CircularByteBuffer(); new Thread( new Runnable(){ public void run(){ class1.putDataOnOutputStream(cbb.getOutputStream()); } } ).start(); class2.processDataFromInputStream(cbb.getInputStream());
Single Threaded Example of a Circular Buffer
// 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());See also: Converting a Writer to a Reader
Copyright Stephen Ostermiller 1996-2011
- Convert a Java OutputStream to an InputStream
- Convert a Java OutputStream to an InputStream
- Convert a Java OutputStream to an InputStream
- Convert a Java OutputStream to an InputStream
- Read/convert an InputStream to a String
- java inputStream ,outputStream
- Java.IO.InputStream-OutputStream
- java inputStream ,outputStream
- Java IO - InputStream&OutputStream
- java InputStream 和 OutputStream
- Java InputStream 和OutputStream
- Byte[] to InputStream or OutputStream
- Convert InputStream to JSONObject
- Convert a string to an enum
- Java OutputStream 转换为 InputStream
- java-InputStream与OutputStream类型
- Implement atoi to convert a string to an integer.
- Implement atoi to convert a string to an integer.
- MFC用 ADO连接数据库,get_RecordCount总是返回-1解决办法
- JAVA求数据的阶乘---递归法的实例化
- Convert a Java OutputStream to an InputStream
- windows xp下如何安装SQL server2000企业版
- (二)和菜鸟一起学unix之文件和目录 opendir ,closedir
- Convert a Java OutputStream to an InputStream
- 在Windows Xp上实现Ubuntu主题风格!
- 编程规范(写给自己的)
- 静态方法哪来的多态啊
- 简易随机数发生器
- android listview 圆角的实现方案,模仿Iphone的UITableView
- c++运算符重载(1)
- java中的正则表达式
- 如何学好C语言(转)