java fileinputreader_Java FileInputStream与FileReader的区别-程序员宅基地

技术标签: java fileinputreader  

在解释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用来读取字符数据。

Java中FileReader vs FileInputStream

由于FileReader类继承了InputStreamReader类,使用的字符编码,要么由类提供,要么是平台默认的字符编码。请记住,InputStreamReader会缓存的字符编码。创建对象后,设置字符编码将不会有任何影响。让我们来看看如何使用Java中InputStream和FileReader的例子。你可以提供任何一个文件对象或一个包含文件位置的字符串,以开始读取文件的字符数据。这类似于FileInputStream,也提供了类似的用于读取文件源的构造函数。尽管建议使用BufferedReader来读取文件数据。我把我的eclipse的file.encoding设置成了UTF-8,然后再c盘新建一个data.txt并且输入一个永字,用记事本打开另存为UTF-8编码。这个时候我们在eclipse中运行程序,可以看到data.txt的打印二进制内容是efbbbfe6b0b8(通过Notepad++的HEX-Editor插件查看data.txt文件十六进制内容可以验证这一点),说明FileInputStream没有进行任何编码转换把data.txt的二进制内容读入java变量中。我们再来看下面一行输出  feff6c38永  就会发现FileReader通过UTF-8读取文件,然后对文件进行了编码,使其转换成unicode编码存入java变量中,这样才能在java中正确使用,因为java存储在内存里的变量都是unicode编码。如果我们把data.txt另存为ANSI(GBK)编码,FileReader还是通过UTF-8读取文件,然后对文件进行了unicode编码就会出现乱码问题。如果把eclipse的file.encoding设置成了GBK再运行程序就会打印正常,如下

d3c0

6c38永

另存为UTF-8输出:

另存为ANSI(GBK)输出:

685fbd0d417da350bd85432eb6f42dc7.jpg

第1个例子是按字节从文件中读取数据,因此势必会非常慢。FileInputStream的read() 方法是阻塞式的,读取字节或数据块,直到无数据输入。它要么返回数据的下一个字节,当到达文件末尾时,返回-1。这意味着,我们每循环读取一个字节,将其打印为十六进制字符串。顺便说一句,将InputStream转换成字节数组是可选的。另一方面,例2是按字符读取数据。继承自FileReader的InputStreamReader 的read() 方法读取单个字符,并返回该字符,当到达流末尾时,返回-1。这就是为什么你看到例2输出的文字跟文件中的完全一样。

这就是所有关于Java中FileInputStream和FileReader之间的区别。归根结底:使用FileReader或BufferedReader从文件中读取字符或文本数据,并总是指定字符编码;使用FileInputStream从Java中文件或套接字中读取原始字节流。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_36415235/article/details/114737990

智能推荐

图像拼接代码汇总_图像拼接算法代码-程序员宅基地

文章浏览阅读2.9k次,点赞11次,收藏33次。图像拼接代码汇总_图像拼接算法代码

微信小程序中添加锚点的设置_微信小程序中可以通过a标签加锚吗-程序员宅基地

文章浏览阅读796次。在html中我们可以很轻松的添加锚点设置, 只需要一个# 就可以了,但是在 vue 和 微信小程序这种单页面的程序中怎么办呢,下面以小程序的样例介绍一下, vue的和小程序的开发方式差不多。使用 wx.scrollTo来让页面滚动到位置就可以了 别忘了, boundingClientRect 后面要跟上 .exec() 才可以。很明显, 点击的按钮上我们绑定了一个 bindtap = gotocard 的事件, 下面看一下 事件的执行函数。我们要的效果是 点击上面的名片, 跳转到下面的名片位置。_微信小程序中可以通过a标签加锚吗

编译原理 自下而上分析题型_g:e→e+t| e-t|t t→t*f| t/f|f f→(e)|i语法分析程序-程序员宅基地

文章浏览阅读2k次,点赞2次,收藏11次。前言自下而上分析法是“移进——归约”法从输入串开始,逐步进行“归约”,直至归约到文法的开始符号规范规约简述短语已知文法语法树,任一子树的叶子结点就是短语直接短语当子树不包含其他更小的子树时,该子树叶节点所组成的字符串就是该句型的直接短语句柄:一个句型的最左直接短语称为该句型的句柄素短语至少含有一个终结符,而且除他之外不含有其他素短语的短语例:G: E..._g:e→e+t| e-t|t t→t*f| t/f|f f→(e)|i语法分析程序

在当前文件下打开终端的快捷键_在当前目录下打开终端快捷键-程序员宅基地

