基本概念
1)输入(Input)指的是:可以让程序从外部系统获得数据(核心含义是“读”,读取外部数据)。常见的应用:
Ø 读取硬盘上的文件内容到程序。例如:播放器打开一个视频文件、word打开一个doc文件。
Ø 读取网络上某个位置内容到程序。例如:浏览器中输入网址后,打开该网址对应的网页内容;下载网络上某个网址的文件。
Ø 读取数据库系统的数据到程序。
Ø 读取某些硬件系统数据到程序。例如:车载电脑读取雷达扫描信息到程序;温控系统等。
2)输出(Output)指的是:程序输出数据给外部系统从而可以操作外部系统(核心含义是“写”,将数据写出到外部系统)。常见的应用有:
Ø 将数据写到硬盘中。例如:我们编辑完一个word文档后,将内容写到硬盘上进行保存。
Ø 将数据写到数据库系统中。例如:我们注册一个网站会员,实际就是后台程序向数据库中写入一条记录。
Ø 将数据写到某些硬件系统中。例如:导弹系统导航程序将新的路径输出到飞控子系统,飞控子系统根据数据修正飞行路径。
3) 数据源(数据的源头)
提供数据的原始媒介。常见的数据源有:数据库、文件、其他程序、内存、网络连接、IO设备。
4)目的地:数据最终到达的地方
5)流: 流是一个抽象、动态的概念,是一连串连续动态的数据集合。
流分为输入流和输出流, 输入/输出流的划分是相对程序而言的,并不是相对数据源。
进入程序时,相对于程序是输入流,离开程序时,相对于程序是输出流
6)流的分类
1.按照流的方向分:
输入流:InputStream/Reader,数据源到程序
输出流:OutputStream/Writer,程序到目的地
2.按照读写单位分
字节流:每次读写一个字节,InputStream/OutputStream
字符串流:每次读取一个字符串,Reader/Writer
3.按照功能进行划分(节点流和处理流)
节点流:直接可以操作数据源的流,可以单独使用
处理流:为了增强流的读写效率而设计的流,处理流必须结合节点流进行使用,不能单独使用,不直接连接到数据源或目的地,是其他流进行的封装。
节点流与处理流的关系:1.节点流处于 io 操作的第一线,所有操作必须通过他们进行
2.处理流可以对其他流进行处理(提高效率或操作灵活性)
7)IO流的体系
InputStream 和 OutputStream,Java 语言中最基本的两个字节输入输出类。
其他所有字节输入输出流类都继承自这两个基类。这两个类都是抽象类,不能创建它们的实例,只能使用它们的子类,最常用的是FileInputStream和FileOutputStream.
Reader和Writer,Java 语言中最基本的两个字符输入输出类。其他所有字符输入输出流类都继承自这两个基类。这两个类都是抽象类,不能创建它们的实例,只能使用它们的子类,如FileReader和FileWriter。
8)流的四大抽象类
字节输入流:InputStream
字节输出流:OutputStream
字符输入流:Reader
字符输出流:Writer
字节输入流
1)InputStream:这个抽象类是表示输入字节流的所有类的超类。
FileIntputStream(文件输入流)是抽象类InputStream的一个子类:从文件系统中的文件获取输入字节
2)构造方法:
FileInputStream(File file) :通过打开与实际文件的连接创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名
FileInputStream(String name) :通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名name命名。
3)常用的方法:
1.read() :从该输入流读取一个字节的数据。方式:一个一个字节读取,如果还有数据,则继续读取,如果达到文件的末尾,读取的值为 -1
注意:1.使用read()方法时,只能识别字母,识别不了汉字,因为一个字母占一个字节,一个汉字占一个字符(两个字节)当读取一个汉字时,读取一半就会返回
2.返回值类型为int类型,如果文件中的内容为字母(即char,字符类型的),得到的结果就是字母对应的ASII值。要想打印输出文件中的内容,必须利用强制转换,把得到的字母对应的ASII值转换成字符型的字母
3.利用while循环遍历文件中的内容,如果达到文件的末尾,读取的值为 -1
4.在编写代码过程中,读取文件时,可能会出现文件找不到异常和IO异常(IO异常属于运行异常,必须进行处理)。
2.close() :关闭此文件输入流并释放与流相关联的任何系统资源。
注意:关闭流时,可能会出现IO异常,运行异常,必须进行处理。
当文件夹中没有汉字时:
编写代码1
运行结果:
当文件夹中有汉字时:
编写代码2:
运行结果:
3.read(byte[] b)(即read(数组名称)) :从该输入流读取最多 b.length个字节的数据为字节数组。
得到的结果是读入的是总字节数,如果没有更多的数据,因为文件的结尾已经到达, -1 。
注意:1.read(数组名称) ,读入的是总字节数,如果没有更多的数据,因为文件的结尾已经到达, -1 。
2.借组String类构造方法,把数组bs(数组中的元素类型为byte)中的元素转成字符串
文件中的内容:
编写代码:
运行结果:
字节输出流
OutputStream:这个抽象类是表示字节输出流的所有类的超类
FileOutputStream(文件输出流)是OutputStream的一个子类,文件输出流是用于将程序中的数据写入到输出流File
构造方法:
1.FileOutputStream(File file) :创建文件输出流以写入由指定的 File对象表示的文件。
2.FileOutputStream(String name) :创建文件输出流以指定的名称写入文件。
3.FileOutputStream(File file, boolean append) :创建文件输出流以写入由指定的 File对象表示的文件。
4.FileOutputStream(String name, boolean append) :创建文件输出流以指定的名称写入文件。
注意:构造方法1,2会把原来文件中的内容给覆盖掉,构造方法3,4会在原文件内容的基础上再追加其他内容
常用的方法:
1.write(int b) :将指定的字节写入此文件输出流。(eg:write('a')) int b,可以代表对应的ASII值,97对应的ASII码为'a'
2.close() :关闭此文件输出流并释放与此流相关联的任何系统资源。
3.write(byte[] b) :将 b.length个字节从指定的字节数组写入此文件输出流。
操作之前,D盘中文件abc中的内容:
编写代码1:使用的是构造方法1,会发生文件中内容的覆盖
运行结果:
文件夹中的内容:发生覆盖
编写代码2:使用构造方法3:在原文件的基础上,在文件的内容中追加内容
运行结果:
写入后文件中的内容:
编写代码3:用常用的方法3在文件中写入内容
编写代码4:用常用的方法3在文件中写入内容(注:与代码3效果相同)
写入后的文件:
文件的复制:
实现文件的复制
1.使用输入流从源中将文件读取出来
2.使用输出流将文件写入到目的地
把D盘abc文档中的内容复制到E盘aa文档中
编写代码:
待复制的文件:
复制后的文件:
字符输入流:Reader
1.字符流:读写单位是以字符为单位(1个字符=2个字节,一个汉字=1个字符=2个字节)
2.Reader:(抽象类,父类)>>>>InputStreamReader类(转换流,子类)
InputStreamReader类(转换流,父类)>>>>FileReader(子类)
注意:通过子类FileReader创建对象
3.构造方法(类比InputStream记忆,构造方法相同)
FileReader(File file) :通过打开与实际文件的连接创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名
FileReader(String name) :通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名name命名。
4.常用的方法(类比InputStream记忆,方法相同,只不过读取是以字符为单位,
1)read() :从该输入流读取一个字符的数据。方式:一个一个字符读取,如果还有数据,则继续读取,如果达到文件的末尾,读取的值为 -1
注:得到的结果是字母对应的ASII值,要想在程序中打印输出,要利用强制转换把对应的int类型的ASII值转换成·字母,再打印输出
利用while循环读取文件中的内容,如果还有数据,则继续读取,如果达到文件的末尾,读取的值为 -1
2)close():关闭流
eg:读取F盘aa文档中的内容
编写代码:
运行结果:
3)read(char[] ch):将字符读入数组:
eg:读取F盘cccc文档中的内容
编写代码:
运行结果:
字符输出流:Writer
1.字符流:读写单位是以字符为单位(1个字符=2个字节,一个汉字=1个字符=2个字节)
2.Writer:(抽象类,父类)>>>>OutputStreamWriter类(转换流,子类)
OutputStreamWriter类(转换流,父类)>>>>FileWriter(子类)
注意:1.是相对来说的
注意:2.通过子类FileWriter创建对象
3.构造方法:
1)FileWriter(File file)给一个File对象构造一个FileWriter对象
2)FileWriter(String filename):构造一个给定文件名的FileWriter对象
3)FileWriter(File file,boolean append):给一个File对象构造一个FileWriter对象
4)FileWriter(String filename,boolean append):构造一个给定文件名的FileWriter对象
注意:构造方法1,2会把原来文件中的内容给覆盖掉,而构造方法3,4会在原文件的基础上再追加内容
4.常用的方法
writer(int c):写一个字符
writer(String str):写一个字符串
writer(char[ ] ch):写入一个字符数组
flush():刷新流
close():关闭流
eg:在F盘aa文档中追加内容
编写代码:
追加后F盘aa文档中的内容:
复制文件:
实现文件的复制
1.使用输入流从源中将文件读取出来
2.使用输出流将文件写入到目的地
把F盘aa文档中的内容复制到F盘bb文档中
编写代码:
待复制的文件:
编写代码:
复制后的文件:
缓冲流:
流按照功能分:
节点流:可以直接操作数据源,(FileInputStream,FileOutputStream,FileReader,FileWriter),可以单独使用
处理流:是为了提高读写效率而设计的,不能单独使用,必须结合节点流使用(使用处理流后,读写效率提高了)
缓冲字节流:BuffferedInputStream和BufferedOutputStream
缓冲字符流:BufferedReader和BufferedWriter
注意:1.缓冲字节流,缓冲字符流是处理流,必须结合节点流一起使用
2.缓冲字节流,缓冲字符流都是为了提高读写效率而设计的,它们的不同之处在于读取和写入的方式不同,缓冲字节流每次读取和写入一个字节,缓冲字符流每次读取和写入一个字符
<1>缓冲字节流:BuffferedInputStream和BufferedOutputStream
1.BuffferedInputStream的构造方法:
BuffferedInputStream(字节输入的节点流名称):创建一个BuffferedInputStream对象,并保存其参数,供以后使用
BuffferedInputStream常用的方法:
read(byte[ ] bs):把内容存储到数组中,通过读取数组读取内容
read(byte[ ] bs,int off, int len):从给定的位置开始读取,将字节输入流中的字节读入指定的字节数组
2.BuffferedOutputStream的构造方法:
BuffferedOutputStream(字节输出的节点流名称):创建一个BuffferedOutputStream对象,并保存其参数,供以后使用
BuffferedOutputStream常用的方法:
write(byte[] b, int off, int len):从指定的字节数组写入len个字节,从偏移off开始到缓冲的输出流
flush():刷新缓冲输出流。
eg:利用缓冲字节流复制文件(将F盘中cccc文档复制到D盘dd文档中)
1.使用输入流从源中将文件读取出来
2.使用输出流将文件写入到目的地
F盘中cccc文档:
编写代码:
运行结果:
<2>缓冲字符流BufferedReader,BufferedWriter
1,BufferedReader
常用方法:
readLine():读一行文字(返回类型为String)。结果得到包含行的内容的字符串,不包括任何行终止字符,如果已达到流的末尾,则为null
close():关闭流并释放与之相关联的任何系统资源。
2.BufferedWriter
常用的方法:
write(char[] cbuf, int off, int len):写入字符数组的一部分。
close():关闭流并释放与之相关联的任何系统资源。
newLine():写一行行分隔符。
flush():刷新流
eg:利用缓冲字符流复制文件(将F盘中aaa文档复制到D盘aa文档中)
1.使用输入流从源中将文件读取出来
2.使用输出流将文件写入到目的地
F盘中aaa文档:
编写代码:
统计指定文件夹下java源文件的总行数(java源文件是以 .java结尾的文件)
方法:
1.先获取指定文件夹下的所有子文件夹以及子文件
2遍历指定文件夹下的所有子文件夹以及子文件
3. 如果是文件,统计文件中的行数:先获取文件名,再找到以.java结尾的文件,最后统计其行数
4.如果不是文件,是文件夹,则递归调用统计文件中行数的方法
编写代码:
运行结果:
转换流
InputStreamReader:将字节输入流转换为字符输入流
OutputStreamWriter:将字节输出流转换为字符输出流
作用:将字节流转换为字符流。属于处理流,(必须与节点流结合使用)
注意:1.存在将字节流转换成字符流的转换流,因为字符流操作文本更简单
2.不存在把字符流转换成字节流的转换流,因为没有必要
eg:从键盘获取用户输入,并将用户输入的内容写入到指定的文件中
打印流
PrintStream和PrintWriter
PrintStream类,继承了OutputStream抽象类,标准的输出流(可以输出到控制台)
PrintWriter类:继承了Writer抽象类
常用的方法:
print():向控制台输出
print(String s):打印字符串。
print(Object obj):打印一个对象
print(int c):打印一个整型的数
print(char c):打印一个字符
println():向控制台输出并换行
flush():刷新流
close():关闭流
编写代码:
运行结果1:
运行结果2:
数据流:
数据流将“基本数据类型与字符串类型”作为数据源,从而允许程序以与机器无关的方式从底层输入输出流中操作Java基本数据类型与字符串类型。
DataInputStream和DataOutputStream是处理流,可以对其他节点流或处理流进行包装,增加一些更灵活、更高效的功能。
常用的方法:
DataInputStream常用的方法:read xxx(xxx代表数据类型)
DataOutputStream常用的方法:write xxx(xxx代表数据类型)
编写代码:
运行结果:
对象流:
·