IO流
目录:
1、IO流的原理和流的分类
2、File类的使用
3、节点流(文件流)
4、缓冲流
5、转换流
6、标准输入、输出流
7、打印流
8、数据流
9、对象流
10、随机存取文件流
一、IO流的原理和流的划分:
1、按照数据单位划分,可以分为字节流和字符流(如:FileReader、FileWriter)。
2、按照流的流向划分,输入流和输出流。
3、按照角色划分:节点流(文件流)和处理流(作用在节点流(文件流)之上的)、
(1)节点流
4、四个抽象基类: 节点流 缓冲流
InputStream FileInputStream BufferedInputStream
OutStream FileOutputStream BufferedOutputStream
Reader FileReader BufferedReader
Writer FileWriter BufferedWriter
通常流都是以四个抽象基类为后缀的。
5、对流的操作步骤
(1)创建文件对象
(2)创建流的对象(输入或者输出流对象)
(3)通过流读取或者写出
(4)关闭资源
二、File类的使用
1、我们不能直接去操作一个文件,我们需要文件按对象来做承载
2、IO的所有对象都在java.io包下
3、File实例化的对象可以是一个文件,也可以是一个文件目录。
4、构造方式1:File file = new File(String pathname);
(1)、相对路径:相对于ideal下项目名的路径
File file = new File("hello.text");
(2)、绝对路径:File file = new File("D:\\hello.text")
注意:'\'在java中具有转译的意思,如‘/n’,故用‘\\’或者‘/’。在windows擦做系统中,下层为;'\'。在unix和URI中使用:‘/’。
5、构造方法2:File file = new File(String parent,String children)
6、构造方法3:File file = new File(File parent,String children) //其中parent代表队的是文件所在目录,children代表的文件
8、常用方法:
(1)String getAbsolutelyPath():获取绝对路径
(2)String getPath():获取路径
(3)String getName():获取文件或文件目录名称
(4)String getParent:获取上层文件目录路径,若不存在返回null(若写的是相对路径,则同样返回null,因为相对路径无法识别上层目录)
(5)long length():获取文件长度
(6)long lastModifed():返回最后一次修改时间
(7)String[] list():获取指定目录下的所有文件或文件目录的数组
(8)File[] listFile():获取指定文件目录下的所有文件或文件目录的数组
(9)boolean renameTo(File name): 把文件重命名为指定文件目录:
注意:被操作的文件必须存在,如果重命名之后的文件已经存在,则renameTo()不会成功。否则会成功,且文件将会移到重命名之后文件的目录下
(10)boolean creatNewFile():创建文件,如果文件不存在则创建,返回true,如果文件存在则不创建,返回false
(11)boolean mkdir():创建目录:文件目录存在或者上层目录不存在,则创建不成功,否则,创建成功并返回true
(12)boolean mdirs():创建目录:文件的目录存在不创建,文件上层目录不存在则与目录一同创建
(13)boolean delete():删除一个文件/目录,如果文件目录下有文件或者子目录则删除失败
9、File的一些判断方法:
(1)boolean isDirectory() 判断文件目录是否存在
(2)boolean isFile();判断文件是否存在
(3)boolean exists():判断文件或者文件目录是否存在
(4)canWrite():是否可写
(5)canRead():是否可读
(6)isHidden():是否隐藏
三、字符流
1、int read():读取流中的单个字符,范围在0`65535之间(0X00~0XFFFF),读到文件末尾返回-1。
2、int read(char[],cbuf):将每次读取的数组存在数组里,每次返回读取字符的个数,读取到文件的末尾返回-1
3、int read(char[] cbuf,int off,int len)将一部分字符读取到数组中,len表示字符最多可以有多少
4、write(name,boolean):的方法和read大同小异,作用是将字符写入到数组中。如果文件不存在且文件按包含的上层目录真实存在,则自动创建文件。如果为true则添加,如果为false则相当于复制了一个文件。
四、字节流
1、当对文本文件的操作通常使用字符流,对视频、图片、音频等多媒体文件的操作通常使用字节流
2、FileInputStream:将文件读到内存中
3、FileOutputStream:将内存总字节写到文件中
五、缓冲流
1、缓冲流是处理流的一种,也是套接在节点流之上的,可以加快流的读写,会创建缓冲区数组,默认缓冲区数组缺省使用8192bit(8k)。
2、BufferedInputStream(new FileInputStream);读入内存的缓冲流
3、BufferedOutputStream(new FileOutputStream);从内存写到文件的缓冲流
4、通常关闭资源的是偶通常只需要关闭从处理流,则JVM会自动关闭节点流。如果关闭了带有缓冲区流的对象,那么此时便会自动书最新缓冲区,关闭之后不能再写入。
5、注意,缓冲流中有个flush()方法,是用来刷新缓冲区的。若不主动刷新,缓冲区若超过8192字节之后会自动刷新缓冲区。
六、转换流:是处理流的一种
1、转换流:是处理流的一种,把字节和字符相互转换。
2、InputStreaReader:
3、OutputStreamWriter:
4、编码:字符-->字节 OutputStreamWriter
5、解码:字节-->字符 InputStreamReader
6、处理流之上还可以加处理流:缓冲流可以作用在转换流之上,作用在转换流上,缓冲流是在转换流和内存种起作用的,故换洪流应该使用字符类型。
七、标准输入输出流
1、默认输入是从键盘,输出是显示器
2、System.in:属于InputStream
3、System.out:属于PrintStream,是OutPutStream的子类
4、重定向:通过System类的setIn,setOut方法对默认的输入输出设备进行更改
八、打印流
1、将基本数据类型格式转化为字符串(将二进制代码,也就是将字符流打印到控制台)
2、PrintStream
3、PrintWriter
4、提供了一系列print()和println()的重载方法,用于多种种数据类型输出
5、PrintStream和PrintWriter不会抛出IoException。
6、PrintStream和PrintWriter都有自动flush功能、
九、数据流
1、为了方便操作基本数据类型和String数据
2、基本格式:DataInputStream和DataOutputStream
3、数据流要套接在InputStream和OutputStream之上
十、对象流
1、ObjectInputStream、ObjectOutputStream
用于读取和存储基本数据类型和对象的处理流,他的主要功能是对对象的存储和读取
2、序列化:如果一个对象需要序列化,那么这个类必须要实现Serializable接口(空接口)
Serializable 这样的接口,我们通常称它为标识接口,标识该类对象是可以被序列化的
3、8种基本数据类型都是可序列化的
4、Static修饰的属性和transient修饰的属性不可被序列化
5、反序列化:被反序列化的对象类必须有
Public static final long serialVersionUID版本号
否则在序列化后,类被更改没有再次序列化(类一更改UID就变了),反序列化时不成功的,没有写死UID的时候时类自动分配的UID反序列化是根据UID进行的。
6、被序列化的对象类文件必须在本地(包名+类名)
序列化与反序列化用来传输对象的数据,而并非是用来传输类文件的与反射不同
反射拿到的是类信息,而序列化与反序列化拿到的是对象信息。
7、关于Serializable接口的面试体
用于序列化的,是空接口,实现了该接口的对象,可以将他们转换成一系列的字节,并且可以在以后完全恢复,这个过程也可以通过网络进行传输,这移位着序列化机制能补偿操作系统的差异。
举例:我们在windows系统种创建了一个对象,并对其进行序列化,通过网络传输到unix机器上,也可以准确无误的装配。
大部分作为参数的类,如Strung Integer 他们都实现了Serializable接口,可以利用多态的性质,作为参数使接口更加灵活。