Как мне прочитать / преобразовать InputStream в строку в Java? - PullRequest
3675 голосов
/ 21 ноября 2008

Если у вас есть объект java.io.InputStream, как вы должны обработать этот объект и получить String?


Предположим, у меня есть InputStream, который содержит текстовые данные, и я хочу преобразовать его в String, поэтому, например, я могу записать это в файл журнала.

Какой самый простой способ взять InputStream и преобразовать его в String?

public String convertStreamToString(InputStream is) {
    // ???
}

Ответы [ 60 ]

1 голос
/ 21 октября 2017

Это решение этого вопроса не самое простое, но поскольку потоки и каналы NIO не были упомянуты, здесь приводится версия, которая использует каналы NIO и ByteBuffer для преобразования потока в строку.

public static String streamToStringChannel(InputStream in, String encoding, int bufSize) throws IOException {
    ReadableByteChannel channel = Channels.newChannel(in);
    ByteBuffer byteBuffer = ByteBuffer.allocate(bufSize);
    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    WritableByteChannel outChannel = Channels.newChannel(bout);
    while (channel.read(byteBuffer) > 0 || byteBuffer.position() > 0) {
        byteBuffer.flip();  //make buffer ready for write
        outChannel.write(byteBuffer);
        byteBuffer.compact(); //make buffer ready for reading
    }
    channel.close();
    outChannel.close();
    return bout.toString(encoding);
}

Вот пример того, как его использовать:

try (InputStream in = new FileInputStream("/tmp/large_file.xml")) {
    String x = streamToStringChannel(in, "UTF-8", 1);
    System.out.println(x);
}

Производительность этого метода должна быть хорошей для больших файлов.

1 голос
/ 29 февраля 2016

Метод для преобразования inputStream в String

public static String getStringFromInputStream(InputStream inputStream) {

    BufferedReader bufferedReader = null;
    StringBuilder stringBuilder = new StringBuilder();
    String line;

    try {
        bufferedReader = new BufferedReader(new InputStreamReader(
                inputStream));
        while ((line = bufferedReader.readLine()) != null) {
            stringBuilder.append(line);
        }
    } catch (IOException e) {
        logger.error(e.getMessage());
    } finally {
        if (bufferedReader != null) {
            try {
                bufferedReader.close();
            } catch (IOException e) {
                logger.error(e.getMessage());
            }
        }
    }
    return stringBuilder.toString();
}
1 голос
/ 10 марта 2016
InputStream  inputStream = null;
BufferedReader bufferedReader = null;
try {
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
    String stringBuilder = new StringBuilder();
    String content;
    while((content = bufferedReader.readLine()) != null){
        stringBuilder.append(content);
    }
    System.out.println("content of file::" + stringBuilder.toString());
}
catch (IOException e) {
            e.printStackTrace();
        }finally{           
            if(bufferedReader != null){
                try{
                    bufferedReader.close();
                }catch(IoException ex){
                   ex.printStackTrace();
            }
0 голосов
/ 17 августа 2010

Во-первых, вы должны знать кодировку строки, которую хотите преобразовать. Поскольку java.io.InputStream работает с базовым массивом байтов, однако строка состоит из массива символов, для которого требуется кодировка, например, UTF-8, JDK примет кодировку по умолчанию, взятую из

System.getProperty("file.encoding","UTF-8"); 

byte[] bytes=new byte[inputStream.available()];
inputStream.read(bytes);
String s = new String(bytes);

Если байтовый массив inputStream очень большой, вы можете сделать это в цикле.

0 голосов
/ 12 мая 2014

У меня был доступен log4j, поэтому я смог использовать org.apache.log4j.lf5.util.StreamUtils.getBytes для получения байтов, которые мне удалось преобразовать в строку с помощью String ctor

String result = new String(StreamUtils.getBytes(inputStream));
0 голосов
/ 15 февраля 2019

String resultString = IOUtils.toString(userInputStream, "UTF-8");

0 голосов
/ 19 июля 2012

Быстро и просто:

String result = (String)new ObjectInputStream( inputStream ).readObject();
0 голосов
/ 26 мая 2016

Также вы можете получить InputStream по указанному пути ресурса:

public static InputStream getResourceAsStream(String path)
{
    InputStream myiInputStream = ClassName.class.getResourceAsStream(path);
    if (null == myiInputStream)
    {
        mylogger.info("Can't find path = ", path);
    }

    return myiInputStream;
}

Чтобы получить InputStream по определенному пути:

public static URL getResource(String path)
{
    URL myURL = ClassName.class.getResource(path);
    if (null == myURL)
    {
        mylogger.info("Can't find resource path = ", path);
    }
    return myURL;
}
0 голосов
/ 28 марта 2019

Я предлагаю класс StringWriter для этой проблемы.

StringWriter wt= new StringWriter();
IOUtils.copy(inputStream, wt, encoding);
String st= wt.toString();
0 голосов
/ 10 мая 2013
  InputStream IS=new URL("http://www.petrol.si/api/gas_prices.json").openStream();   

  ByteArrayOutputStream BAOS=new ByteArrayOutputStream();
  IOUtils.copy(IS, BAOS);
  String d= new String(BAOS.toByteArray(),"UTF-8");           

System.out.println(d);
...