天天看点

如何在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和OutputStream

这就是

如何在Java中将字节数组转换为InputStream

的全部内容。 由于对java.io软件包的了解有限,一开始听起来可能很困难,但是一旦您知道有一个名为ByteArrayInputStream的类,它就变得非常简单。 由于它是InputStream的子类,因此可以代替InputStream传递它。 如果要将字节转换为字符并在完成后关闭流,请不要忘记提供字符编码。

翻译自: https://www.javacodegeeks.com/2014/04/how-to-convert-byte-array-to-inputstream-and-outputstream-in-java.html