如何在Java中将字节数组转换为InputStream和OutputStream
您是否坚持使用编码,因为您有字节数组,并且链中的下一个方法需要InputStream? 不用担心Java有解决方案,您可以使用
ByteArrayInputStream 在Java中将字节数组转换为InputStream 。 此类使用字节数组作为源,并且由于它是InputStream的子类,因此您可以轻松地将其传递给任何接受InputStream作为参数的方法。 尽管大多数API(例如JDBC和File API)都允许您直接从InputStream读取,因为这允许您使用有限的堆空间来处理任意内容。 您应该利用此优势,直接从InputStream读取而不是获取字节数组,然后将它们转换回InputStream。 仅适用于您拥有旧代码而不再维护和更新的情况。 同样,将字节数组转换为OutputStream也很简单。 由于我们使用OutputStream编写某些内容,因此您可以直接在其中写入字节数组。 假设您从TCP套接字收到了一些消息并希望保留在文件系统中,则可以使用OutputStream和FileOutputStream直接写入字节数组。 前面我们已经看到了如何将InputStream转换为字节数组 ,在本文中,通过创建一个将字节数组转换为InputStream的简单示例,我们将看到相反的结果。
这是我们的示例程序,该程序首先从String中获取字节数组以进行测试。 无论如何,在将String转换为字节时总是提供字符编码 ,反之亦然。 为了重新创建场景,我创建了一个静态方法,该方法将InputStream转换为String。 此方法称为streamToString(),该方法采用InputStream和字符编码来读取文本。 我们重新创建相同的String,之前已将其转换为字节数组。 本示例的下一部分显示如何将字节数组写入OutputStream 。 顺便说一句,如果您不使用try-with-resource语句 ,那么不要忘记在完成Streams后立即关闭它。 可以说,接受InputStream的方法是否应该关闭它,但出于安全考虑,我已经关闭了它。 让我知道您对此有何想法,因为Apache Commons IO和Google Guava中都有IO实用程序类的示例,它们关闭流,但不关闭传递给它们的流。
import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; /** * Java Program to convert byte array to InputStream and OutputStream in Java. * Uses ByteArrayInputStream and ByteArrayOutputStream examples. * @author Javin Paul */ public class ByteArrayToStream { public static void main(String args[]) { String str = "Google is GOD"; byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
// Creating InputStream from byte array // ByteArrayInputStream is sub-class of InputStream InputStream is = new ByteArrayInputStream(bytes); String stringFromBytes = streamToString(is, StandardCharsets.UTF_8); System.out.println("String recreated from bytes : " + str);
// Writing byte array to OutputStream OutputStream os = new ByteArrayOutputStream(); try { os.write(bytes); os.close(); } catch (IOException e) { e.printStackTrace(); } } /* * Read String from InputStream and closes it */ public static String streamToString(InputStream is, Charset encoding) { BufferedReader br = new BufferedReader(new InputStreamReader(is, encoding)); StringBuilder sb = new StringBuilder(1024); try { String line = br.readLine(); while (line != null) { sb.append(line); line = br.readLine(); } } catch (IOException io) { System.out.println("Failed to read from Stream"); io.printStackTrace(); } finally { try { br.close(); } catch (IOException ioex) { System.out.println("Failed to close Streams"); ioex.printStackTrace(); } } return sb.toString(); } } Output: String recreated from bytes : Google is GOD
您可以看到我们的streamToString()方法如何将InputStream转换为String ,但是在此之前,我们已经使用ByteArrayInputStream 在Java中将字节数组转换为InputStream了 。 正如我所说的,ByteArrayInputStream是InputStream的子类,您可以在需要InputStream时通过或使用它。 从java.io包中获得的类层次结构图也很清楚,该图显示了JDK库中InputStream的不同实现。
这就是如何在Java中将字节数组转换为InputStream的全部内容。 由于对java.io软件包的了解有限,一开始听起来可能很困难,但是一旦您知道有一个名为ByteArrayInputStream的类,它就变得非常简单。 由于它是InputStream的子类,因此可以代替InputStream传递它。 如果要将字节转换为字符并在完成后关闭流,请不要忘记提供字符编码。