代码之家  ›  专栏  ›  技术社区  ›  Ian Vink

来自输入流的Java字符串[复制]

  •  13
  • Ian Vink  · 技术社区  · 14 年前

    可能重复:
    How do I convert an InputStream to a String in Java?
    In Java how do a read an input stream in to a string?

    我有一个 InputSteam 只需要简单地得到一个简单的 String 内容完整。

    这是如何在Java中完成的?

    6 回复  |  直到 14 年前
        1
  •  9
  •   x4u    14 年前

    这里是对gopi答案的修改,它不存在行尾问题,而且更有效,因为它不需要每行临时的字符串对象,并且避免了bufferedreader中的冗余复制和readline()中的额外工作。

    public static String convertStreamToString( InputStream is, String ecoding ) throws IOException
    {
        StringBuilder sb = new StringBuilder( Math.max( 16, is.available() ) );
        char[] tmp = new char[ 4096 ];
    
        try {
           InputStreamReader reader = new InputStreamReader( is, ecoding );
           for( int cnt; ( cnt = reader.read( tmp ) ) > 0; )
                sb.append( tmp, 0, cnt );
        } finally {
            is.close();
        }
        return sb.toString();
    }
    
        2
  •  6
  •   Jon Skeet    14 年前

    你需要构造一个 InputStreamReader 要包装输入流,请在二进制数据和文本之间进行转换。根据输入源指定适当的编码。

    一旦你有了 输入流读卡器 ,您可以创建一个 BufferedReader 然后一行一行地读取内容,或者只是一个缓冲区一个缓冲区地读取内容并附加到 StringBuilder 直到 read() 呼叫返回-1。

    这个 Guava 图书馆使这第二部分变得容易使用。 CharStreams.toString(inputStreamReader) .

        3
  •  4
  •   hhbarriuso    14 年前
        4
  •  3
  •   Gopi    14 年前

    下面是一个改编自 here .

    public  String convertStreamToString(InputStream is) throws IOException {
            /*
             * To convert the InputStream to String we use the BufferedReader.readLine()
             * method. We iterate until the BufferedReader return null which means
             * there's no more data to read. Each line will appended to a StringBuilder
             * and returned as String.
             */
            if (is != null) {
                StringBuilder sb = new StringBuilder();
                String line;
    
                try {
                   BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                    while ((line = reader.readLine()) != null) {
                        sb.append(line).append("\n");
                    }
                } finally {
                    is.close();
                }
                return sb.toString();
            } else {       
                return "";
            }
        }
    
        5
  •  1
  •   Thorbjørn Ravn Andersen    14 年前

    将流包装在读取器中以获取区域设置转换,然后在StringBuffer中收集时继续读取。完成后,对StringBuffer执行ToString()。

        6
  •  1
  •   maerics    14 年前

    您也可以使用 StringWriter 如下;每个 read 从您的输入流匹配 write (或) append )到了StringWriter,完成后您可以调用 getBuffer 以获取可以直接使用的StringBuffer,或者可以获取 toString 方法。