zoukankan      html  css  js  c++  java
  • Ways to convert an InputStream to a String

    Reference:

    [1] https://stackoverflow.com/questions/309424/read-convert-an-inputstream-to-a-string

    Ways to convert an InputStream to a String:

    1. Using IOUtils.toString (Apache Utils)

      String result = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
    2. Using CharStreams (guava)

      String result = CharStreams.toString(new InputStreamReader(
            inputStream, Charsets.UTF_8));
    3. Using Scanner (JDK)

      Scanner s = new Scanner(inputStream).useDelimiter("\A");
      String result = s.hasNext() ? s.next() : "";
    4. Using Stream Api (Java 8). Warning: This solution convert different line breaks (like  ) to  .

      String result = new BufferedReader(new InputStreamReader(inputStream))
        .lines().collect(Collectors.joining("
      "));
    5. Using parallel Stream Api (Java 8). Warning: This solution convert different line breaks (like  ) to  .

      String result = new BufferedReader(new InputStreamReader(inputStream)).lines()
         .parallel().collect(Collectors.joining("
      "));
    6. Using InputStreamReader and StringBuilder (JDK)

      final int bufferSize = 1024;
      final char[] buffer = new char[bufferSize];
      final StringBuilder out = new StringBuilder();
      Reader in = new InputStreamReader(inputStream, "UTF-8");
      for (; ; ) {
          int rsz = in.read(buffer, 0, buffer.length);
          if (rsz < 0)
              break;
          out.append(buffer, 0, rsz);
      }
      return out.toString();
    7. Using StringWriter and IOUtils.copy (Apache Commons)

      StringWriter writer = new StringWriter();
      IOUtils.copy(inputStream, writer, "UTF-8");
      return writer.toString();
    8. Using ByteArrayOutputStream and inputStream.read (JDK)

      ByteArrayOutputStream result = new ByteArrayOutputStream();
      byte[] buffer = new byte[1024];
      int length;
      while ((length = inputStream.read(buffer)) != -1) {
          result.write(buffer, 0, length);
      }
      // StandardCharsets.UTF_8.name() > JDK 7
      return result.toString("UTF-8");
    9. Using BufferedReader (JDK). Warning: This solution convert different line breaks (like  ) to line.separator system property (for example, in Windows to " ").

      String newLine = System.getProperty("line.separator");
      BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
      StringBuilder result = new StringBuilder();
      String line; boolean flag = false;
      while ((line = reader.readLine()) != null) {
          result.append(flag? newLine: "").append(line);
          flag = true;
      }
      return result.toString();
    10. Using BufferedInputStream and ByteArrayOutputStream (JDK)

      BufferedInputStream bis = new BufferedInputStream(inputStream);
      ByteArrayOutputStream buf = new ByteArrayOutputStream();
      int result = bis.read();
      while(result != -1) {
          buf.write((byte) result);
          result = bis.read();
      }
      // StandardCharsets.UTF_8.name() > JDK 7
      return buf.toString("UTF-8");
    11. Using inputStream.read() and StringBuilder (JDK). Warning: This solution has problem with Unicode, for example with Russian text (work correctly only with non-Unicode text)

      int ch;
      StringBuilder sb = new StringBuilder();
      while((ch = inputStream.read()) != -1)
          sb.append((char)ch);
      reset();
      return sb.toString();

    Warning:

    1. Solutions 45 and 9 convert different line breaks to one.

    2. Solution 11 can't work correctly with Unicode text

    Performance tests

    Performance tests for small String (length = 175), url in github (mode = Average Time, system = Linux, score 1,343 is the best):

                  Benchmark                        Mode  Cnt   Score   Error  Units
    8. ByteArrayOutputStream and read (JDK)        avgt   10   1,343 ± 0,028  us/op
    6. InputStreamReader and StringBuilder (JDK)   avgt   10   6,980 ± 0,404  us/op
    10.BufferedInputStream, ByteArrayOutputStream  avgt   10   7,437 ± 0,735  us/op
    11.InputStream.read() and StringBuilder (JDK)  avgt   10   8,977 ± 0,328  us/op
    7. StringWriter and IOUtils.copy (Apache)      avgt   10  10,613 ± 0,599  us/op
    1. IOUtils.toString (Apache Utils)             avgt   10  10,605 ± 0,527  us/op
    3. Scanner (JDK)                               avgt   10  12,083 ± 0,293  us/op
    2. CharStreams (guava)                         avgt   10  12,999 ± 0,514  us/op
    4. Stream Api (Java 8)                         avgt   10  15,811 ± 0,605  us/op
    9. BufferedReader (JDK)                        avgt   10  16,038 ± 0,711  us/op
    5. parallel Stream Api (Java 8)                avgt   10  21,544 ± 0,583  us/op

    Performance tests for big String (length = 50100), url in github (mode = Average Time, system = Linux, score 200,715 is the best):

                  Benchmark                        Mode  Cnt   Score        Error  Units
    8. ByteArrayOutputStream and read (JDK)        avgt   10   200,715 ±   18,103  us/op
    1. IOUtils.toString (Apache Utils)             avgt   10   300,019 ±    8,751  us/op
    6. InputStreamReader and StringBuilder (JDK)   avgt   10   347,616 ±  130,348  us/op
    7. StringWriter and IOUtils.copy (Apache)      avgt   10   352,791 ±  105,337  us/op
    2. CharStreams (guava)                         avgt   10   420,137 ±   59,877  us/op
    9. BufferedReader (JDK)                        avgt   10   632,028 ±   17,002  us/op
    5. parallel Stream Api (Java 8)                avgt   10   662,999 ±   46,199  us/op
    4. Stream Api (Java 8)                         avgt   10   701,269 ±   82,296  us/op
    10.BufferedInputStream, ByteArrayOutputStream  avgt   10   740,837 ±    5,613  us/op
    3. Scanner (JDK)                               avgt   10   751,417 ±   62,026  us/op
    11.InputStream.read() and StringBuilder (JDK)  avgt   10  2919,350 ± 1101,942  us/op
  • 相关阅读:
    mysql leetcode 1445. 苹果和桔子 分组求差值
    前后端分离的理解
    mysql leetcode 178. 分数排名 自定义排名序号列 1,2,3
    mysql 距离今日,过去一年/一个月/一天 表达式
    mysql leetcode 1280. 学生们参加各科测试的次数 解题思路 一步一步来
    mysql leetcode 1435. 制作会话柱状图 解题思路 一步一步来
    leetcode 刷题笔记 寻找数组的中心索引 二分法查找
    mysql case when 理解和应用
    三角函数
    冒泡排序,选择排序,插入排序
  • 原文地址:https://www.cnblogs.com/codingforum/p/7002299.html
Copyright © 2011-2022 走看看