1、 IO(Input Output)流:IO流用来处理设备之间的数据传输
在读写字符串时,如果在构造时,传入第二个参数为true,将原有文件末尾进行读写
close()和flush()的区别?
a.调用flush,可以将数据刷到目的地中,流依然存在,可以继续使用,
调用close,可以将数据刷到目的地中,流已被关闭,不能继续使用,最后使用。
b.close不仅刷新缓冲区,还关闭底层资源
创建读取对象,和数据源先相关联
2、 装饰模式:为了解决给类功能进行增强而出现的。
装饰类和被装饰的特点:
a.装饰类中的构造函数需要接受被装饰。
b.装饰类和被装饰类应该属于同一个体系
* 装饰模式:为了解决给类的功能进行增强而出现的。
* Writer
* |--TextWriter
* |--MediaWriter
* 想要对流对象的功能进行增强,比如提高写入的效率。
* 使用缓冲技术。
* Writer
* |--TextWriter
* |--BufferedTextWriter
* |--MediaWriter
* |--BufferedMediaWriter
* 每一个子类这样实现是可以的,但是导致继承体系较为臃肿。
* 发现其实无论哪个子类需要高效,使用的都是缓冲技术。
* 干脆将缓冲技术进行单独的描述和封装。
* 要缓冲区谁,就将谁传给缓冲区。
* BufferdWriter
* class BufferedWriter extends Writer
* {
* BufferedWriter(Writer w)
* {}
* }
* 装饰设计模式。
* Writer
* |--TextWriter
* |--MediaWriter
* |--BufferedWriter
* 装饰类和被装饰的特点:
* 1,装饰类中的构造函数需要接受被装饰类。
* 2,装饰类和被装饰类应该所属于同一个体系。
3、 输入/输出流
FileOutputStream 输出流
FileInputStream 输入流
available 获取字节数 以他作为缓冲区的长度是不合适的
4、 转换流:是字符和字节之间的转换桥梁
InputStreamReader
OutputStreamWriter
字符能看懂,字节看不懂
转换流:字节流+编码表(可以指定)
---用于操作File的子类:字节流+本地默认码表(固定)。对默认编码的字符文件操作起来比父类根为便捷
5、 IO流的操作规律
字符流:对字符流操作的对象
FileReader
FileWriter
BufferedReader
BufferedWriter
InputStreamReader
OutputStreamWriter
字节流:对字节流操作的对象
FileInputStream
FileOutputStream
BufferedInputStream
BufferedOutputStream
问题:开始时,用哪个流对象解决问题?
明确一:明确源和目的。
源:就需要使用输入体系。InputStream Reader
目的:就需要写,就需要使用输出体系。OutputStream Writer
明确二:处理的数据是否是存文本数据。
是:就是使用字符流。
源:Reader
目的:Writer
否:就是字节流。
源:InputStream
目的:OutputStream
两个明确都确定后,可以确定需要使用哪个体系。
明确三:具体是哪个设备。明确设备的目的是为了确定具体的对象。
设备源:
键盘,System.in
硬盘,操作文件的对象。File开头的流对象。
内存,数组。
网络,Socket
目的设备:
硬盘,操作文件的对象。File开头的流对象。
屏幕(控制台)System.out
内存,数组。
网络,Socket
明确四:是否需要额外功能?
需要高效吗?Buffered
需要字节和字符之间的桥梁吗?转换流
6、 list():列出当前目录下的文件及文件夹的名称。 目录不存在反对空
对一个目录使用list前建议先判断。
7、 递归:函数自身调用自身。功能在内部有进行复用,下次功能实用到了上次功能的运算的内容。
注意;
a. 一定要定义条件。
b. 要控制递归次数。
dir.list();获取的是路径
dir.listFiles();获取的是路径对象
8、 Propertise:map中的Hashtable子类
a. 是一个双列集合。map中的方法都是可以用。
b. 持久的属性集,数据的生命周期较长。
c. Properties 可保存在流中加载
d. 键值都是字符串类型
9、 PrintStream: 打印流
特点:
a. 给字节输出流提供了打印方法。
b. 方便打印数值表现形式。
c. 构造函数接受File对象,字符串路径,OutputStream.
write写出一个int,只将最低一个字节写出。
print将数值表现形式不变,写到目的地中。都将数据转成字符串。
10、 能操作对象的流对象
ObjiecInputStream
ObjectOutputStream
关键字: transient 瞬态
RandomAccessFile
a. 既可以读取,又可以写入
b. 只对文件操作;
c. 内部维护了一个大型数组,将字节输入流和字节输出流进行封装。
d. 通过索引的方式对数组中的元素进行操作,获取和设置索引的方法是getFilePointer,seek.
e. 随机的访问的原理:就是通过操作索引的方法对指针进行自定义的指定位置来进行读写
f. 读取时,读取的字节要有规律
11、 操作基本数据类型值得流对象
a. write(int):将一个整数的四个字节中的最低字节写入到目的地
b. print(int):将一个整数的表现形式写入到目的地。你写的是什么,到目的地就是什么。
c. writeInt(int):将一个整数的四个字节写入到目的地。
12、 编码和解码
字符串--->字节数组:编码
字节数组--->字符串:解码
String str="你好";
编码:
byte[]arr=str.getBytes("UTF-8");
解码:
String s1=new String(arr,"GBK");
原则:
a. 编码编错了,就不用解码了。
b. 解码解错还有可能更正
注意会解释“联通”的问题