前面了解了流的概念。本节探讨如何通过FileInputStream读取本地文件。本地文件是指存储在本地磁盘中的文件,我们存储到电脑中的图片、视频、音乐、文档资料都属于本地文件。

这些本地文件都可以用相对应的程序打开。图片可以用Windows自带的照片查看器或画图程序打开查看;音乐和视频可以用Windows自带的Media Player或暴风影音等播放器打开;文档资料可以用办公软件Word等程序打开编辑。这些程序在开发过程中,都需要使用编程语言提供的文件读写技术。

在介绍文件读写技术之前,有必要先了解一下二进制文件和文本文件。其实二进制文件和文本文件在物理存储上并没有什么区别,存储在硬盘上的文件都是以二进制方式存储的。二者的区别在于解释数据的逻辑不同。程序读取文本文件时,可以以字符方式读取,也可以以字节方式读取,将读取的数据解释为ASCII或unicode编码,也就是解释为字符,读取的字符可以直接输出到屏幕上显示出来;当程序读取二进制文件时,是以字节方式读取的,对读取数据的解释由读取程序决定。如读取图片文件时,读取图片的程序需要了解该文件的结构,并解释读取的数据,如果不了解该图片文件的结构,读取图片文件就会失败,也就无法把图片显示出来了。

从前面的讨论可知,Java提供的FileInputStream类适合于读取二进制文件,而不太适合读取文本文件。当然也可以读取文本文件,不过需要做相应地读取处理,否则遇到中文就会出现乱码。

用FileInputStream读取文件流程如下:

图 16-6 用FileInputStream读取文件过

用FileInputStream读取文件时,可以先用File类打开本地文件,然后实例化FileInputStream对象时,传入已打开文件的File对象,就可以调用FileInputStream的read方法从文件读取数据了。

FileInputStream也提供了另外一种构造方法,该构造方法直接传入文件的存储路径,而无需实例化File对象。该构造方法把实例化File对象的语句放到了构造方法里面。

例1:使用FileInputStream的read()方法读取文本文件。

例子程序用FileInputStream读取文本文件,被读取的文本文件存储在D盘根目录下,文件名称为read.txt。使用FileInputStream读取文件数据之前,需要先实例化File对象,File类的构造方法要求传入被读取的文件路径。然后,实例化FileInputStream对象,并通过FileInputStream类的构造方法传入已实例化的File对象。因为FileInputStream在实例化过程中可能会抛出异常,因此需要用try-catch语句捕获异常。

FileInputStream类提供了多种读取文件的方法,例子程序使用了read()方法,该方法用于从输入流中读取数据的下一个字节,并返回读到的字节值,若遇到流的末尾,返回-1。程序通过while循环读取文件的所有数据,每读取一个字节就输出到控制台,输出之前需要做类型转换,将整型转换为字符输出。程序输出结果如下图所示:

图 16-7 例1示例程序程序输出结果

例子程序的read()方法只能一个字节一个字节地读取。FileInputStream类还提供了read(byte[] b) 方法读取文件数据,该方法用于从输入流中读取b.length个字节的数据,并将数据存储到缓冲区数组b中,返回的是实际读到的字节数。

例2:使用FileInputStream的read(byte[] b)方法读取文本文件。

FileInputStream类提供了一个available()方法,该方法在读取本地文件时,返回文件的总字节数。程序声明了一个byte数组,并通过new关键字分配与被读取文件大小相同的空间,然后调用read(byte[] b)方法一次性读取文件全部数据。

显示中文乱码的问题

如果文本文件含有中文字符,建议使用read(byte[] b)方法读取整个文本文件,并将读取文件后的byte数组转换为字符串类型,这样做的好处是不会出现乱码。

修改read.txt文件,加入英文诗句的中文翻译,用例1程序读取文件,输出结果如下图所示:

图 16-8 例1读取含中文内容的文件输出

从输出结果可以看出,英文诗句下面的中文翻译显示为乱码。原因是FileInputStream类read()方法每次读取文件都是按照1个字节读取的,而中文字符都是用两个字节表示的,输出时自然就乱码了。

另外,在Java语言中,中文和英文字符默认都被处理为unicode编码,unicode编码都是用两个字节表示一个字符,既然中文和英文都是用2个字节表示一个字符,为什么英文字符输出没有问题呢?原因是在unicode编码中,英文字符依然是ASCII编码,多出的一个字节值为0没有用到。

使用例2程序读取read.txt文件,程序输出结果如下图所示:

图 16-9 例2读取含中文内容的文件输出

从图中可以看出,使用read(byte[] b)方法可以正确读取含中文内容的文本文件。

■ 知识点拨

FileInputStream一般用来读取二进制文件,如果要读取文本文件,建议使用FileInputStream的read(byte[] b)方法读取整个文本文件,并将读取文件后的byte数组转换为字符串类型。用循环语句读取文件时,必须设定中止循环条件,一般以读取到文件尾部为中止条件。

