天天看点

IO流、序列化、装饰模式 笔记

Java的IO流是实现输入和输出的基础,可以方便的实现数据的输入和输出操作。在java中把不同的输入/输出源(键盘,文件,网络连接等)抽象表述为“流”(stream)。

按照 流的文件类型:字节流(InputStream、OutputStream)和字符流(Reader,Writer)

按照 流的流向:输入流和输出流

按照 功能 :节点流 和 过滤流

IO流、序列化、装饰模式 笔记

所有文件数据(文本、图片、视频等)在存储时,都是二进制数字的形式,也就是一个一个的字节,传输时一样如此。所以,字节流可以传输任意文件数据。

绝对路径:一个完整的路径,以盘符开头,例如F://123.txt

相对路径:一个简化的路径,不以盘符开头,例如//123.txt//b.txt。

getAbsolutePath() :返回此File的绝对路径名字符串。

getPath() :将此File转换为路径名字符串。

getName() :返回由此File表示的文件或目录的名称。

length() :返回由此File表示的文件的长度(字节)

如果File是目录,则返回值未指定。

exists() :此File表示的文件或目录是否存在。

isDirectory() :此File表示的是否为 目录。

isFile() :此File表示的是否为 文件。

createNewFile() :文件不存在,创建一个新的空文件并返回true,文件存在,不创建文件并返回false。

delete() :删除由此File表示的文件或目录。

mkdir() :创建由此File表示的目录。如果父类不存在,则创建失败

mkdirs():创建由此File表示的目录,同时创建不存在的父级目录。

所以一般选用 mkdirs()

那么什么时候用字节流什么时用字符流呢

在遍历文件时候,一般选择字符流

而对文件的内容进行读写操作时一般用字节流

无论使用什么样的流对象,底层传输的始终为二进制数据。但在用字符流读写文件内容时,规定的字符容器可能会大于需要读写的的内容(字节)

public FileOutputStream(File file):以File对象为参数创建对象。

public FileOutputStream(String name): 以名称字符串为参数创建对象。

开发常用第二种,指定路径字符串

注意:创建输出流对象的时候,如果路径不存在,系统会自动去对应位置创建对应文件

输入流对象的时候,文件不存在则会报FileNotFoundException异常

当我向有数据的文件中写出字节时,可以传入第二个参数Boolean

boolean为ture时,表示追加数据,不会对元数据进行覆盖。

false 表示不追加 也就是清空原有数据。

构造方法类比输出流

同样推荐第二种狗构造方法

当你创建一个流对象时,传入的路径下,该文件,会抛出

输出结果为 ab cd ed

为何:因为长度为2的数组,每次读取2个字符,下次读取时,另外两个字符将原字符覆盖

第一次:ab

第二次:c覆盖a,d覆盖b 结果为cd

第三次:e覆盖d,原来的d没有被覆盖,所以结果为 ed

close() :关闭流

flush() :强制缓冲的输出字节写出。

write(byte[] b):将Byte数组 .length()个字节数组写入输出流。

write(byte[] b, int off, int len) :从偏移量 off开始输出到此输出流,读取len个字符

write(int b) :将指定的字节输出流。

创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。

public BufferedInputStream(InputStream in) :创建一个新的缓冲输入流,注意参数类型为InputStream。

字节输出流一样。

举例:

编码:字符(能看懂的) –> 字节(看不懂的)

解码:字节(看不懂的) –> 字符(能看懂的)

FileReader 读取项目中的文本文件。由于IDEA的设置,都是默认的UTF-8编码

但是,由于Windows系统的默认是GBK编码,读取Windows系统中创建的文本文件时,就会出现乱码。

Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据、对象的类型和对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息

1.该类必须实现java.io.Serializable 接口,Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出NotSerializableException 。

2.该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient 关键字修饰。

一种类与类交互的模式

继续阅读