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

来源:互联网 发布:4g通信模块数据发送 编辑:程序博客网 时间:2024/04/30 02:48

我们在 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。

1. 使用 JDK 5 的 Scanner

package cc.unmi.test; import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.InputStream;import java.util.Scanner; /** *  * @author Unmi * @Creation date: 2013-02-01 */public class Test {     /**     * @param args     * @throws FileNotFoundException      */    public static void main(String[] args) throws FileNotFoundException {        InputStream inputStream = new FileInputStream("d:/sample.txt");        Scanner scanner = new Scanner(inputStream, "UTF-8");        String text = scanner.useDelimiter("\\A").next();        System.out.println(text);        scanner.close();    }}

2. JDK1.4 及之前的 BufferedReader 法

package cc.unmi.test; import java.io.BufferedReader;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader; /** *  * @author Unmi * @Creation date: 2013-02-01 */public class Test {     /**     * @param args     * @throws IOException      */    public static void main(String[] args) throws IOException {        InputStream inputStream = new FileInputStream("d:/sample.txt");        StringBuilder stringBuilder = new StringBuilder();        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));        boolean firstLine = 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 法

package cc.unmi.test; import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream; /** *  * @author Unmi * @Creation date: 2013-02-01 */public class Test {     /**     * @throws IOException      */    public static void main(String[] args) throws IOException {        InputStream inputStream = new FileInputStream("d:/sample.txt");                 byte[] buffer = new byte[2048];        int readBytes = 0;        StringBuilder stringBuilder = new StringBuilder();        while((readBytes = inputStream.read(buffer)) > 0){            stringBuilder.append(new String(buffer, 0, readBytes));        }                 System.out.println(stringBuilder.toString());    }}

4. Apache commons IOUtils.toString 法

package cc.unmi.test; import java.io.*; import org.apache.commons.io.IOUtils; /** *  * @author Unmi * @Creation date: 2013-02-01 */public class Test {     /**     * @throws IOException      */    public static void main(String[] args) throws IOException {        InputStream inputStream = new FileInputStream("d:/sample.txt");        String text = IOUtils.toString(inputStream);        System.out.println(text);    }}


5. Google guava 的  CharStreams 方法

package cc.unmi.test; import java.io.*; import com.google.common.io.CharStreams; /** *  * @author Unmi * @Creation date: 2013-02-01 */public class Test {     /**     * @throws IOException      */    public static void main(String[] args) throws IOException {        InputStream inputStream = new FileInputStream("d:/sample.txt");        String text = CharStreams.toString(new InputStreamReader(inputStream, "UTF-8"));        System.out.println(text);    }}



6. JDK 7 的 NIO readAllBytes

package cc.unmi.test; import java.io.IOException;import java.nio.file.*; /** *  * @author Unmi * @Creation date: 2013-02-01 */public class Test {     /**     * @throws IOException      */    public static void main(String[] args) throws IOException {        byte[] bytes = Files.readAllBytes(Paths.get("d:/sample.txt"));        String text = new String(bytes);        System.out.println(text);    }}


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

参考文章来自 隔叶黄莺 Unmi Blog

0 0
原创粉丝点击