关于Java:将输入流对象附加到String对象

Append InputStream object to String object

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Read/convert an InputStream to a String

我尝试将数据从inputstream对象附加到字符串,如下所示:

1
2
3
4
5
6
byte[] buffer = new byte[8192];
InputStream stdout;
String s ="";      
while(IsMoreInputDataAvailable()) {
    int length = this.stdout.read(buffer);
    s += new String(this.buffer, 0, length,"ASCII");

在不使用Apache或类似库的情况下,有没有一种更简单的方法可以做到这一点?


InputStream中读取字符数据的通常方法是将其包装在Reader中。输入流用于二进制数据,读卡器用于字符数据。从InputStream中读取的适当Reader是适当命名的InputStreamReader

1
2
3
4
5
6
7
8
Reader r = new InputStreamReader(stdout,"ASCII");
char buf = new char[4096];
int length;
StringBuilder s = new StringBuilder();
while ((length = r.read(buf)) != -1) {
    s.append(buf, 0, length);
}
String str = s.toString();

注意,在一个循环中反复附加到一个String通常是一个坏主意(因为每次你都需要复制整个字符串),所以我在这里使用StringBuilder


这里有一个链接,指向几种方法(有或没有外部库)。一种方法(从上面的链接中提取)使用Java扫描器(因为Java 5):

1
2
3
4
5
6
7
8
public class InputStreamTest {

    public static void main(String args[]) throws FileNotFoundException {
        FileInputStream fis = new FileInputStream("c:/sample.txt");
        String inputStreamString = new Scanner(fis,"UTF-8").useDelimiter("\\A").next();
        System.out.println(inputStreamString);
    }
}