当前课程知识点:Java程序设计 > 第五章 输入输出 > 5.3.2-读文本文件 > 读文本文件
大家好
欢迎回来继续学习
Java语言程序设计
这一节我们来学习读文本文件
我要给大家介绍
怎么样从文本文件中
将信息读到程序空间中来
最后会给大家
看一个文件复制的例子
要从文本文件中读取信息
最常用的就是FlieReader和BufferedReader这两个类了
FlieReader类负责
从文本文件中读取字符
而BufferedReader类是一个缓冲器
而且它具有按行读的
这个readLine方法
这个是非常有用的
我们来看接下来的这个例子
就是从文本文件中读取数据
并且在显示器上显示出来
现在我们构造一个
文件输入流对象
想用这个对象来读取
我们先前写的这个
Hello.text这个文件
那我们就构造一个
FlieReader文件输入流对象
参数就是Hello.text的这个文件名
同样我们也在外面套一个缓冲流
以这个FlieReader对象为参数
再构造一个BufferedReader
那么这个BufferedReader它与BufferedeWriter对应
都可以识别文本的行
它也一个很有用的功能readLine
读取一行内容
读完了以后看看
读这一行是不是空
如果不是空就把它
送到显示器上显示一行
然后继续再读入一行
然后如此循环
直到读到一个空为止
就说明文件已经读完了
那么同样这些文件访问操作
都是有可能产生异常的
所以将它放在try块里面
后面用catch来捕获
如果发生了异常
捕获了就给出异常信息
也就是说告诉用户
哪个文件出问题了
那么我们要是运行这个程序
大家会看到屏幕上
会逐行显示这个Hello.txt
这个文件的内容
大家可以课后运行一下试试
或者你现在就暂停这个录像
然后你自己动手试试看
那么关于我们
见到的FlieReader对象
那么创建以后将打开文件
如果文件不存在
就会抛出一个IO异常
也就是说你要读的文件
它首先得存在
不存在您试图去
打开一个用于读的文件
那么就会抛出异常
BufferedReader类的
readLine方法是可以按行读的
读到文件尾就是返回空了
其实read类还有另外一个read方法
如果我们用read方法来读的话
怎么判文件结束呢
那么read方法呢
会返回一个表示某个字符的
这个int类型的整数
如果你读到文件尾了
它就返回负1
所以我们也可以像这样来修改
刚才这个例题中的这个程序
我们这个while循环
每次就用read来读
读一个字符写一个字符
直到read循环值是负1为止
最后就是完成了文件操作以后
要用close方法去关闭文件
下面一个例子是文件的复制
通过文件复制这样一个实例
我们可以看一看文件的
读和写操作是怎么样配合的
这个例题我们可以通过命令行
来指定源文件名和目标文件名
用命令行运行的话
用Java命令来运行
然后copy是这个程序的名字
这个sourceFile是你要复制的源
第一个参数destinationFile
是我们要复制的目标
是第二个参数
所以它在命令行中
要接收两个字符串作为参数
这里我们设计一个
这个CopyMaker类
还有一个是用来测试
这个CopyMaker类的复制功能的
我们定义一个FileCopy
主方法所在的类
这个CopyMaker类我们来看
打算定义几个方法
就定义一个对外的公有接口
一个Copy方法
这是外部可调用的
但是我们可以想象到
你既然要做复制
那么你要打开文件吧关闭文件吧
还有实质性的内容复制吧
所以我们进行功能分解
又写了三个起辅助作用的方法
都是private私有的方法
这些方法只是辅助Copy方法
完成复制功能的
在内外是看不见它的
所以它是辅助的
一个是openFiles打开文件用的
一个copyFiles
真正实施拷贝复制用的
一个是最后关闭文件用的
那这三个方法
它们的返回值都是布尔类型
如果成功的话就返回真
不成功就返回假
我们来看这是CopyMaker方法
它的数据成员的定义
有两个String引用
接下来要分别指向源文件名
和目标文件名
还有一个BufferedReader对象引用
一个BufferedeWriter对象引用
是将来要指向我们的
读写操作的流对象的
这个String类型的这个引用line
将来是要指向
我们读取的那个数据的
中间缓冲的那个数据的
现在看这个打开文件的方法
这里我们把构造
输入流对象的操作
放在try块里面
内层是一个FlieReader
输入流对象外面套了一个BufferedeWriter缓冲
也可以按行读
这个构造输出流对象的语句
也在try块里面
它们后面都有catch块来捕获
这个IO异常
同样输出流也是在FlieReader外面
套了一个BufferedeWriter
如果这些打开文件的语句
都正确了
也就是说没有发生异常
没有进入cactc块
最后会return true
如果进到任何一个catch块里面了
给出错误信息以后
就会return一个false
表示打开两个文件
这个操作总的来说是失败的
再看文件复制
copyfiles的方法中
用这个while循环
来读一行写一行
首先进入while之前
读一行做好准备
看看只要这个
读到的东西不是空的
那么就写一行再读下一行
写一行要再写一个newLine
因为你按原样复制
原来人家换行的地方
你写的也要换行
所以写一行以后
再写一个换行符
跨平台的换行符
然后再读下一行
进入下一次循环
这样的操作也是放在try块中
如果不发生错误的话
最后会return true
表示文件成功的复制完了
如果复制到中间的地方
发生什么错误的话
就会抛出异常的
这个时候会进入catch块
就return false
就表示这个复制不成功
再看这个关闭文件
也是两个try块
分别关闭两个文件
一个是复制的源
一个是复制的目标文件
如果成功的关闭的话
就会进入最后一句
return这个retValue
大家看这个方法中
我用了一个不同的策略
看前面就是说在catch里面
直接return false
或者到最后直接return true
那么这就是一个方法中
有多个出口了
那么我们以前
学的结构化程序设计
都讲这个程序模块
应该单入口单出口
好像不应该
在多个地方都有return
其实在多个不同的分支里面
直接return也是效率挺高的
也是常见的做法
那么如果我们严格的
按照结构化程序设计的思想
那么就应该设一个标记
一个boolean类型的标记
然后在不同的分支中
把它设为不同的值
比如说进入catch块
说明发生错误了
把它赋值为false
如果没有进入catch块
它就是原来的初始值就是true
那么最后我再统一的
一个地方去return这个布尔值
如果严格按照
结构化程序设计思想
那么这方法应该是写成这样的
那么前面这样的写法
包括这样的写法
多个地方return也是常见的做法
也挺好的
大家自己写程序的时候
可以根据自己的习惯
用哪种方法都行
我只是把它都演示在这儿了
现在我们来看一下这个类里面
唯一的一个对外服务接口方法
就是这个copy
它是一个公有方法
外头调用的时候
就只能调用这个copy了
这个copy将接受到的
两个参数字符串
用来赋值给源文件名
和目标文件名设置好文件名
然后它就依次
调用openFiles打开文件
copyFiles复制文件内容
最后调用closeFiles关闭文件
这三个方法它们的返回值
都是布尔类型的
所以我们用与操作
把这三个方法的返回值连接起来
如果结果是真说明
这三个操作都正确完成了
那么整个复制就完成了
那这个时候copy
它也就return了一个真
如果这三个方法中有哪个方法
是有出问题了
它返回的是假
就说明没有能够正确的完成复制
那么整个copy方法
它的返回值也就是假
好
现在我们再来看这个测试类里面
测试类里面只有一个main方法
然后我们来看首先要来判断一下
这个命令行参数
里面的参数个数是不是2个
参数个数要不是2个
就说明这个命令行参数没有写对
那就给用户一个信息
你请你正确的输入文件名
然后就结束了
当然大家也可以去改改这个程序
让它能够有一个循环
输入文件名不够的话
等待它再输入
而不是直接就终止
好吧
这里头现在我们
用的是比较简单的
当参数个数正确的时候
就在这new一个copy maker对象
直接在这儿new一个copy maker对象
然后调用它的copy方法
也不用给它一个引用名了
直接用它这个结果调用copy方法
然后就把参数0参数1
作为实参去给到copy
那么在copy里面
我们看到就会
用它来设置源文件名
目标文件名并且执行打开文件
复制文件和关闭文件操作
这就是一个简单的文件
复制的例子
我们要知道在整个
这个FileCopy里Java它编译以后
会生成几个文件会生成两个文件
一个是FileCopy.class
和CopyMaker.class
因为我们将这两个类
都放在一个Java文件中了
虽然源文件是一个
编译以后它产生的结果
是每个类一个文件
我们再倒回去看一下
看这个CopyMaker它前面没有写
这个修饰符
那就说明它不是public它是什么
是default是默认的类型
它的访问控制权限是default
为什么呢因为每个Java文件中
都只能有一个公有类
那么这个我们
要执行的这个main方法
它所在的类当然应该是公有类
不然的话就没法执行了
如果希望这个文件复制功能
能够被包以外的
其他的程序调用的话
就需要把它也定义成public
那么这样的话这两个类
我们就不能放在一个源文件中了
就要分开源文件中放
那么我们执行的方式
就是用Java命令来执行
然后FileCopy是这个程序的名字
后面的两个字符串
就是你要复制的源文件和目标文件的文件名
可以是当前目录下的
简单的一个文件名
也可以是有盘符的
这样一个全路径名
这一节我们学习了
如何从文本文件中读取数据
好
这一节内容就是这些
-1.0-导学
--1.0-导学
-1.1-Java与面向对象程序设计简介
--第一章 Java语言基础知识--1.1-Java与面向对象程序设计简介
-1.2-基本数据类型与表达式
-第一章 Java语言基础知识--1.2-基本数据类型与表达式
-1.3-数组
--1.3.1-数组
-第一章 Java语言基础知识--1.3-数组
-1.4-算法的流程控制
--第一章 Java语言基础知识--1.4-算法的流程控制
-1.5-第一章小结
-第一章编程练习题
-课件
--外部链接
-Java环境配置、Eclipse使用、Helloworld程序详解
--使用eclipse建立Java项目、编写和运行Java程序
-Java数据类型
--Java整数类型
--Java浮点类型
--数据类型实战
--数据类型转换
--Java强制类型转换精度损失示例与表达式中的数据类型转换
-Java数组
-Java变量
--Java的变量
-命令行参数
--命令行参数的介绍
-2.0-导学
--2.0-导学
-2.1-面向对象方法的特性
--第二章 类与对象--2.1-面向对象方法的特性
-2.2-1-类声明与对象创建
--第二章 类与对象--2.2-1-类声明与对象创建
-2.2-2-数据成员
--第二章 类与对象--2.2-2-数据成员
-2.2-3-方法成员
--第二章 类与对象--2.2-3-方法成员
-2.2-4-包
--2.2-4-包
--第二章 类与对象--2.2-4-包
-2.2-5-类的访问权限控制
--第二章 类与对象--2.2-5-类的访问权限控制
-2.3-1-对象初始化
--第二章 类与对象--2.3-1-对象初始化
-2.3-2-内存回收
--第二章 类与对象--2.3-2-内存回收
-2.4-枚举类
--2.4-枚举类
--第二章 类与对象--2.4-枚举类
-2.5-应用举例
--2.5-应用举例
-2.6-第2章小结
-第二章编程练习题
-课件
--第二章课件
-3.0-导学
--3.0-导学
-3.1.1-3.1.2-类继承的概念和语法
--第三章 类的重用--3.1.1-3.1.2-类继承的概念和语法
-3.1.3-隐藏和覆盖
--第三章 类的重用--3.1.3-隐藏和覆盖
-3.2-Object 类
--第三章 类的重用--3.2-Object 类
-3.3-终结类与终结方法
--第三章 类的重用--3.3-终结类与终结方法
-3.4-抽象类
--3.4-抽象类
--第三章 类的重用--3.4-抽象类
-3.5-泛型
--3.5-泛型
--第三章 类的重用--3.5-泛型
-3.6-类的组合
--3.6-类的组合
-3.7-小结
--3.7-小结
-第三章编程练习题
-课件
--课件
-4.0-导学
--导学
-4.1-接口
--接口
--第四章 接口与多态--4.1-接口
-4.2.1-4.2.2-类型转换
--类型转换
--第四章 接口与多态--4.2.1-4.2.2-类型转换
-4.2.3-方法的查找
--方法的查找
--第四章 接口与多态--4.2.3-方法的查找
-4.3-多态的概念
--多态的概念
--第四章 接口与多态--4.3-多态的概念
-4.4-多态的应用举例
--多态的应用举例
--第四章 接口与多态--4.4-多态的应用举例
-4.5-构造方法与多态性
--构造方法和多态性
--第四章 接口与多态--4.5-构造方法与多态性
-4.6-本章小结
--本章小结
-第四章编程作业
-课件
--课件
-5.0-导学
--5.0-导学
-5.1.1-5.1.2-异常处理的概念
--第五章 输入输出--5.1.1-5.1.2-异常处理的概念
-5.1.3-5.1.5-异常的处理
--第五章 输入输出--5.1.3-5.1.5-异常的处理
-5.2-输入输出流的概念
--输入输出流的概念
--第五章 输入输出--5.2-输入输出流的概念
-5.3.1-写文本文件
--写文本文件
--第五章 输入输出--5.3.1-写文本文件
-5.3.2-读文本文件
--读文本文件
--第五章 输入输出--5.3.2-读文本文件
-5.3.3-写二进制文件
--写二进制文件
--第五章 输入输出--5.3.3-写二进制文件
-5.3.4-读二进制文件
--读二进制文件
-5.3.5-File类
--File类
-5.3.6-处理压缩文件
--处理压缩文件
-5.3.7-对象序列化
--对象序列化
-5.3.8-随机文件读写
--随机文件读写
-5.4-本章小结
--本章小结
-课件
--课件
-6.0-导学
--导学
-6.1-Java集合框架介绍
--第六章 对象群体的组织--6.1-Java集合框架介绍
-6.2-主要接口及常用的实现类
--第六章 对象群体的组织--6.2-主要接口及常用的实现类
-6.3-常用算法
--常用算法
-6.4-数组实用方法
-6.5-基于动态数组的类型(Vector, ArrayList)
--基于动态数组的类型(Vector, ArrayList)
-6.6-遍历Collection
-6.7-Map接口及其实现
-6.8-第6章小结
--第6章小结
-课件
--课件
-7.0-导学
--导学
-7.1-绘图
--绘图
-7.2-Swing基础
--Swing基础
-7.3-Swing的层次
--Swing的层次
-7.4-布局管理
--布局管理
-7.5-内部类
--内部类
-7.6-事件处理的基本概念
-7.7-事件派发机制
--事件派发机制
-7.8-顶层容器
--7.8-顶层容器
-7.9-中间层容器(一)
-7.10-中间层容器(二)
-7.11-原子组件(一)
-7.12-原子组件(二)
-7.13-原子组件(三)
-7.14-其它Swing特性
-7.15-第7章小结
-课件
--课件