【问题标题】:How to create an InputStream from an array of strings如何从字符串数组创建 InputStream
【发布时间】:2012-02-18 19:55:11
【问题描述】:

我有一个字符串数组(实际上是一个 ArrayList),我想从中创建一个 InputStream,数组的每个元素都是流中的一行。

我怎样才能以最简单和最有效的方式做到这一点?

【问题讨论】:

  • 我从回调中获取数组,并希望将其作为 ZipEntity(因此是 InputStream)添加到 zip 文件中。我也想到了 StringBuilder 方法,但我希望有更好的(一些 InputStream 包装器)方法来做到这一点......

标签: java java-io


【解决方案1】:

您可以使用StringBuilder 并将所有字符串附加到它,并在其间添加换行符。然后使用

创建一个输入流

new ByteArrayInputStream( builder.toString().getBytes("UTF-8") );

我在这里使用 UTF-8,但您可能必须使用不同的编码,具体取决于您的数据和要求。

另请注意,您可能必须包装该输入流才能逐行读取内容。

但是,如果您不必使用输入流,只需遍历字符串数组可能会更容易编码和更容易维护解决方案。

【讨论】:

    【解决方案2】:

    您可以尝试使用可以提供字节数组的类 ByteArrayInputStream。但首先您必须将 List 转换为字节数组。请尝试以下操作。

        List<String> strings = new ArrayList<String>();
        strings.add("hello");
        strings.add("world");
        strings.add("and again..");
    
        StringBuilder sb = new StringBuilder();
        for(String s : strings){
            sb.append(s);           
        }
    
        ByteArrayInputStream stream = new ByteArrayInputStream( sb.toString().getBytes("UTF-8") );
        int v = -1;
        while((v=stream.read()) >=0){
            System.out.println((char)v);
        }
    

    【讨论】:

      【解决方案3】:

      最简单的可能是将它们在 StringBuilder 中粘合在一起,然后将生成的字符串传递给 StringReader。

      【讨论】:

        【解决方案4】:

        更好的方法是使用 BufferedWriter 类。 有一个样本:

        try {
            List<String> list = new ArrayList<String>();
            BufferedWriter bf = new BufferedWriter(new FileWriter("myFile.txt"));
        
            for (String string : list) {
                bf.write(string);
                bf.newLine();
            }
        
            bf.close();
        } catch (IOException ex) {
        }
        

        【讨论】:

          【解决方案5】:

          我这样做是因为你可以跳过一些复制,因此与 StringBuilder 方法相比是垃圾。

              public InputStream createInputStream(String ... strings){
                  List<ByteArrayInputStream> streams = new ArrayList<>();
                  for(String string: strings){
                      streams.add(new ByteArrayInputStream(string.getBytes(StandardCharsets.UTF_8)));
                  }
                  return new SequenceInputStream(Collections.enumeration(streams));
              }
          

          【讨论】:

            猜你喜欢
            • 2011-08-08
            • 2011-10-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-20
            • 2020-04-16
            • 2016-03-10
            • 1970-01-01
            相关资源
            最近更新 更多