Java FileInputStream与FileReader的区别

<div id="cnblogs\_post\_body" class="blogpost-body"><p>在解释Java中FileInputStream和FileReader的具体区别之前,我想讲述一下Java中InputStream和Reader的根本差异,以及分别什么时候使用InputStream和Reader。实际上, InputStream和Reader都是抽象类,并不直接地从文件或者套接字(socket)中读取数据。然而,它们之间的主要差别在于:InputStream用于读取二进制数据(字节流方式,译者注),Reader用于读取文本数据(字符流方式,译者注),准确地说,Unicode字符。那么,二进制数据和文本数据的区别是什么呢?当然,所有读取的东西本质上是字节,然后需要一套字符编码方案,把字节转换成文本。Reader类使用字符编码来解码字节,并返回字符给调用者。Reader类要么使用运行Java程序平台的默认字符编码,要么使用Charset对象或者String类型的字符编码名称,如“UTF-8”。尽管它是一个最简单的概念,当读取文本文件或从套接字中读取文本数据时,很多Java开发者会因没有指定字符编码而犯错。记住,如果你没有指定正确的编码,或者你的程序没有使用的协议中已存在的字符编码,如HTML的 “Content-Type(内容类型)”、XML文件头指定的编码,你可能无法正确地读取的所有数据。一些不是默认编码呈现的字符,可能变成“?”或小方格。一旦你知道stream和reader之间的根本区别,理解FileInputStream和FileReader之间的差异就很容易了。既可以让你从文件中读取数据,然而FileInputStream用于读取二进制数据,FileReader用来读取字符数据。</p> <h1>Java中FileReader vs FileInputStream</h1> <p>由于FileReader类继承了InputStreamReader类,使用的字符编码,要么由类提供,要么是平台默认的字符编码。请记住,InputStreamReader会缓存的字符编码。创建对象后,设置字符编码将不会有任何影响。让我们来看看如何使用Java中InputStream和FileReader的例子。你可以提供任何一个文件对象或一个包含文件位置的字符串,以开始读取文件的字符数据。这类似于FileInputStream,也提供了类似的用于读取文件源的构造函数。尽管建议使用BufferedReader来读取文件数据。</p> <div class="cnblogs\_code"><div class="cnblogs\_code\_toolbar"><span class="cnblogs\_code\_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="https://my.oschina.net//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre><span style="color: #008080;"> 1</span> <span style="color: #0000ff;">import</span><span style="color: #000000;"> java.awt.Color; </span><span style="color: #008080;"> 2</span> <span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.FileInputStream; </span><span style="color: #008080;"> 3</span> <span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.FileReader; </span><span style="color: #008080;"> 4</span> <span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.IOException; </span><span style="color: #008080;"> 5</span> <span style="color: #008080;"> 6</span> <span style="color: #008000;">/\*\*</span> <span style="color: #008080;"> 7</span> <span style="color: #008000;"> \* Java程序通过字节流和字符流的方式来读取文件数据。 </span><span style="color: #008080;"> 8</span> <span style="color: #008000;"> \* 需强调FileInputStream和FileReader的关键区别在于:FileReader用于读取字符流,而FileInputStream用来读取原始字节流。 </span><span style="color: #008080;"> 9</span> <span style="color: #008000;"> \* </span><span style="color: #808080;">@author</span><span style="color: #008000;"> Javin Paul </span><span style="color: #008080;">10</span> <span style="color: #008000;">\*/</span> <span style="color: #008080;">11</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> HowToReadFileInJava { </span><span style="color: #008080;">12</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String args\[\]) { </span><span style="color: #008080;">13</span> <span style="color: #008080;">14</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 例1 – 使用FileInputStream 读取文件内容</span> <span style="color: #008080;">15</span> <span style="color: #0000ff;">try</span> (FileInputStream fis = <span style="color: #0000ff;">new</span> FileInputStream("data.txt"<span style="color: #000000;">)) { </span><span style="color: #008080;">16</span> <span style="color: #0000ff;">int</span> data =<span style="color: #000000;"> fis.read(); </span><span style="color: #008080;">17</span> <span style="color: #0000ff;">while</span> (data != -1<span style="color: #000000;">) { </span><span style="color: #008080;">18</span> <span style="color: #000000;"> System.out.print(Integer.toHexString(data)); </span><span style="color: #008080;">19</span> data =<span style="color: #000000;"> fis.read(); </span><span style="color: #008080;">20</span> <span style="color: #000000;"> } </span><span style="color: #008080;">21</span> } <span style="color: #0000ff;">catch</span><span style="color: #000000;"> (IOException e) { </span><span style="color: #008080;">22</span> System.out.println("Failed to read binary data from File"<span style="color: #000000;">); </span><span style="color: #008080;">23</span> <span style="color: #000000;"> e.printStackTrace(); </span><span style="color: #008080;">24</span> <span style="color: #000000;"> } </span><span style="color: #008080;">25</span> <span style="color: #008080;">26</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 例2 – Java中使用FileReader 读取文件数据</span> <span style="color: #008080;">27</span> <span style="color: #0000ff;">try</span> (FileReader reader = <span style="color: #0000ff;">new</span> FileReader("data.txt"<span style="color: #000000;">)) { </span><span style="color: #008080;">28</span> <span style="color: #0000ff;">int</span> character =<span style="color: #000000;"> reader.read(); </span><span style="color: #008080;">29</span> <span style="color: #0000ff;">while</span> (character != -1<span style="color: #000000;">) { </span><span style="color: #008080;">30</span> System.out.print((<span style="color: #0000ff;">char</span><span style="color: #000000;">) character); </span><span style="color: #008080;">31</span> character =<span style="color: #000000;"> reader.read(); </span><span style="color: #008080;">32</span> <span style="color: #000000;"> } </span><span style="color: #008080;">33</span> } <span style="color: #0000ff;">catch</span><span style="color: #000000;"> (IOException io) { </span><span style="color: #008080;">34</span> System.out.println("Failed to read character data from File"<span style="color: #000000;">); </span><span style="color: #008080;">35</span> <span style="color: #000000;"> io.printStackTrace(); </span><span style="color: #008080;">36</span> <span style="color: #000000;"> } </span><span style="color: #008080;">37</span> <span style="color: #000000;"> } </span><span style="color: #008080;">38</span> }</pre> <div class="cnblogs\_code\_toolbar"><span class="cnblogs\_code\_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="https://my.oschina.net//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <p><span>输出:</span></p> <div class="cnblogs\_code"> <pre><span style="color: #008080;">1</span> <span style="color: #000000;">4157532d416d617a6f6e205765622053657276696365da474f4f472d476f6f676c65da4150504c2d4170706c65da47532d476f6c646d616e205361636873 </span><span style="color: #008080;">2</span> AWS-<span style="color: #000000;">Amazon Web Service </span><span style="color: #008080;">3</span> GOOG-<span style="color: #000000;">Google </span><span style="color: #008080;">4</span> APPL-<span style="color: #000000;">Apple </span><span style="color: #008080;">5</span> GS-Goldman Sachs</pre> </div> <p><a href="http://www.importnew.com/?attachment\_id=11538"><img class="wp-image-11538" src="http://cdn1.importnew.com/2014/05/685fbd0d417da350bd85432eb6f42dc7.jpg" alt=""></a></p> <p>第1个例子是按字节从文件中读取数据,因此势必会非常慢。FileInputStream的read() 方法是阻塞式的,读取字节或数据块,直到无数据输入。它要么返回数据的下一个字节,当到达文件末尾时,返回-1。这意味着,我们每循环读取一个字节,将其打印为十六进制字符串。顺便说一句,将InputStream转换成字节数组是可选的。另一方面,例2是按字符读取数据。继承自FileReader的InputStreamReader 的read() 方法读取单个字符,并返回该字符,当到达流末尾时,返回-1。这就是为什么你看到例2输出的文字跟文件中的完全一样。</p> <p>这就是所有关于Java中FileInputStream和FileReader之间的区别。归根结底:使用FileReader或BufferedReader从文件中读取字符或文本数据,并总是指定字符编码;使用FileInputStream从Java中文件或套接字中读取原始字节流。</p> <p>&nbsp;</p> <p><span>原文链接:&nbsp;</span><a class="external" href="http://javarevisited.blogspot.com/2014/04/difference-between-fileinputstream-and-filereader-in-java.html" rel="nofollow" target="\_blank">javarevisited</a><span>&nbsp;翻译:&nbsp;</span><a href="http://www.importnew.com/">ImportNew.com&nbsp;</a><span>-&nbsp;</span><a href="http://www.importnew.com/author/era\_misa">era\_misa</a><br><span>译文链接:&nbsp;</span><a href="http://www.importnew.com/11537.html">http://www.importnew.com/11537.html</a><br><span>\[&nbsp;</span><span><strong>转载请保留原文出处、译者和译文链接。</strong></span><span>\]</span></p></div>
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )