Статьи

Как преобразовать байтовый массив в InputStream и OutputStream в Java

Вы застряли в своем коде, потому что у вас есть байтовый массив, а следующему методу в цепочке нужен InputStream? не волнуйтесь, у Java есть решение для этого, вы можете использовать
ByteArrayInputStream для преобразования байтового массива в InputStream в Java . Этот класс принимает байтовый массив в качестве источника и, поскольку он является подклассом InputStream, вы можете легко передать его любому методу, который принимает InputStream в качестве параметра. Хотя большинство API, таких как JDBC и File API, позволяют читать непосредственно из InputStream, потому что это позволяет обрабатывать произвольный контент с ограниченным пространством кучи . Вы должны воспользоваться этим и непосредственно читать из InputStream вместо того, чтобы получать байтовый массив и затем преобразовывать их обратно в InputStream. Это только для тех ситуаций, когда у вас есть устаревший код, который больше не поддерживается и не обновляется. Аналогично преобразование байтового массива в OutputStream тривиально. Поскольку мы используем OutputStream для записи чего-либо, он позволяет вам напрямую записывать байтовый массив в него. Допустим, вы получили несколько сообщений из сокета TCP и хотите сохранить их в файловой системе, вы можете использовать OutputStream и FileOutputStream для прямой записи байтового массива. Ранее мы видели, как преобразовать InputStream в байтовый массив. В этой статье мы увидим противоположное этому, создав простой пример преобразования байтового массива в InputStream в действии.

Байтовый массив для InputStream и OutputStream

Вот наш пример программы, которая сначала берет байтовый массив из String для тестирования. В любом случае, всегда предоставляйте кодировку символов при преобразовании строки в байты и наоборот. Чтобы воссоздать сценарий, я создал статический метод, который преобразует InputStream в String. Этот метод называется streamToString (), который принимает InputStream и кодировку символов для чтения текста. Мы воссоздаем ту же строку, которую мы ранее преобразовали в байтовый массив. Следующая часть этого примера показывает, как вы можете записать байтовый массив в OutputStream . Кстати, если вы не используете оператор try-with-resource , не забудьте закрыть Streams, как только закончите с ним. Можно утверждать, что должен ли метод, который принимает InputStream, закрыть его или нет, но я закрыл его, чтобы быть на безопасной стороне. Дайте мне знать, что вы думаете по этому поводу, потому что есть примеры служебных классов IO в Apache Commons IO и Google Guava, которые закрывают поток и не закрывают поток, передаваемый им.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
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);
1
2
3
4
5
// 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);
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 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 для преобразования нашего байтового массива в InputStream в Java . Как я уже сказал, ByteArrayInputStream является подклассом InputStream, вы можете передавать или использовать его всякий раз, когда требуется InputStream. Это также ясно из диаграммы иерархии классов, взятой из пакета java.io, которая показывает другую реализацию InputStream из библиотеки JDK.

InputStream Java

Это все о том, как преобразовать байтовый массив в InputStream в Java . Поначалу это может показаться сложным из-за ограниченных знаний о пакете java.io, но это становится очень просто, когда вы знаете, что существует класс с именем ByteArrayInputStream. Поскольку это дочерний класс InputStream, вы можете передать его вместо InputStream. Не забудьте предоставить кодировку символов, если вы конвертируете байты в символы и закрываете потоки, как только закончите с ними.