blog 2019.3.18 day17 I/O流

问题:
1、foreach的用法
https://www.cnblogs.com/XiaojianGo/p/7471860.html
2、在这里插入图片描述
初始化学校对象

I/O流。

即 input/output。

在这里插入图片描述

在这里插入图片描述

理解流

atm机器,数据保存在内存中,一旦系统运行完毕,或者中途中断退出,当前所操作的数据全都消失。下次再访问系统数据已经丢失。

如果要将系统的数据保存起来,流的操作,文件的操作。

什么是流?
在程序中,流的概念:java程序中当需要读取数据的时候,就会开启一个通向数据源的设备流。这个数据源可以是 文件、内存、网络资源。

程序------》硬盘文件
程序------》内存获取
程序------》网络资源

当我们程序需要写入数据的时候,开启一个通往目的地的设备流。这个时候我们可以将数据理解流。在管道里面进行传输或流动。

流:具有两个特征
1、含有流质
2、具有方向
这两个特征正好符合计算机系统当中数据传输的特征。

流来抽象数据传递。

方向:硬盘文件–程序 程序—硬盘文件
输入流 输出流
在这里插入图片描述

在程序中流的分类

java.io 提供了我们操作数据使用的各种流。流的分类(流质、方向)

1、按照方向的来分
1.输入流:输入流是从数据源读取到内存。InputStream、Reader对象代表输入流。
2.输出流:输出流就是内存将数据写入到数据源,OutputStream、Writer。

2.按照类型来分:
1、字节流:传输的时候以byte为最小单位进行传递。
2、字符流 :传输的时候以char为最小单位来进行传递。

3.按照功能来分:
1、节点流(低级流):节点流表示从一个特定的数据源读取数据、节点流一般直接操作文件、或者网络等提供的流。他们直接从文件读取数据、将数据直接写入到文件中。也称为低级流。
2、处理流(高级流):处理流不是直接连接到设备上、而是建立在其他流(低级流)之上,必须依赖低级流。通过对数据的处理提供更强大的功能。处理流也称为高级流。

好处?
在低级流的基础之上,继续去拓展和优化了功能。

在程序中操作的都是高级流 。

重点学习的类:InputStream、OutputStream Reader、Writer都是抽象类。使用时 使用的是抽象类的子类

在操作流的时候 步骤是:
1、建立流,根据不同类型的数据,选择不同的流来操作。
2、操作流,将数据读取到内存,或者将内存数据写入到数据源。
3、关闭流,操作结束后记得**将流给关闭了!!!**释放所有的资源。

file文件类的操作

file类:就是用来管理文件用的。
流:关心修改操作文件的具体内容。

java.io包提供的一个类,主要用于管理磁盘里面所有文件或者文件目录,比如:文件的大小、文件的名字、文件的类型都可以操作,但唯一不能操作的是文件的内容。(可以创建文件、创建文件夹等等、但是不能修改操作文件内容,文件内容要通过流来操作。)

file类描述的是一个文件、或者一个文件夹。该类出现的目的,封装file对象,提供各种文件操作方法,供我们在开发的过程中直接调用接口就可以完成某些特定的功能(创建一个文件夹、删除一个文件、判断文件是否存在)

注:文件的路径里面的斜杠 \ 之所以是双斜杠\ ,是因为 \ 符号要转义。
在这里插入图片描述

在这里插入图片描述

判断是不是文件夹(用于网站上传头像的时候,用户若选择的是一个文件夹而非jpg等类的图片,就会执行此判断。)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
delete在删除文件的时候,如果抽象路径是指向空文件夹,直接删返回true,如果删除的文件夹内有内容,则无法删除,返回false。

列出当前文件夹里面的所有文件的 文件名
在这里插入图片描述

列出具体每一个文件对象,不再是文件名
在这里插入图片描述

列出当前文件夹里面的所有文件,包括子目录下面的文件
递归
在这里插入图片描述
file.separator 设置分隔符(通过代码而不是直接输入斜杠,这样的话代码无论在windows还是linux/unix下都可以适应)

如何通过代码,将一个文件移动到另外一个文件夹内?

使用file来移动文件>>>>>>>>>>

在这里插入图片描述

具体流的操作

在这里插入图片描述
图里面,深色为节点流,浅色为处理流
黄色为重点
InputStream:
== FileInputStream:对二进制的文件进行操作。数据源一般为磁盘。==
PipedInputStream:主要针对线程管道(目前不了解)
FileterOutputStream :过滤流,提供的子类非常重要,其中包括缓冲流、数据流。
BufferedInputStream:缓冲流
DateInputStream:数据操作流
LineNumberInputStream:表示程序读取的哪一行,计数器。
ByteArrayOutputStream:对内存缓冲区的数据进行读写操作,数据源是内存的字节数组。
SequenceInputStream:实现两个文件的合并
StringBufferInputStream:主要用于操作字符串的流
ObjectInputStream:对象流,数据源也是磁盘,用于操作内存中的对象

OutputStream

在这里插入图片描述
在这里插入图片描述


为了避免读1024的时候,被读文件最后一次读不够1024,但是还是以1024的长度传过来了,写的时候会多写一些字符(写满1024),并非真实长度,所以这里需要重载,定义输出的长度。

字节流

字节流以byte作为最小单位传输,字节流经常用于操作二进制的文件,图片,音频,视频。所有字节流都继承于inputStream和outStream。
注:一个中文2个字节。
读取一个数据:
在这里插入图片描述

BufferedInputStream
缓冲流:缓冲流是一个高级流。套在响应节点流基础之上,对读写数据提供缓冲的功能,提高了读写的效率。同时还增加了一些额外的方法。

缓冲区:
byte [] by = new byte[1024]; 缓冲区,在内存空间开辟一个缓冲区域,读写现将数据放入缓冲区,减少对磁盘的读写。

使用缓冲流:
1.减少对磁盘的io操作
2.提高了数据读写的效率
在这里插入图片描述

有了InputStream为什么还要用BufferInputStream?
BufferedInputStream和BufferedoutputStream是FilterInputStream和FilterOutputStream的子类,可以避免每次发送或者
写数据的时候,进行实际的写操作,使用的是缓冲区;
不应用缓冲区的时候,每次读取一个字节,写入一个字节,由于操作磁盘比内存慢的很多,所以不应用缓冲区效率很低;
应用缓冲区,可以一次读取多个字节,先不写入磁盘,而是放入内存之中,到了缓冲区大小的时候,在写入磁盘,减少了对磁盘的操作,效率高;
应用缓冲流,在结束的时候,调用flush和close方法,将缓冲区的数据都清理出来,,写入磁盘,否则可能无数据;


DateInputStream:DateoutptStream
数据流:提供一些列的功能,读取的数据转化一个byte boolean long float 输出的输出,可以输出byte、long

关于对象的操作

在这里插入图片描述

在这里插入图片描述

PrintWrite:打印流,在System系统输出数据到控制台的时候就已经使用了。

猜你喜欢

转载自blog.csdn.net/qq_39263750/article/details/88636153