3.设备
设备概念:能输出或者输⼊数据的都可以成为设备
设备:磁盘(硬盘),内存,键盘,⽂件,⽹络,控制台
⽹络:当前主机之外的⽹上资源
4. IO流的分类
4.1 IO流的分类
按照不同的分类标准, 能够得到不同分类的IO流:
-
按照传输数据的单位:
-
字节流: 传输的是字节,是以字节为单位的。可以操作任意类型的数据 ------ ⾳频,视频,⽂件,图⽚等
-
字符流: 传输的是字节,不同点是在传输过程中加⼊了编码的操作,让我们的操作更⽅便------⽂本
-
按照数据传输的⽅向:
以内存为参考
-
输⼊流:数据从其他设备传到内存
-
输出流:数据从内存传到其他设备
-
4.2基础的IO流类的简介
其实在 java.io 包中, 有很多很多的类, 都是来描述IO流的。 但是基本上所有的IO 流的类, 都是直接或间接的继承⾃四⼤⽗类流。
字节流的两个⽗类: (传输的是字节,是以字节为单位的。可以操作任意类型的数据---⾳频,视频,⽂件,图⽚等 )
-
字节输⼊流:InputStream
-
字节输出流:OutputStream
字符流的两个⽗类: (传输的是字节,不同点是在传输过程中加入了编码的操作,让我们的操作更方便---文本)
-
字符读⼊流:Reader
-
字符写出流:Writer
4.3 IO流使用的注意事项
-
四⼤⽗类流,都是抽象类,都不能实例化对象。因此,需要借助他们的⼦类实 现数据的读写。
-
流对象⼀旦实例化完成,将建⽴⼀个程序与⽂件之间的连接。这个连接会持有 这个⽂件。如果这个连接不断,此时这个⽂件就是⼀个被使⽤中的状态,此时将⽆法对这个⽂件进⾏其他的操作,例如删除。
-
⼀个流在使⽤完成之后,切记!⼀定要进⾏流的关闭。
5.文件操作
5.1绝对路径和相对路径
5.1.1相关概念
路径: ⽤来描述⼀个⽂件所在的地址, ⽤来定位⼀个⽂件的。 可以分为绝对路径和相对路径。
绝对路径:从磁盘的根⽬录开始,⼀层层的向下查找,直到找到这个⽂件。
相对路径: 找到⼀个参照物,相对于这个参照物的路径。
5.1.2对比
优点 | 缺点 | |
---|---|---|
绝对 路径 | ⽤来表示⼀个⽂件的地址, 只要这个使 ⽤⽅还在当前磁盘上, ⼀定可以找到这 个⽂件。 | ⼀旦更换⼀个⽂件系统, 此 时这个路径表示的⽂件将⽆ 法找到。 |
相 对 路 径 | 只要两者的相对位置不变, ⽆论在哪⼀ 个⽂件系统中, 都可以找到这个⽂件。 | 只要两者的相对位置发⽣了 改变, 这个⽂件就⽆法被访 问到。 |
5.2分隔符
5.2.1分隔符的简介
在描述路径的字符串中, 有两种分隔符, 是⽐较常⻅的: 目录分隔符 和 路径分隔符。
目录分隔符
分隔开⼀个路径中的不同的⽂件夹, ⽤来描述层级关系、 包含关系。
在不同的操作系统中, ⽬录分隔符是不⼀样的。 在windows中, 使⽤ \ 作为⽬录 分隔符; 在⾮windows的操作系统中, 例如: Linux、Unix.. 使⽤的是 / 作为⽬录分 隔符。
理论上来讲, 在windows中,应该使⽤\作为⽬录分隔符。 但是在有些情况 下,使⽤/也是可以做⽬录分隔符的
路径分隔符
分隔开⼀个字符串中的多个路径的。
在不同的操作系统中, 路径分隔符是不⼀样的。 在windows中, 使⽤ ; 作为路径 分隔符; 在⾮windows的操作系统中, 例如: Linux、Unix.. 使⽤的是 : 作为路径分 隔符。
5.2.2分隔符的表示
如果你的程序只需要考虑部署在windows平台,那么只需要按照windows的规范书 写就可以;如果你的程序只需要部署到 linux 上, 那么只需要按照 linux 的规范书写就 可以。但是,如果你的程序需要考虑在不同的平台上部署运⾏,此时就需要使⽤以 下⽅法进⾏分隔符的获取。
方法 | 描述 |
---|---|
File.separator(); | 获取⼀个⽬录分隔符。 会根据不同的操作系统, 返回⼀个指定的⽬录分隔符字符串。 |
File.separatorChar(); | 获取⼀个⽬录分隔符。 会根据不同的操作系统, 返回⼀个指定的⽬录分隔符字符。 |
File.pathSeparator(); | 获取⼀个路径分隔符。 会根据不同的操作系统, 返回⼀个指定的路径分隔符字符串。 |
File.pathSeparatorChar(); | 获取⼀个路径分隔符。 会根据不同的操作系统, 返回⼀个指定的路径分隔符字符。 |
5.3 File类
5.3.1 File类的简介
File是 java.io 包中的⼀个类。 是对磁盘上的某⼀个⽂件、⽂件夹(⽬录)的描述。 所谓的⽂件操作, 其实都是需要使⽤这个类来完成的。
5.3.2 File类的构造方法
参数 | 描述 |
---|---|
String pathname | 通过⼀个路径字符串, 描述⼀个指定路径下的⽂件。 |
String parent, String child | 将parent和child拼接到⼀起, 成⼀个新的路径。 ⽤来描述 这个拼接好的路径。 |
File parent, String child | 将parent所描述的路径与child拼接到⼀起, 成⼀个新的路 径。 ⽤来描述这个拼接好的路径。 |
5.3.3 File类常用方法
1)文件属性获取方法
返回值 | 方法 | 描述 |
---|---|---|
boolean | exists() | 判断⼀个⽂件(⽬录)是否存在 |
boolean | isFile() | 判断⼀个路径指定的是否是⼀个⽂件。 |
boolean | isDirectory() | 判断⼀个路径指定的是否是⼀个⽂件夹。 |
long | length() | 获取⼀个⽂件的⼤⼩(注: 只能获取⽂件的⼤⼩)。 |
boolean | isHidden() | 判断⼀个⽂件(⽬录)是否是隐藏的。 |
boolean | canRead() | 判断⼀个⽂件(⽬录)是否是可读的。 |
boolean | canWrite() | 判断⼀个⽂件(⽬录)是否是可写的。 |
boolean | canExecute() | 判断⼀个⽂件(⽬录)是否是可执⾏的。 |
String | getName() | 获取⼀个⽂件(⽬录)的⽬录。 |
String | getPath() | 获取⼀个⽂件(⽬录)的路径(相对路径)。 |
String | getAbsolutePath() | 获取⼀个⽂件(⽬录)的路径(绝对路径)。 |
String | getParent() | 获取⼀个⽂件(⽬录)的⽗级路径(字符串)。 |
File | getParentFile() | 获取⼀个⽂件(⽬录)的⽗级(File类)。 |
long | lastModified() | 获取⼀个⽂件(⽬录)上次修改的时间。 |
2)文件操作方法
返回值 | 方法 | 描述 |
---|---|---|
boolean | createNewFile() | 在指定的路径下创建⼀个⽂件。 |
boolean | mkdir() | 在指定的路径下创建⼀级⽂件夹。 |
boolean | mkdirs() | 在指定的路径下创建多级⽂件夹。 |
boolean | delete() | 删除⼀个⽂件,或者删除⼀个空的⽂件夹。 |
boolean | renameTo(File dst) | 将⼀个⽂件重命名为指定的⽂件, 也可以实现⽂件的移动 |
3)文件获取
返回值 | 方法 | 描述 |
---|---|---|
String[] | list() | 获取⼀个⽬录下所有的⼦⽂件(夹)的名字。 |
String[] | list(FilenameFilter filter) | 获取⼀个⽬录下所有的满⾜条件的⼦⽂件 (夹)的名字。 |
File[] | listFiles() | 获取⼀个⽬录下所有的⼦⽂件(夹)。 |
File[] | listFiles(FileFilter filter) | 获取⼀个⽬录下所有的满⾜条件的⼦⽂件 (夹)。 |
File[] | listFiles(FilenameFilter filter) | 获取⼀个⽬录下所有的满⾜条件的⼦⽂件 (夹)。 |
6.基础的IO流
6.1建立程序和文件的连接
其实, 就是建⽴了程序与⽂件之间连接的管道, 实现数据在这个管道之内进⾏流 动。 管道分为不同的类型:字节输⼊流、字节输出流、字符输⼊流、字符输出流。下⾯以字节输⼊流 InputStream 为例。
6.1.1标准流程
-
try结构外⾯,声明流对象,为了在finally中使⽤。
-
在try结构⾥⾯,实例化流对象,并捕获异常。
-
在finally结构中,对流进⾏关闭。在关闭的时候,需要考虑流对象是否是null,以及要处理 IOException异常。
6.1.2 try结构的特殊使用
在 JDK1.7 之后,可以在try后⾯添加⼀对⼩括号。将 AutoClosable 接⼝实现类的对 象,实例化放到⼩括号中完成。·此时,在try结构执⾏结束的时候,会⾃动的调⽤ AutoClosable接⼝实现类中的close⽅法,进⾏流的关闭。这样写的流的建⽴⽐较简单,也是后⾯我们最主要使⽤的⽅式。
6.2 InputStream
6.2.1 InputStream简介
这是⼀个字节输⼊流。从⽅向来说,是⼀个输⼊流,数据是从⽂件中流动到程序中 (数据从其他设备到内存),是为了读取⽂件中的数据的。从数据单位来说,这个流 中流动的数据直接是字节的形式。
6.2.2 文件的读取
注意:
1.为了⽅便测试,我们可以先通过字节输出流或者⼿动在当前⼯程中创建⼀个test1.txt ⽂件,写⼊字符串abcde
2.有三种读取数据的⽅式第⼀:⼀次读取⼀个字节; 第⼆:⼀次读取多个字节; 第三:⼀次读取全部字节
三种读取数据的⽅式中,推荐使⽤第⼆种,⼀次读取多个字节
6.3 OutputStream
6.3.1 OutputStream 简介
字节输出流。从⽅向上来分,是⼀个输出流,数据从程序中流动到⽂件中(数据从内存到其他设备),实现⽂件的写操作。从流中流动的数据单位来分,是⼀个字节流,流中流动的数据直接是字节的形式。
6.4 Reader
6.4.1 Reader的简介
这是⼀个字符输⼊流。从⽅向来说, 是⼀个输⼊流,数据是从⽂件中流动到程序中 (数据从其他设备到内存),是为了读取⽂件中的数据的。 从数据单位来说,这个流中流动的数据以字节为单位的,不同的是在传输过程中加⼊了编码的操作,让我们的操作更⽅便。
6.5 Writer
6.5.1 Writer的简介
字符输出流。 从⽅向上来分,是⼀个输出流,数据从程序中流动到⽂件中(数据从内 存到其他设备),实现⽂件的写操作。从流中流动的数据单位来分,是⼀个字符流,流中流动的数据是以字节为单位,不同的是在传输过程中加⼊了编码的操作,让我们的操作更⽅便。