`
shihuan830619
  • 浏览: 574111 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

将输出流OutputStream转化为输入流InputStream的方法

    博客分类:
  • J2SE
阅读更多
将输出流OutputStream转化为输入流InputStream的方法
一:
package test.io;   
import java.io.ByteArrayInputStream;   
import java.io.ByteArrayOutputStream;   
import java.io.IOException;   
/** 
* 用于把OutputStream 转化为 InputStream。 
* 适合于数据量不大,且内存足够全部容纳这些数据的情况。 
* 
*/  
public class Test1 {   
/** 
* @param args 
* @throws IOException 
*/  
public static void main(String[] args) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] bs = new byte[] { 1, 2, 3, 4, 5 };  
out.write(bs); 

ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()) 
byte[] bs = new byte[1024];   
int len = in.read(bs);   
for (int i = 0; i < len; i++) {   
System.out.println(bs[i]);   
}   
}
} 

二:
package test.io;   
import java.io.IOException;   
import java.io.PipedInputStream;   
import java.io.PipedOutputStream;   
/** 
* 用于把OutputStream 转化为 InputStream。 适合于数据量大的情况,一个类专门负责产生数据,另一个类负责读取数据。 
*/  
public class Test2 {   
/** 
* @param args 
* @throws IOException 
*/  
public static void main(String[] args) throws IOException {   
// 使用Piped 的输入输出流
PipedInputStream in = new PipedInputStream();
final PipedOutputStream out = new PipedOutputStream(in);
// 启动线程,让数据产生者单独运行
new Thread(new Runnable() {
public void run() {
try {
byte[] bs = new byte[2];
for (int i = 0; i <= 100; i++) {
bs[0] = (byte) i;
bs[1] = (byte) (i + 1);
// 测试写入字节数组
out.write(bs);
out.flush();
// 等待0.1秒
Thread.sleep(100);
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
// 数据使用者处理数据
// 也可以使用线程来进行并行处理
byte[] bs = new byte[1024];
int len;
// 读取数据,并进行处理
try {
while ((len = in.read(bs)) != -1) {
for (int i = 0; i < len; i++) {
System.out.println(bs[i]);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

下面是关于 PipedOutputStream 的API介绍
传送输出流可以连接到传送输入流,以创建通信管道。传送输出流是管道的发送端。通常,数据由某个线程写入 PipedOutputStream 对象,并由其他线程从连接的 PipedInputStream 读取。不建议对这两个对象尝试使用单个线程,因为这样可能会死锁该线程。

下面是关于 PipedInputStream的API介绍
传送输入流应该连接到传送输出流;传送输入流会提供要写入传送输出流的所有数据字节。通常,数据由某个线程从 PipedInputStream 对象读取,并由其他线程将其写入到相应的 PipedOutputStream。不建议对这两个对象尝试使用单个线程,因为这样可能会死锁该线程。传送输入流包含一个缓冲区,可在缓冲区限定的范围内将读操作和写操作分离开。

三:
package test.io;
import java.io.IOException;   
import java.io.InputStream;   
import java.io.OutputStream;   
import com.Ostermiller.util.CircularByteBuffer;   
/** 
* 用于把OutputStream 转化为 InputStream。 
* <p> 
* 使用CircilarBuffer 辅助类 <br> 
* 下载地址为 <A href="http://ostermiller.org/utils/download.html 
http://ostermiller.org/utils/download.html<br> 
* 介绍地址为 http://ostermiller.org/utils/CircularBuffer.html 
* </p>
*/  
public class Test3 {   
/** 
* @param args 
* @throws IOException 
*/  
public static void main(String[] args) throws IOException {   
// 使用CircularByteBuffer  
final CircularByteBuffer cbb = new CircularByteBuffer();   
// 启动线程,让数据产生者单独运行  
new Thread(new Runnable() {   
public void run() {   
try {   
OutputStreamClass3.putDataOnOutputStream(cbb.getOutputStream());   
} catch (IOException e) {   
e.printStackTrace();   
}   
}   
}).start();   
// 数据使用者处理数据  
// 也可以使用线程来进行并行处理  
InputStreamClass3.processDataFromInputStream(cbb.getInputStream());   
}   
}   
class OutputStreamClass3 {   
public static void putDataOnOutputStream(OutputStream out) throws IOException {   
byte[] bs = new byte[2];   
for (int i = 0; i <= 100; i++) {   
bs[0] = (byte) i;   
bs[1] = (byte) (i + 1);   
// 测试写入字节数组  
out.write(bs);   
out.flush();   
try {   
// 等待0.1秒  
Thread.sleep(100);   
} catch (InterruptedException e) {   
e.printStackTrace();   
}   
}   
}   
}   
class InputStreamClass3 {   
public static void processDataFromInputStream(InputStream in) {   
byte[] bs = new byte[1024];   
int len;   
// 读取数据,并进行处理  
try {   
while ((len = in.read(bs)) != -1) {   
for (int i = 0; i < len; i++) {   
System.out.println(bs[i]);   
}   
}   
} catch (IOException e) {   
e.printStackTrace();   
}   
}   
}  

此方法使用了一个类处理,代码更简洁,可以很方便的在缓冲处理全部数据的小数据量情况和多线程处理大数据量的不同情况切换

package test.io;   
import java.io.IOException;   
import java.io.InputStream;   
import java.io.OutputStream;   
import com.Ostermiller.util.CircularByteBuffer;   
/** 
* 用于把OutputStream 转化为 InputStream。 
* <p> 
* 使用CircilarBuffer 辅助类 <br> 
* 下载地址为 <A href="http://ostermiller.org/utils/download.html 
* http://ostermiller.org/utils/download.html<br> 
* 介绍地址为 http://ostermiller.org/utils/CircularBuffer.html 
* </p>
*/  
public class Test4 {   
/** 
* @param args 
* @throws IOException 
*/  
public static void main(String[] args) throws IOException {   
// 缓冲所有数据的例子,不使用多线程  
CircularByteBuffer cbb = new CircularByteBuffer(CircularByteBuffer.INFINITE_SIZE);   
OutputStreamClass4.putDataOnOutputStream(cbb.getOutputStream());   
InputStreamClass4.processDataFromInputStream(cbb.getInputStream());   
}   
}   
class OutputStreamClass4 {   
public static void putDataOnOutputStream(OutputStream out) throws IOException {   
byte[] bs = new byte[] { 1, 2, 3, 4, 5 };   
out.write(bs);   
}   
}   
class InputStreamClass4 {   
public static void processDataFromInputStream(InputStream in) throws IOException {   
byte[] bs = new byte[1024];   
int len = in.read(bs);   
for (int i = 0; i < len; i++) {   
System.out.println(bs[i]);   
}   
}   
}
分享到:
评论

相关推荐

    Java基础核心+InputStream输入流+OutputStream输出流

    使用最简单的InputStream输入流和OutputStream输出流,制作了文件之间的粘贴复制功能。程序已测试,可以把一个word文件中的内容完整复制到另一个word文件中。

    输入流和输出流

    输入流和输出流 流是程序和外界进行数据交换的通道 分为输入流(InputStream)和输出流(OutputStream)。程序通过输入流从数据源读取数据,通过输出流向目的地写数据。

    java中的标准输入输出流

    本文档涵盖了java中标准输入输出流,包含InputStream、OutputStream字节流还有字符流以及对文件的读写操作等

    常用的输入输出流-模拟记事本

    1.常用的输入输出流(BufferedReader,FileReader,InputStream,OutputStream,PrintWriter) 2.模拟记事本

    Java IO期末复习||五类一接口

    Java IO五类一接口 文件操作类File、...字节输出流OutputStream、字节输入流InputStream 字符输出流Writer、字符输入流Reader 打印流、输入输出重定向 Scanner类 字符编码 序列化操作标识接口Serialiable

    输入流输出流

    IO流的开发线程,通过InputStream OutputStream进行数据交互

    JAVA IO流技术

    输入流:数据源到程序(InputStream、Reader读进来) 输出流:程序到目的地(OutPutStream、Writer写出去) 处理数据单元: 字节流:按照字节读取数据(InputStream、OutputStream) 字符流:按照字符读取数据(Reader...

    JAVA语言中read方法分析

    在JAVA语言中,输入和输出功能依靠流来完成,输入输出流则 依靠InputStream和OutputStream两个类及其子类...read(byte[]b,int oK int len):将输入流中最多len个数据字节渎 入byte数组,从下标为off的元素开始存储。

    IO体系.java

    |--PipedOutputStream/:可以将管道输出流连接到管道输入流来创建通信管道。 | 用方法connect(PipedInputStream snk) 将此管道输出流连接到接收者。 同样使用多线程技术,避免死锁。 |--ByteArrayOutputStream/:...

    Java输入输出流以及线程讲解

    Java inputstream outputstream ..... thread runnable..... 内容是中文的

    转变流在输入输出时进行加工

    输入时压缩输入,输出时压缩输出,重载了inputstream和outputstream类,一个实现在输入时压缩,一个实现输出时解压,第一个类是成功的,第二个类还有问题。最好是根据jdk1.6的压缩类改造,可性我基本功不够。

    基础深化和提高-IO流技术学习大全

    字节输入流(InputStream)和字节输出流(OutputStream):用于处理二进制数据,以字节为单位进行读写。常见的实现类包括FileInputStream、FileOutputStream等。 字符流: 字符输入流(Reader)和字符输出流...

    JavaPD-Ch09mao文件及输入输出流1

    引言java.io中有4个重要的abstract class– InputStream(字节输入流)– OutputStream(字节输出流)9.1 文件9.2

    IO流的总结

    总结了常用的 RandomAccessFile 随机存取文件类 InputStream 字节输入流 OutputStream 字节输出流 Reader 字符输入流 Writer 字符输出流

    07_第7章_输入流与输出流1

    第七章流与文件Ø 掌握File类的使用Ø 理解流的不同分类Ø 掌握InputStream和OutputStream的使用Ø 掌握常用过滤流的使用Ø 掌握Read

    JDK_API_1_6

    BufferedInputStream BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。 BufferedOutputStream 该类实现缓冲的输出流。 BufferedReader 从字符输入流中读取文本,...

    字节流和字符流

    在字节流中输出数据主要是使用OutputStream完成,输入使的是InputStream,在字符流中输出主要是使用Writer类完成,输入流主要使用Reader类完成。(这四个都是抽象类)java中提供了专用于输入输出功能的包Java.io,...

    Java之IO流学习总结

    SequenceInputStream 可以认为是一个工具类,将两个或者多个输入流当成一个输入流依次读取。完全可以从IO 包中去除,还完全不影响IO 包的结构,却让其更“纯洁”――纯洁的Decorator 模式。 PrintStream 也可以认为...

    BufferOutputStreamToInputStream:允许有一个缓冲的输出流,链接到一个输入流......这在测试时很有用,或者当你需要模拟一个输入流时,用本地数据重新填充

    缓冲区输出流到输入流 允许有一个缓冲的输出流,链接到一个输入流......这在测试时很有用,或者当你需要模拟输入流时,在事件的基础上用本地数据重新填充 // initialize self.bufferWriter = [...

Global site tag (gtag.js) - Google Analytics