IO_字节流

一.IO概述


1.1 什么是IO

生活中,你肯定经历过这样的场景。当你编辑一个文本文件,忘记了ctrl+s ,可能文件就白白编辑了。当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢?键盘、内存、硬盘、外接设备等等。

我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入input 和输出output ,即流向内存是输入流,流出内存的输出流。

Java中I/O操作主要是指使用java.io 包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据

1.2 IO的分类

根据数据的流向分为:输入流和输出流。

输入流:把数据从其他设备上读取到内存中的流。

输出流:把数据从内存中写出到其他设备上的流

格局数据的类型分为:字节流和字符流。

字节流:以字节为单位,读写数据的流。

字符流:以字符为单位,读写数据的流。

1.3 IO的流向说明图解

IO的流向说明图解

1.4 顶级父类们

父类

二.字节流


2.1 一切皆为字节

一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。

2.2 字节输出流【OutputStream】

java.io.OutputStream 抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。它定义了字节输出流的基本共性功能方法。

public void close() :关闭此输出流并释放与此流相关联的任何系统资源。

public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。

public void write(byte[] b) :将字节数组中的内容, 写出到输出流关联的文件中

public void write(byte[] b, int off, int len) :将字节数组中, 从off索引, 开始的len个字节, 写出到输出流关联的文件中

小贴士

close方法,当完成流的操作时,必须调用此方法,释放系统资源。

2.3 FileOutputStream类

OutputStream 有很多子类,我们从最简单的一个子类开始。

java.io.FileOutputStream 类是文件输出流,用于将数据写出到文件。

a.构造方法

public FileOutputStream(File file) :创建文件输出流以写入由指定的 File对象表示的文件。

public FileOutputStream(String name) : 创建文件输出流以指定的名称写入文件。

当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有这个文件,会创建该文件。如果有这个文件,会清空这个文件的数据。

构造举例,代码如下:

构造举例代码
程序运行之后创建的两个文件对象  

b.写出字节数据

1. 写出字节: write(int b) 方法,每次可以写出一个字节数据,代码使用演示:

write(int b)写出字节
输出结果


小贴士:

a. 虽然参数为int类型四个字节,但是只会保留一个字节的信息写出。

b. 流操作完毕后,必须释放系统资源,调用close方法,千万记得。

2. 写出字节数组: write(byte[] b) ,每次可以写出数组中的数据,代码使用演示:

write(byte[] b)写出字节数组  
运行结果

3. 写出指定长度字节数组: write(byte[] b, int off, int len) ,每次写出从off索引开始,len个字节,代码使用演示:

 写出指定长度字节数组: write(byte[] b, int off, int len)  
输出结果


c.数据追加续写

经过以上的演示,每次程序运行,创建输出流对象,都会清空目标文件中的数据。如何保留目标文件中数据,还能继续添加新数据呢?

public FileOutputStream(File file, boolean append) : 创建文件输出流以写入由指定的 File对象表示的文件。

public FileOutputStream(String name, boolean append) : 创建文件输出流以指定的名称写入文件。

这两个构造方法,参数中都需要传入一个boolean类型的值, true 表示追加数据, false 表示清空原有数据。这样创建的输出流对象,就可以指定是否追加续写了,代码使用演示:

追加续写


运行结果


d.写出换行

Windows系统里,换行符号是\r\n。代码使用演示:

\r\n写出换行
运行结果


回车符\r 和换行符\n :

回车符:回到一行的开头(return)。

换行符:下一行(newline)。

系统中的换行:

Windows系统里,每行结尾是 回车+换行 ,即\r\n ;

Unix系统里,每行结尾只有 换行 ,即\n 

Mac系统里,每行结尾是 回车 ,即\r 。从 Mac OS X开始与Linux统一。

2.4 字节输入流【InputStream】

java.io.InputStream 抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。

public void close() :关闭此输入流并释放与此流相关联的任何系统资源。

public abstract int read() : 从此输入流中(输入流关联的文件中)读取一个数据字节

特点: read可以读取一个字节, 得到的是int类型的数字; 每读取一次, 下一次读取就可以读取到下一个字节,如果读取到文件的末尾, 则返回-1.

public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。返回值是有效字节的个数,如果读取到文件的末尾, 返回-1.

小贴士:close方法,当完成流的操作时,必须调用此方法,释放系统资源。

2.5FileInputStream类

java.io.FileInputStream 类是文件输入流,从文件中读取字节。

a.构造方法

FileInputStream(File file) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。

FileInputStream(String name) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。

当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件,会抛出FileNotFoundException 。

构造举例,代码如下:

创建字节输入流对象

b.读取字节数据

1. 读取字节: read 方法,每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回-1 ,代码使用演示:

准备一个Read.txt文件放在工作目录下,我们用字节输入流来读取它

准备读取的文件

读取代码:

read 方法,每次可以读取一个字节的数据  

循环改进读取方式,代码使用演示:

利用while循环读取
控制台输出结果

小贴士:

a). 虽然读取了一个字节,但是会自动提升为int类型。

b). 流操作完毕后,必须释放系统资源,调用close方法,千万记得。

2.使用字节数组读取: read(byte[] b) ,每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回-1 ,代码使用演示:

read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中  
输出结果,有个错误数据b  

错误数据d ,是由于最后一次读取时,只读取一个字节e ,数组中,上次读取的数据没有被完全替换,所以要通过len ,获取有效的字节,代码使用演示:

read(byte[] b): 的返回值是有效字节的个数  
正确的打印结果

2.6 字节流练习:

工作文件夹准备一张图片来拷贝它

a.图片复制(字节流一个字节一个字节的拷贝)

字节流一个字节一个字节的拷贝  

b.图片复制(使用数组的方式拷贝)

使用数组的方式拷贝
结果


查看当前工作文件夹

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

推荐阅读更多精彩内容