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。
1. 使用 JDK 5 的 Scanner 法
package cc.unmi.test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Scanner;
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;
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),"utf8");
String line = null;
while((line = bufferedReader.readLine()) != null)
{
stringBuilder.append(System.getProperty("line.separator")); /r/n
stringBuilder.append(line);
}
System.out.println(stringBuilder.toString());
}
}
中间那些判断是不是第一行来决定是否加换行符
JDK1.4 及之前的 readBytes 法
package cc.unmi.test;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
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());
}
}
缓冲区的大小自己根据实际来调,比 BufferedReader 还简洁些,不需管换行符的事情。
4. Apache commons IOUtils.toString 法
package cc.unmi.test;
import java.io.*;
import org.apache.commons.io.IOUtils;
public class Test {
/**
* @throws IOException 引入apache的io包
*/ public static void main(String[] args) throws IOException {
InputStream inputStream = new FileInputStream("d:/sample.txt");
String text = IOUtils.toString(inputStream,"UTF-8");
System.out.println(text);
}
}
第三方库就是第三方库,人家充分考虑到了你的感受,你对 JDK 库的抱怨,多简洁,一行搞定。IOUtils 还能把内容拷入其他的 Writer 中,如 IOUtils.copy(inputStream, new StringWriter())。
5. Google guava 的 CharStreams 法
package cc.unmi.test;
import java.io.*;
import com.google.common.io.CharStreams;
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);
}
}
CharSteams 不是直接作用在 InputSteam 上的,还要靠 InputStreamReader 拱个桥。
6.JDK 7 的 NIO readAllBytes 法
package cc.unmi.test;
import java.io.IOException;
import java.nio.file.*;
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);
}
}
7.借助 ByteArrayOutputStream 法
InputStream inputStream = new FileInputStream("./outfile");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int i = -1;
while ((i = inputStream.read()) != -1) {
baos.write(i);
}
System.out.println(baos.toString());
8.JDK 7 的 NIO readAllBytes
byte[] bytes = Files.readAllBytes(Paths.get("d:/sample.txt"));
String text = new String(bytes);
System.out.println(text);
关于乱码问题见 对Java字符类型的深入了解(转贴)
Java 把 InputStream 转换成 String 的几种方法的更多相关文章
- Java 里把 InputStream 转换成 String 的几种方法
我们在 Java 中经常会碰到如何把 InputStream 转换成 String 的情形,比如从文件或网络得到一个 InputStream,需要转换成字符串输出或赋给别的变量. 未真正关注这个问题之 ...
- DataTable 转换成 Json的3种方法
在web开发中,我们可能会有这样的需求,为了便于前台的JS的处理,我们需要将查询出的数据源格式比如:List<T>.DataTable转换为Json格式.特别在使用Extjs框架的时候,A ...
- JavaScript进阶(四)js字符串转换成数字的三种方法
js字符串转换成数字的三种方法 在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b. ...
- 用jquery解析JSON数据的方法以及字符串转换成json的3种方法
用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是 json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject ...
- js 字符串转换成数字的三种方法
在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b.value,因为他们都是字符串形 ...
- JavaScript字符串转换成数字的三种方法
在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b.value,因为他们都是字符串形 ...
- python将字符串转换成字典的几种方法
当我们遇到类似于{‘a’:1, 'b':2, 'c':3}这种字符串时,想要把它转换成字典进行处理,可以使用以下几种方法: 1. Python自带的eval函数(不安全) dictstr = '{&q ...
- python字符串转换成变量的几种方法
个人比较喜欢用第三种方法 var = "This is a string" varName = 'var' s= locals()[varName] s2=vars()[varNa ...
- map转换成JSON的3种方法
http://www.json.cn/JSON格式校验 1 json-lib <dependency> <groupId>net.sf.json-lib</groupId ...
随机推荐
- equals和==的区别
---恢复内容开始--- equals:用于判断两个变量是否是对同一个对象的引用,即堆中的内容是否相同. 1.第一:对象不同,内容相同: ==:等于.比较两个地址是不是一样的(地址一样值肯定一样)(比 ...
- 阿里云服务器Linux CentOS安装配置(四)yum安装tomcat
阿里云服务器Linux CentOS安装配置(四)yum安装tomcat 1.yum -y install tomcat 执行命令后,会帮你把jdk也安装好 2.tomcat安装目录:/var/li ...
- PHP和HTML代码混合编译的三种方法
第一种是在HTML中加PHP. 大段大段的html代码中,在各个需要执行php的地方<?php .... ?> 比如 line7-9: 1 <head> 2 <meta ...
- JSP数据交互
JSP数据交互 一.jsp中java小脚本 1.<% java代码段%> 2.<% =java表达式%>不能有分号 3.<%!成员变量和函数声明%>二.注释 1 ...
- mongodb数据库迁移
如果遇到权限问题,终极解决办法:关掉权限! 如:assertion: 18 { ok: 0.0, errmsg: "auth failed", code: 18 }等错误
- dsview
http://blog.csdn.net/gzshun/article/details/7495488 http://blog.csdn.net/hjl_1991/article/details/50 ...
- 移动应用抓包调试利器Charles
转载:http://www.jianshu.com/p/68684780c1b0 一.Charles是什么? Charles是在 Mac或Windows下常用的http协议网络包截取工具,是一款屌的不 ...
- [SharePoint 2007/2010]Query SharePoint Calendar Event
首先要搞清楚日历事件的各种类型,参考文章: http://sharepoint.microsoft.com/blog/Pages/BlogPost.aspx?PageType=4&ListId ...
- Cen0S下挂载设备
在CentOS中,如果我们要查看光驱,U盘或者要把安装包挂载到某个文件夹,我写下我的一些理解. 所谓的挂载,就是把物理设备或者文件(包含安装文件,压缩包等等),与系统中的某个目录建立一个快捷方式,然后 ...
- python csv用法
csv打开文件的时候,如下代码,出错: import csv name = "D:\\selenium\\data\\name.csv" inf= csv.reader(open( ...