文章浏览阅读1.6k次。目前没有更好的直接在当前目录打开终端的方法,只能用键盘模拟鼠标右键,然后按e打开shift + F10然后按下e_在当前目录下打开终端快捷键

AMiner会议论文推荐第三十八期_multiplex bipartite network embedding using dual h-程序员宅基地

文章浏览阅读274次。AMiner平台由清华大学计算机系研发,拥有我国完全自主知识产权。平台包含了超过2.3亿学术论文/专利和1.36亿学者的科技图谱,提供学者评价、专家发现、智能指派、学术地图等科技情报专业化服务。系统2006年上线,吸引了全球220个国家/地区1000多万独立IP访问,数据下载量230万次,年度访问量超过1100万,成为学术搜索和社会网络挖掘研究的重要数据和实验平台。ICLR 2021 论文推荐Topology-Aware Segmentation Using Discrete Morse Theo._multiplex bipartite network embedding using dual hypergraph convolutional ne

ubuntu 按shift进不去grub…_ubuntu按住shift不能进入恢复模式-程序员宅基地

文章浏览阅读1.3w次,点赞11次,收藏21次。重启电脑进不去grub 模式惠普电脑 ubuntu 18.04进入recovery mode的方法:ctrl + alt + delete 重启电脑,长按F9 进入 Boot Menu ,选择第一个Ubuntu ,这时长按shift 并 ESC 进入ubuntu 高级模式,在高级模式里面选择 recovery mode …..._ubuntu按住shift不能进入恢复模式

随便推点

ng-alain懒加载模块 未添加导致NZ模块未识别Can't bind to 'nzExtra' since it isn't a known property of 'nz-card-程序员宅基地

文章浏览阅读2.2k次。ng-alain懒加载模块 未添加导致NZ模块未识别Can't bind to 'nzExtra' since it isn't a known property of 'nz-card'.1. If 'nz-card' is an Angular component and it has 'nzExtra' input, then verify that it is part of this..._nzextra

Object.create()详解_status_object_create-程序员宅基地

文章浏览阅读2.4k次。Object.create() 方法会使用指定的原型对象及其属性去创建一个新的对象。语法Object.create(proto, [ propertiesObject ])参数proto一个对象,应该是新创建的对象的原型。propertiesObject可选。该参数对象是一组属性与值,该对象的属性名称将是新创建的对象的属性名称,值是属性描述符(这些属性描述符的结构与Obje_status_object_create

python去掉人像白边_python 使用plt画图,去除图片四周的白边方法-程序员宅基地

文章浏览阅读1.9k次。python 使用plt画图,去除图片四周的白边方法用matplotlib.pyplot画的图,显示和保存的图片周围都会有白边,可以去掉。为了显示的更清楚,给图片加了红色的框代码“`import matplotlib.pyplot as pltfig, ax = plt.subplots()im = im[:, :, (2, 1, 0)]ax.imshow(im, aspect='equal')p..._python画图不要坐标轴外白色框

乾坤 微前端_微前端 qiankun 项目实践 !!! 防踩坑指南-程序员宅基地

文章浏览阅读1.7k次。作者:zxh1307导语最近在做微前端的项目 , 过程中真是踩了不少坑 , 在有限的资料中不断试错 , 默默无语两行泪 哈哈. 在此次将采坑部分都记录下来, 让更多的人少走点弯路 , 此项目使用 蚂蚁金服qiankun 为基础作为开发 . 话不多说 开讲 !!!那什么是 qiankun 呢qiankun 是一个基于 single-spa 的微前端实现库,旨在帮助大家能更简单、无痛的..._乾坤 手动刷新页面

高通QFIL刷机指南-程序员宅基地

文章浏览阅读2w次,点赞6次,收藏62次。文章目录1、通过QFIL刷机2、工具下载1、通过QFIL刷机1) 刷机需要进入9008刷机模式,在CMD窗口里,输入adb devices检查是否连接设备,然后输入adb reboot edl 进入9008刷机模式。2) 双击打开QFIL烧录工具,选择Configuration 配置,勾选Reset after Download 和Erase All Before Download备注(不需要全擦下载时,可以去勾选:Erase All Before Download)3) selectport_qfil

【Linux学习】虚拟机VMware 安装Qt5 一条龙讲解_虚拟机安装qt-程序员宅基地

文章浏览阅读1.4w次,点赞52次,收藏172次。如何在Linux下安装Qt5呢?Linux下安装Qt5 一条龙讲解_虚拟机安装qt