字节流 ------------读取时,没有内容,返回-1
OutputStrean ----- write ------ 输出流
InputStrean ----- read ------- 输入流
字节输出流(OutputString ---- 超类 )
FileOutputStrean(数据由内存 ----> 硬盘)--------------------------write
字节输出流写入到文件
字节输出流使用步骤
文件存储原理
一次写多个字节的方法
-------------------------------------------------------
-------------------------------------------------------
Arrays.toString(bytes2)
UTF-8中3个字节代表一个中文,GBK中2个字节代表一个中文
追加写和续写
追加写(在此执行,不会被覆盖)
追加写的开关-------true
多次执行,不会覆盖,会在文件后,继续添加
写换行( 追加 \r )
字节输入流(InputString --- 超类)
FileInputString(硬盘 ---> 内存)文件字节输入流--------------read 文件为空,读取-1
int read()-----字节输入流从文件中读取-----读一次指针后移
字节输入流使用步骤:
读一次后,指针向后移动,只需在赌一次就可以读后面内容
如果文件指针所指为空,返回-1
一次读取全部字节流的方法
-------使用循环调用read()--------读取下一个字节,指针后移
转换为字符
注意事项:
不能这么写,没调用一次read(),指针就后移,读不全
必须设置int len 接收read()的值
一次读取一个字节-----读取原理
int read(byte[ ] b)-------从输入流中读取一定数量的字节,存入缓冲区数组b
从此输入流中将最多 b.length
个字节的数据读入一个 byte 数组中。
如果因为已经到达文件末尾而没有更多的数据,则返回 -1
。
int - 每次读的个数,byte[] 缓冲--1024(1kb)
通过String( byte [ ] bytes )、String( byte [ ] bytes ,int offset, int length) 构造方法------------------字符数组变字符串
一次读取多个字节----原理
文件的复制 (变读变写)(循环读写-缓冲数组)
一次读一个字节,速度太慢
优化:
使用缓冲数组扩大一次读写的字节数【1024】,提高速度
OutputStrean ----- write ------ 输出流
InputStrean ----- read ------- 输入流
字符流---------------读取时,没有内容,返回null
字符输入流(Reader)-------超类
FileReader -------- 字符输入流
使用步骤:
读取一次 --- 字符输入流
读取多次 --- 字符输入流
字符输出流(Writer)-------超类 ---flush()
FileWriter -------- 字符输出流
使用步骤:(重点)
write只把内容写入缓冲区,不使用 flush , 内容就不会写入
不flush ,直接close,内容也会写入
flush 和 close 方法的区别 (flush 刷新内容,close 关闭流并刷新内容)
字符输出流写数据的其他方法
writer ( char [ ] cbuf )
续写和换行
IO异常处理
1、整体创建流,调用方法,都方法try....catch中,
2、close放在finally中,需要专门try.....catch一次
3、文件输出流对象,需要定义成成员变量,并赋初值null(在try.....catch外)否则finally中的close无法调用
4、 finally中,需判断输出流对象创建成功否,判断对象值是否为null
JDK7和JDK9 流中的异常处理
JDK7 --------------- 在 try 后增加() 放入定义流对象,则作用于就为该括号内,执行完自动释放
JDK9 -----------------在try后增加() 直接放入流对象名称(变量名)对象的创建在外边
属性集
Properties (双列集合)
方法 store ( )
方法 load ( )
使用Properties集合存储数据,遍历
Object setProperties(String key, String value) 调用Hashtable 的方法puts ,向集合中添加数据
String getProperties(String key) 相当于Map集合的get(key)方法,通过key找到value值
store()
void store (OutputStrean out,String comments)
void store (Writer writer,String comments)
OutputStrean out: 字节输出流
Writer writer: 字符输出流
String comments: 注释---说明文件是做什么的----不能中文----一般“”空字符串
字节输出流不能写入中文,乱码
load()
注意:字节输入/输出流InputStrean/OutStrean 不能读写中文
缓冲流 (是输入输出流的子类)
字节缓冲流---------flush()---将内存缓冲区的数据,刷新到文件
构造方法
BufferedOutputStrean(内部缓冲区---字节数组byte[])(字节同样不能读写汉字)
使用步骤:
BufferedInputStrean(内部缓冲区---字节数组byte[])(字节同样不能读写汉字)
使用步骤:
一次读一个字节
使用缓冲数组
使用缓冲区+缓冲数组读写效率加快
字符缓冲流
BufferedWriter ----flush() 将内存缓冲区的数据,刷新到文件
使用步骤:
缓冲字符输出流----换行--------------------------bw.newline()
println方法
BufferedReader
readLine()读一个文本行
使用步骤:
文本排序
转换流---------OutputStreanWriter/InputStreanReader
字符编码
兼容ASCII码表
编码引出的问题
IDEA中使用FileReader默认使用UTF-8,Windows系统,默认GBK,当读取Windows文件时,会乱码
OutputStreanWriter类-------写入指定编码格式的文件
OutputStreanWriter是FileWriter的父类
使用步骤:
注意,此时,使用IDE打开还是乱码,因为IDE默认UTF-8,应该在windows下用用GBK方式打开
InputStreanReader类------读取指定编码格式的文件
InputStreanReader是FileReader的父类
使用步骤: