如果你曾经使用java IO编程,你会很快碰到这种情况,某个类在OutputStream上创建数据而你需要将它发送给某个需要从输入流读取数据的类。
你很快会被问道,“java中如何将OutputStream转换为InputStream?”
方法一:使用字节数组缓存数据
最简单的方法是用字节数组缓存数据。代码
ByteArrayOutputStream out = new ByteArrayOutputStream();
class1.putDataOnOutputStream(out);
class2.processDataFromInputStream(
new ByteArrayInputStream(out.toByteArray())
);
于是,OutputStream就被转换为InputStream了。
方法二:使用管道
第一种方法的问题是你必须有足够的内存缓存所有数据。你可以使用文件系统缓存更多数据,但无论如何可处理数据的大小还是受到限制。
解决方法是创建一个线程产生数据到PipedOutputStream。当前线程可从中读取数据。
PipedInputStream in = new PipedInputStream();
PipedOUtputStream out = new PipedOutputStream(in);
new Thread(
new Runnable(){
public void run(){
class1.putDataOnOutputStream(out);
}
}
).start();
class2.processDataFromInputStream(in);|||
方法三:使用循环缓存区
方法二中的两个管道流,实际上管理着一个隐藏的循环缓存区。使用一个显式的循环缓存区更易于理解。CircularBuffers 有如下优点
一个CircularBuffers类而不是两个管道类。
较于缓存所有数据和额外线程的方法更容易使用。
你可以更改缓存大小而不必受限于管道缓存区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());
分享到:
相关推荐
在Java编程中,有时我们可能需要将一个已经写入数据的`OutputStream`转换为`InputStream`,以便重新读取这些数据。这种情况通常出现在临时存储或处理数据时,例如在网络传输或者存储到内存中的场景。本篇文章将深入...
一种常见的方法是先将`OutputStream`的数据写入内存中的`ByteArrayOutputStream`,然后再将其转换为`InputStream`: ```java ByteArrayOutputStream baos = new ByteArrayOutputStream(); OutputStream out = ...
- **使用OutputStream**: 如果要将字符串写入输出流,可以先将字符串转换为字节数组,然后通过`OutputStream.write(bytes)`方法发送到流中。 2. **Byte转String**: - **字节数组转换**: 使用`new String(bytes)`...
7. **文件IO操作**:在读取和写入视频文件时,Java的File类和InputStream/OutputStream类是必不可少的。开发者需要确保正确地读取输入文件,并将转换后的视频数据写入到指定的输出文件。 8. **异常处理**:在处理...
在XML和Java对象转换的上下文中,Object Stream可能是指将Java对象写入OutputStream或者从InputStream读取,这是Java标准I/O的一部分。XStream允许开发者将复杂的Java对象层次结构轻松地转换成XML,反之亦然,而无需...
InputStream 和 OutputStream InputStream 是一种输入流,用于读取数据。InputStream 可以用来读取文件、网络数据等。 OutputStream 是一种输出流,用于写入数据。OutputStream 可以用来写入文件、网络数据等。 ...
将InputStream转化为String,一般使用BufferedReader读取InputStream中的每一行并拼接到StringBuffer中,最后返回其toString()的结果。另外,也可以通过ByteArrayOutputStream来读取InputStream,然后将其转换为...
如果需要在程序中操作图片,可以使用Java的`javax.imageio`包中的`ImageIO`类将字节流转换为`BufferedImage`对象: ```java BufferedImage image; try (InputStream is = new ByteArrayInputStream(imageData))...
4. **视频流处理**:在Java中处理视频流,可能需要用到IO流,如InputStream和OutputStream,来读取和写入视频数据。 5. **视频参数调整**:在转换过程中,我们可能需要根据需求调整视频的分辨率、比特率、帧率等...
Java的IO系统在此起到了关键作用,它分为面向字节的流(如InputStream和OutputStream)和面向字符的流(如Reader和Writer)。 面向字节的流处理原始的二进制数据,不进行任何字符编码转换,适用于处理如图像、音频...
6. **Java I/O和文件操作:** 在进行文件转换时,了解Java的文件读写操作至关重要,包括File类、InputStream和OutputStream的使用。 7. **模板技术:** 为了更高效地生成Word文档,开发者可能会使用模板技术,如...
在 DELPHI 中,文件操作是通过 TFileStream 来实现的,而在 JAVA 中,则是通过 InputStream/OutputStream 和 RandomAccessFile 来实现的。 目录操作 在 DELPHI 中,目录操作是通过 FindFirst 等来实现的,而在 ...
InputStreamReader和OutputStreamWriter是两个关键的转换器,分别将InputStream和OutputStream转换为Reader和Writer,以支持字符流操作。Reader和Writer的使用通常是首选,因为它们能更好地处理国际化的字符编码。 ...
相反,`OutputStreamWriter`是`Writer`的子类,它接收`OutputStream`,并将字符流转换为字节流,写入到输出流中。同样,我们需要指定编码: ```java OutputStream out = new FileOutputStream("output.txt"); ...
7. **文件I/O操作**:在Java中,处理文件需要使用I/O流(InputStream和OutputStream)或者BufferedReader和PrintWriter等类。转换器会读取txt文件,然后写入相应的Java代码。 8. **编码处理**:考虑到txt文件可能...
Java提供了`InputStream`和`OutputStream`处理原始字节流,而`Reader`和`Writer`则用于处理字符流,它们负责将字节转换为字符或将字符转换为字节。在处理汉字时,推荐使用`FileReader`和`FileWriter`,它们会按照...
Java源码编码转换器是一款实用工具,主要用于将Java源代码文件从GBK编码转换为UTF-8编码,或者从UTF-8编码转换为GBK编码。在软件开发过程中,尤其是在处理中文字符时,编码问题是一个常见的挑战。GBK是中文环境下...
1. **IO流**:Java的InputStream和OutputStream类用于读写文件,InputStreamReader和OutputStreamWriter则用于处理字符流,配合BufferedReader和BufferedWriter可以高效地读写大文件。 2. **文件操作**:File类提供...
Java的IO系统是基于流模型的,分为面向字节的InputStream/OutputStream和面向字符的Reader/Writer。这两种类型的流在处理数据时遵循不同的原则。面向字节的流直接操作原始的字节数据,不做任何字符编码转换,适合...