`
shihuan830619
  • 浏览: 576758 次
  • 性别: 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字节流还有字符流以及对文件的读写操作等

    轻松学Java之Java的输入输出流优秀PPT.pptx

    Java中的输入输出流有多种类型,包括字节流和字符流,字节流是以字节为单位的输入输出流,字符流是以字符为单位的输入输出流。Java中的输入输出流可以通过多种方式来实现,例如使用InputStream、OutputStream、...

    Java 的二进制和文本输入输出

    Java 中的二进制I/O 流可以分为两类:输入流和输出流。 输入流 输入流是指从外部设备或文件中读取数据的流。Java 中的输入流包括: * FileInputStream:从文件中读取数据的流。 * FilterInputStream:装饰器流,...

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

    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语言-输入输出完整版资料.ppt

    InputStream类中定义了read方法,用于从输入流读取数据。read方法有几种重载形式,可以读取一个字节或一组字节。若流中数据已读完,例如遇到磁盘文件尾,则返回-1。 InputStream类中还定义了其他一些基本的方法,如...

    JAVA语言中read方法分析

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

    Java语言中输入输出函数的用法完整版资料.ppt

    在本文档中,我们将详细介绍Java语言中输入输出函数的用法,包括文件输入输出、控制台输入输出、网络输入输出等,并提供了各种输入输出函数的使用示例,以帮助读者更好地理解和掌握Java语言中输入输出函数的用法。

    java输入输出语句整理总结.doc

    Java 中有两种基本的流类:输入流类 `InputStream` 和输出流类 `OutputStream`。这些流类是 Java 系统预先定义好的三个流对象的静态属性。其中,`System.out` 是标准输出设备,表示显示器;`System.in` 是标准输入...

    IO体系.java

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

    Java高级编程文件输入与输出.ppt

    输入流是数据从外部设备(通常是键盘、鼠标和扫描仪)到计算机(程序)的过程,而输出流是数据从计算机(程序)输出到外部设备(例如显示器等)的过程。 按照流的处理方式分类,流可以分为字符流和字节流。字符流是...

    java语言程序设计郑莉PPT课件.pptx

    1. 输入/输出流(I/O流)的概念:I/O流是指信息的输入与输出过程的抽象,分为输入流和输出流两种。输入流是指数据流入程序,输出流是指数据从程序流出。 2. 输入流和输出流的类型:输入流和输出流可以从不同的角度...

    java字符流练习.doc

    在 Java 中,InputStream 和 OutputStream 是两个抽象类,它们分别定义了输入流和输出流的基本方法。 在 Java 中,字符流的操作可以分为三个步骤:打开流、读写操作和关闭流。在打开流时,需要创建一个流对象,例如...

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

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

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

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

Global site tag (gtag.js) - Google Analytics