字节流和字符流读取的文件的数据都是一堆我们人类看不懂的数字,熟悉ASCII表的可能还能看得懂英文字母(字符估计就够呛了),怎样转换一下让我们能看的懂呢?方法有很多,下面将通过例子来逐一实现他们。

1、我们首先想到的恐怕非InputStreamReader了,把字节流转成字符流不就行了吗。

@Test
public void inputStream2String(){try (FileInputStream fis = new FileInputStream("test.txt");BufferedReader br = new BufferedReader(new InputStreamReader(fis))){StringBuilder sb = new StringBuilder();String line = null;boolean firstLine = true;while ((line = br.readLine())!=null){if (!firstLine){sb.append(System.getProperty("line.separator"));  //如果不是第一行,添加系统换行符} else {firstLine = false;}sb.append(line);}System.out.println(sb.toString());} catch (IOException e){e.printStackTrace();}
}

2、其实我们还有更简单的方法,根本不用经过字节流,而且还省了对换行符的判断。

@Test
public void inputStream2String(){try (FileInputStream fis = new FileInputStream("test.txt")){StringBuilder sb = new StringBuilder();byte[] bytes = new byte[1024];int len = 0;while ((len=fis.read(bytes))!=-1){sb.append(new String(bytes, 0, len));}System.out.println(sb.toString());} catch (IOException e){e.printStackTrace();}
}

3、上面的方法有很多重复性代码是固定的,可以提出来,所以就有了第三方库帮我们做好了这一切,使用Apache的IO库,代码会更简洁。

这里使用的是Maven加载的依赖,目前最新jar包是2017年的,还没有出新的。添加的依赖如下:

<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version>
</dependency>

Java代码很简单

@Test
public void inputStream2String(){try (FileInputStream fis = new FileInputStream("test.txt")){String string = IOUtils.toString(fis, StandardCharsets.UTF_8);  //不指定编码方式的toString在2.5被遗弃了System.out.println(string);} catch (IOException e){e.printStackTrace();}
}

IOUtils.toString的进一步封装。

@Test
public void inputStream2String(){File file = new File("test.txt");try {//这个方法的底层还是使用的IOUtils.toString实现的//并且使用了try-with-resource,自动关闭流String string = FileUtils.readFileToString(file, StandardCharsets.UTF_8);System.out.println(string);} catch (IOException e) {e.printStackTrace();}
}

这个类库还有两种方式具体代码就不写了,只把方法贴上:

  • IOUtils.readLines(final InputStream input, final Charset encoding)
  • Files.readLines(final File file, final Charset encoding) 这个方法是上面方法的封装

4、既然你Apache实现了这个工具,那我Guava岂能甘为人后。

@Test
public void inputStream2String(){try (FileInputStream fis = new FileInputStream("test.txt");BufferedReader bf = new BufferedReader(new InputStreamReader(fis))){//提示这是Beta版本,不稳定//接收的参数为ReadableString string = CharStreams.toString(bf);System.out.println(string);} catch (IOException e){e.printStackTrace();}
}

5、Guava还有一种方式,按行读取。

@Test
public void inputStream2String(){try (FileInputStream fis = new FileInputStream("test.txt");InputStreamReader isr = new InputStreamReader(fis);BufferedReader br = new BufferedReader(isr)){List<String> stringList = CharStreams.readLines(br);System.out.println(stringList.toString());} catch (IOException e) {e.printStackTrace();}
}

6、使用Java7的java.nio.file.Files实现读取,也很简单。但是这个方法是一次性把文件所有内容全部读进内存,容易造成stack overflow。

@Test
public void inputStream2String(){try{byte[] bytes = Files.readAllBytes(Paths.get("test.txt"));String string = new String(bytes);System.out.println(string);} catch (IOException e) {e.printStackTrace();}
}

7、使用Jdk5的Scanner,同时支持英文和中文。

@Test
public void inputStream2String(){try (FileInputStream fis = new FileInputStream("test.txt")){Scanner scanner = new Scanner(fis, StandardCharsets.UTF_8);while (scanner.hasNext()){System.out.println(scanner.next());}} catch (IOException e){e.printStackTrace();}
}

8、最后一种权当了解,没啥实际用途,只适合文件中包含英文字母或者字符的。

@Test
public void inputStream2String(){try (FileInputStream fis = new FileInputStream("test.txt")){int read = fis.read();while (read != -1){System.out.println("read = " + (char)read);read = fis.read();}} catch (IOException e){e.printStackTrace();}
}

总结

这么多种方法,推荐使用apache或者gson的第三方库。不过gson目前还是测试版本,悠着点。

如何把InputStream字节流和InputStreamReader字符流转换成我们能看懂的String字符串相关推荐

  1. 将接收的二进制流转换成图片保存

    将接收的二进制流转换成图片保存 /*** 将接收的二进制流转换成图片保存* * @param imgByte* 二进制流* @param imgPath* 图片的保存路径* @param imgNam ...

  2. 可以通过parallel()把顺序流转换成并行流

    先贴上几个案例,水平高超的同学可以挑战一下: 从员工集合中筛选出salary大于8000的员工,并放置到新的集合里. 统计员工的最高薪资.平均薪资.薪资之和. 将员工按薪资从高到低排序,同样薪资者年龄 ...

  3. 小程序向java后台发送图片_微信小程序在后台如何将二进制流转换成图片

    我在前端请求了小程序码返回的是一堆乱码, java不太熟网上找了一个方法可以将二进制流和图片互转,但是从微信小程序码接口获取的数据用这个方法无法获取正确的图片,不知道哪里有问题: 有没有只在前端就能获 ...

  4. python图片二进制流转换成图片_微信如何将图片转换成word文字

    每天和手机微信相依为命,小编想问问你们,对于微信的使用,你到底了解多少?比如,你知道原来微信也可以随时翻译多国语言,可以把图片直接转换成你需要的大片文字吗? 微信上的这些小技巧,你知道多少? 本文将为 ...

  5. python图片二进制流转换成图片_python将图片二进制数据转换成Django file对象

    来自django.core.file的二进制数据,来自于来自django.core.file的二进制数据,来自于前端摄像头uwsgi套接字的djanyUploadedFilefrom io IMPOR ...

  6. 将centos字符编码换成utf-8

    1.mysql支持中文 http://blog.csdn.net/ouitiken/article/details/23171327 2.修改centos支持中文,并于mysql字符集一样为utf-8 ...

  7. 微信小程序getWXACodeUnlimit接口调用和返回二进制流转换成图片保存到本地

    微信小程序获取无限制带参数二维码后台接口请求处理 第一步简单无坑GET请求把你的appid和appsecret拼接起来的URL会返回一个ACCESS_TOKEN public static Strin ...

  8. python图片二进制流转换成图片_将图像(np.数组)转换为二进制imag

    谢谢你阅读我的问题. 我是python新手,对scipy很感兴趣.我正试图弄清楚如何将浣熊的图像(在scipy misc中)转换成二进制图像(黑白).这不是在scipy讲座教程中教的. 到目前为止这是 ...

  9. java字符串转字节流_java 字节→字符转换流

    OutputStreamWriter:把字节输出流对象转成字符输出流对象 InputStreamReader:把字节输入流对象转成字符输入流对象 FileWriter和FileReader分别是Out ...

最新文章

  1. Android 触摸事件处理机制
  2. VS2008中自定义C++工程模板与修改新建文件默认编码的办法
  3. java编写统计玩家总数的程序_JAVA程序:输出一组数后如何统计特定数的总数
  4. # 解析bt文件_磁力链接和BT种子使用方法
  5. opencv6-调整图像亮度和对比度
  6. 中国中医科学院院长黄璐琦发表2022年新春贺词
  7. JAVA IO系列----ObjectInputStream和ObjectOutputStream类
  8. java indexof 通配符,字符串与含有通配符‘*’的字符串匹配(非正则表达式)
  9. autoline 手册
  10. AlexNet原理及tensorflow实现
  11. 5、Fiddler如何捕获HTTPS会话
  12. 比特币矿池是什么意思
  13. SET NOCOUNT
  14. dicom worklist下载病例程序/dicom worklist scu (c#版本)
  15. 内网通v3.1.2141无捆绑绿色官方版
  16. MySQL自增主键值回溯问题
  17. 用户浏览器会话跟踪技术Cookie和Session
  18. 【HDU No. 1317】 游戏玩家
  19. 日野汽车数据作假召开记者招待会
  20. HDR视频色调映射算法(之四:Display adaptive TMO)

热门文章

  1. 光速搭建centos7虚拟机
  2. 漫画 | 媳妇,去帮我放水泡个澡~
  3. 捷联惯导算法(四)姿态更新算法
  4. 584. 寻找用户推荐人
  5. 批处理获取系统安装时间/系统开机时间/电脑唤醒时间及开机使用时间(二)完成
  6. html代码硬件加速优化,详解CSS3开启硬件加速的使用和坑
  7. C# 集合-并发处理
  8. 微信开发者工具C盘占用大的问题
  9. Django框架简介-初级(简单留言板)
  10. 最短路径flody算法