`
kong6001
  • 浏览: 141268 次
  • 性别: Icon_minigender_1
  • 来自: 广东广州
社区版块
存档分类
最新评论

Convert a Java OutputStream to an InputStream

    博客分类:
  • IO
阅读更多

原文地址:ostermiller.org/convert_java_outputstream_inputstream.html

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 explicit Circular 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

分享到:
评论

相关推荐

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

    在Java编程中,有时我们可能需要将一个已经写入数据的`OutputStream`转换为`InputStream`,以便重新读取这些数据。这种情况通常出现在临时存储或处理数据时,例如在网络传输或者存储到内存中的场景。本篇文章将深入...

    InputStream与OutputStream及File间互转

    在Java编程语言中,`InputStream`和`OutputStream`是处理数据流的核心类,它们属于Java的I/O(Input/Output)框架。`File`类则用于处理文件操作,如读写、创建、删除等。理解如何在这些对象之间进行转换是Java开发中...

    关于InputStream和OutputStream详细讲解

    关于InputStream和OutputStream关于InputStream和OutputStream关于InputStream和OutputStream关于InputStream和OutputStream

    java.io.Reader 和 java.io.InputStream 的区别

    此外,值得注意的是,虽然`InputStream`和`OutputStream`以及`Reader`和`Writer`之间存在类似的关系,但在设计上,`InputStream`和`OutputStream`更偏向于底层数据传输,而`Reader`和`Writer`则提供了更高级的字符...

    java 文件存储 Inputstream outputstream reader writer的用法

    `InputStream`、`OutputStream`、`Reader`和`Writer`是Java IO流的基础类,它们提供了读写文件的基本接口。本篇文章将深入讲解这些类的用法,并提供实际的代码示例,帮助初学者更好地理解和应用。 1. `InputStream`...

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

    本教程将聚焦于Java的基础核心,以及两个重要的I/O(输入/输出)流类——InputStream和OutputStream,它们在文件操作中扮演着关键角色。 InputStream和OutputStream是Java.io包下的抽象类,是所有字节流的基类。...

    Java中OutputStream类数据操作方法.pdf

    Java中OutputStream类数据操作方法.pdf 学习资料 复习资料 教学资源

    java io InputStream and outputStream

    InputStream is = new FileInputStream(file1);// 打开文件 byte[] cont = new byte[(int) file1.length()]; is.read(cont);// 读取文件 for (int i = 0; i ; i++) { System.out.print((char) ...

    IO流文档InputStream / OutputStream

    IO流是一种基本的数据交换方式,在Java中,IO流是通过输入流(InputStream)和输出流(OutputStream)来实现的。输入流用于读取数据,而输出流用于写入数据。 InputStream是所有输入流的抽象超类,它提供了基本的...

    java-0126递归&过滤器(listFiter)&InputStream&OutputStream

    InputStream 和 OutputStream InputStream 是一种输入流,用于读取数据。InputStream 可以用来读取文件、网络数据等。 OutputStream 是一种输出流,用于写入数据。OutputStream 可以用来写入文件、网络数据等。 ...

    An_Introduction_to_Network_Programming_With_Java.rar

    本资源“An_Introduction_to_Network_Programming_With_Java.rar”是一个关于Java网络编程的介绍性资料,主要针对初学者,帮助他们理解并掌握Java在构建网络应用程序时的基础知识和技巧。 首先,网络编程的核心概念...

    java.lang.IllegalStateException: OutputStream already obtain

    标题 "java.lang.IllegalStateException: OutputStream already obtain" 涉及到的是Java编程中的一个常见错误,特别是当处理I/O流时。这个异常通常在尝试获取已经存在的OutputStream实例时抛出,表明该输出流已经被...

    Introduction to Java Programming(10th Edition)课后练习答案

    学习如何使用InputStream、OutputStream、Reader、Writer等类进行数据传输。 6. **多线程**:Java支持并发编程,线程是程序执行的最小单元。了解如何创建线程(通过Thread类或实现Runnable接口)、同步机制...

    an-introduction-to-java-programming-3.rar_java programming

    "An introduction to Java programming"这本书可能是初学者的一个好起点,它应该会涵盖Java语言的基础知识,帮助读者建立起坚实的编程基础。阅读PDF文档,结合实际编程练习,将是掌握Java编程的有效途径。

    java控制热敏打印机的例子

    inputStream = serialPort.getInputStream(); ``` 5. 编写ESC/POS指令并发送到打印机。例如,打印文本可以使用`GS + V + 1`命令(GS是GS键,ASCII码为29,V是ASCII码为11,1代表正常模式)。 ```java outputStream...

    java 中InputStream,String,File之间的相互转化对比

    在Java编程中,InputStream、String和File是三个非常基础且重要的类,它们分别代表了数据流、文本字符串和文件对象。在实际开发中,我们经常需要在这三者之间进行转换,以便于处理不同类型的输入输出。以下是关于这...

    Java-How to program 9th edition source code

    学习如何使用InputStream、OutputStream、Reader、Writer及其子类是必要的。 6. **多线程**:Java内置对多线程的支持,使得开发者可以同时执行多个任务,提高程序效率。Thread类和Runnable接口是多线程编程的核心。...

    JAVA How to Program 9th ed 英文版

    这部分内容涵盖File类、InputStream和OutputStream家族、BufferedReader和PrintWriter等。 6. **多线程编程**:Java内置了对并发处理的支持,书中会讲解如何创建和管理线程,使用synchronized关键字进行同步,以及...

    通过jsoup,输入流InputStream爬取图片PaQuPic.rar,有意者入

    6. **处理输入流和输出流**:在处理`InputStream`和`OutputStream`时,确保它们都被正确关闭,避免资源泄漏。这里使用了Java 7的try-with-resources语句,它会在块结束时自动关闭资源。 7. **处理PaQuPic.rar**:...

Global site tag (gtag.js) - Google Analytics