java 读取文件inputstream_使用FileInputStream读取本地文件相关推荐

  1. java通过url获取网页内容_Java语言通过URL读取网页数据并保存到本地文件(代码实例)...

    本文主要向大家介绍了Java语言通过URL读取网页数据并保存到本地文件(代码实例),通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. Java通过URL读取网页数据并保存到本地文件(代码 ...

  2. Java抓取起点小说输出到本地文件夹和数据库

    Java抓取起点小说输出到本地文件夹和数据库 目录 项目结构 所需插件 项目代码 输出结果 目录 项目结构 第一次写网络爬虫,参考了别人的,也自己理解了用法 所需插件 因为使用了mevan,直接上po ...

  3. scp复制本地文件到远程服务器,scp 本地文件到远程服务器

    linux中scp命令的使用 linux远程拷贝文件命令:scp(scp:secure corp)(1)从本地拷贝文件到远程服务器scp/opt/script/test.pl root@192.168 ...

  4. 云服务器 与本地文件传输,云服务器 与本地文件传输

    云服务器 与本地文件传输 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器上分别安装数 ...

  5. Github 之删除文件或者文件夹(不影响本地文件,只删除远端的指定文件或者文件夹) 操作

    Github 之删除文件或者文件夹(不影响本地文件,只删除远端的指定文件或者文件夹) 操作 目录 Github 之删除文件或者文件夹(不影响本地文件,只删除远端的指定文件或者文件夹) 操作 一.简单介 ...

  6. 跨服务器获取文件shell,shell脚本实现本地文件与服务器文件同步

    为何创建此脚本是因为方便项目的布署,不需要手动地去同步不同的项目,而只需要简单的执行shell脚本,输入项目名就能发布到服器上. 1.shell文件代码 #!/bin/sh read -t 30 -p ...

  7. java 读写文件乱码_Java 解决读写本地文件中文乱码的问题

    Java 解决读写本地文件中文乱码的问题 前言: 在用Java程序进行读写含中文的txt文件时,经常会出现读出或写入的内容会出现乱码.原因其实很简单,就是系统的编码和程序的编码采用了不同的编码格式.通 ...

  8. java web打开文件_Java web 如何打开本地文件夹?

    使用情景 有一个只在一台 Windows7 上使用的 Java web 项目,浏览器是 Chrome.它需要点击一个链接可以打开指定的本地文件夹,目录会有中文. 服务器环境 Jdk1.7.Tomcat ...

  9. 文件包含原理及本地文件包含漏洞演示(本地文件,远程包含文件的测试)

    一.文件包含漏洞概述 1.定义:文件包含漏洞是一种最常见的漏洞类型,它会影响依赖于脚本运行时的web应用程序.当应用程序使用攻击者控制的变量构建可执行代码的路径时,文件包含漏洞会导致攻击者任意控制运行 ...

  10. python保存数据到本地文件_python保存数据到本地文件的方法

    python保存数据到本地文件的方法 1.保存列表为.txt文件 #1/list写入txt ipTable = ['158.59.194.213', '18.9.14.13', '58.59.14.2 ...

最新文章

  1. 你多久没换过壁纸了?新年了,换一换吧!
  2. Spring boot的Web开发
  3. 推荐系统炼丹笔记:阿里推荐算法特征交叉新方式CAN
  4. js基础--变量、数据类型、循环、判断、函数定义
  5. 持续交付2.0 pdf_半导体检测设备厂商Advantest与美最大半导体数据分析商PDF展开合作...
  6. mysql bit php,Bit Web Server (PHP,MySQL,PMA) 安卓WEB服务器
  7. 利用HUtool读取Excel内容
  8. HDOJ-1050-Moving Tables(nyoj220)
  9. 这么好的视频不看吗?深度学习和线代,微积分
  10. 快速排序时间复杂度分析推导
  11. ubuntu安装deep-wine下载qq,tim等文件
  12. java json接口加密解密
  13. Spring Boot(八)——Shiro+FreeMarker
  14. “今天星期五“-SAP SE09/STMS 请求号传输中遇到的错误及解决方案
  15. 蒲公英智能云数据管理|蒲公英智能云|TARA
  16. 微信支付失败-1彻底扫坑
  17. 具有硬件依赖性的计算机语言,具有硬件依赖性的计算机语言,被称为低级语言。下列哪些是低级语言?...
  18. Excel技能之实用技巧,高手私藏
  19. 一线互联网企业高级Android工程师面试题大全,含小米、腾讯、阿里
  20. 【报告分享】 2020年汽车产销数据及汽车工业运行情况-中国汽车工业协会(附下载)

热门文章

  1. 以下选项属于python哲学内容的是_[南开大学]18秋学期(清考)《哲学与人生》在线作业...
  2. Sam版Matlab粒子群PSO工具已经更新
  3. java-IO流基础知识
  4. 群晖nas不能修改php.ini,群晖nas 修改nginx配置的问题
  5. linux认证加k8s认证,如何快速验证您的Kubernetes配置文件?
  6. 老人与海好词100英文带翻译_英语好词好句摘抄 老人与海 英文版 好词好句摘抄...
  7. [ XJTUSE ]JAVA语言基础知识——7.11 JTree、TreeModel实现树
  8. 大学生川菜网页制作教程 学生HTML静态美食菜品网页设计作业成品 简单网页制作代码 学生美食网页作品免费设计
  9. aliyun资源编排 介绍和实例
  10. php zip压缩包下载