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接口,可以利用多态的性质,作为参数使接口更加灵活。

 

 


 

posted @ 2019-07-26 08:52  JQbiu  阅读(151)  评论(0编辑  收藏  举报