IO流

基本概念

 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代表数据类型)

编写代码:

运行结果:

对象流:

·

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容