Java 里把 InputStream 转换成 String 的几种方法

来源:互联网 发布:录制搞笑视频软件 编辑:程序博客网 时间:2024/05/16 06:25

Java 里把 InputStream 转换成 String 的几种方法

我们在 Java 中经常会碰到如何把 InputStream 转换成 String 的情形,比如从文件或网络得到一个 InputStream,需要转换成字符串输出或赋给别的变量。

未真正关注这个问题之前我常用的办法就是按字节一次次读到缓冲区,或是建立 BufferedReader 逐行读取。其实大可不必费此周折,我们可以用 Apache commons IOUtils,或者是 JDK 1.5 后的 Scanner,还可用 Google  Guava 库的 CharStreams。到了 JDK7,若要从文件中直接得到字符串还能用 java.nio.file.Files#readAllLines 和 java.nio.file.Files#readAllBytes 方法。

下面看各个例子,为能够实际用运,例子写在 main 方法里,并从文件获得一个 InputStream,代码中把可能要捕获的异常抛出来。再就是注意处理输入输出流时有涉及到字符集,字符集乱了就乱码了,默认字符集是 System.getProperty("file.encoding"),通常我们都用 UTF-8,异常 UnsupportedEncodingException 继承自 IOException。

下面的 6 个方法中应该有一个你能看得上的吧,用 Groovy,Scala 的除外,若未找到一个遂意的,告诉我,你有好办法更应该告诉我。

1. 使用 JDK 5 的 Scanner

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
packagecc.unmi.test;
 
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.InputStream;
importjava.util.Scanner;
 
/**
 *
 * @author Unmi
 * @Creation date: 2013-02-01
 */
publicclass Test {
 
    /**
    * @param args
    * @throws FileNotFoundException
    */
    publicstatic void main(String[] args) throwsFileNotFoundException {
        InputStream inputStream = newFileInputStream("d:/sample.txt");
        Scanner scanner = newScanner(inputStream, "UTF-8");
        String text = scanner.useDelimiter("\\A").next();
        System.out.println(text);
        scanner.close();
    }
}

2. JDK1.4 及之前的 BufferedReader 法

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
packagecc.unmi.test;
 
importjava.io.BufferedReader;
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
 
/**
 *
 * @author Unmi
 * @Creation date: 2013-02-01
 */
publicclass Test {
 
    /**
    * @param args
    * @throws IOException
    */
    publicstatic void main(String[] args) throwsIOException {
        InputStream inputStream = newFileInputStream("d:/sample.txt");
        StringBuilder stringBuilder = newStringBuilder();
        BufferedReader bufferedReader = newBufferedReader(newInputStreamReader(inputStream));
        booleanfirstLine = true;
        String line = null; ;
        while((line = bufferedReader.readLine()) != null){
            if(!firstLine){
                stringBuilder.append(System.getProperty("line.separator"));
            }else{
                firstLine = false;
            }
            stringBuilder.append(line);
        }
        System.out.println(stringBuilder.toString());
    }
}

中间那些判断是不是第一行来决定是否加换行符是些杂音。

3. JDK1.4 及之前的 readBytes 法

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
packagecc.unmi.test;
 
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.io.InputStream;
 
/**
 *
 * @author Unmi
 * @Creation date: 2013-02-01
 */
publicclass Test {
 
    /**
    * @throws IOException
    */
    publicstatic void main(String[] args) throwsIOException {
        InputStream inputStream = newFileInputStream("d:/sample.txt");
         
        byte[] buffer = newbyte[2048];
        intreadBytes = 0;
        StringBuilder stringBuilder = newStringBuilder();
        while((readBytes = inputStream.read(buffer)) > 0){
            stringBuilder.append(newString(buffer, 0, readBytes));
        }
         
        System.out.println(stringBuilder.toString());
    }
}

缓冲区的大小自己根据实际来调,比 BufferedReader 还简洁些,不需管换行符的事情。

本文原始链接 http://unmi.cc/java-convert-inputstream-to-string/, 来自 隔叶黄莺 Unmi Blog

4. Apache commons IOUtils.toString 法

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
packagecc.unmi.test;
 
importjava.io.*;
 
importorg.apache.commons.io.IOUtils;
 
/**
 *
 * @author Unmi
 * @Creation date: 2013-02-01
 */
publicclass Test {
 
    /**
    * @throws IOException
    */
    publicstatic void main(String[] args) throwsIOException {
        InputStream inputStream = newFileInputStream("d:/sample.txt");
        String text = IOUtils.toString(inputStream);
        System.out.println(text);
    }
}

第三方库就是第三方库,人家充分考虑到了你的感受,你对 JDK 库的抱怨,多简洁,一行搞定。IOUtils 还能把内容拷入其他的 Writer 中,如 IOUtils.copy(inputStream, new StringWriter())。

5. Google guava 的  CharStreams 方法

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
packagecc.unmi.test;
 
importjava.io.*;
 
importcom.google.common.io.CharStreams;
 
/**
 *
 * @author Unmi
 * @Creation date: 2013-02-01
 */
publicclass Test {
 
    /**
    * @throws IOException
    */
    publicstatic void main(String[] args) throwsIOException {
        InputStream inputStream = newFileInputStream("d:/sample.txt");
        String text = CharStreams.toString(newInputStreamReader(inputStream, "UTF-8"));
        System.out.println(text);
    }
}

CharSteams 不是直接作用在 InputSteam 上的,还要靠 InputStreamReader 拱个桥。

6. JDK 7 的 NIO readAllBytes

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
packagecc.unmi.test;
 
importjava.io.IOException;
importjava.nio.file.*;
 
/**
 *
 * @author Unmi
 * @Creation date: 2013-02-01
 */
publicclass Test {
 
    /**
    * @throws IOException
    */
    publicstatic void main(String[] args) throwsIOException {
        byte[] bytes = Files.readAllBytes(Paths.get("d:/sample.txt"));
        String text = newString(bytes);
        System.out.println(text);
    }
}

这让我们相信 JDK  一直还有人在管,虽然不可能象动态语言的方法那么快捷,上面的  readAllBytes 在处理大文件时肯定会很被动的。而 Files.readAllLines 会把文件的内容读入一个 List<String> 对象中,往内存不断放东西就得掂量下内存会不会被爆。在 java.nio.file.* 还有很多新事物可供发掘。

参考: 1. 5 ways to convert InputStream to String in Java

本文链接 http://unmi.cc/java-convert-inputstream-to-string/, 来自 隔叶黄莺 Unmi Blog

0 0
原创粉丝点击