缓冲流
也叫高效流,是对四个file流的增强
字节缓冲流:BufferedInputStream BufferedOutputStream;
字符缓冲流:BufferedReader BufferedWriter;
缓冲流的基本原理:
在创建流对象时,会创建一个默认内置大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,提高读写效率;
BufferedInputStream常用方法:
继承了InputStream;
public BufferedInputStream(InputStream in) 创建一个 新的缓冲输入流;
public BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流;
BufferedReader常用方法:
继承了Reader;
public BufferedReader(Reader in) 创建一个 新的缓冲输入流
public BufferedWriter(Writer out) 创建一个新的缓冲输出流
public String readLine() 读一行文字;当没有数据时返回null而不是-1
public void newLine() 写一行行分隔符,由系统属性定义符号
转换流
字符与字节之间的相互转换;
字符集:也就是编码表,常用有ASCII字符集,ISO-8859-1字符集,GBxxx字符集,Unicode字符集;
编码:字节按照指定规则的字符集编码成为二进制字节储存在计算机中;
接码:二进制字节按照字符集解码成为我们能看懂的数据;
InputStreamReader类
是Reader的子类,是字节流到字符流的桥梁;
InputStreamReader(InputStream in) 创建一个使用默认字符集的字符流;
InputStreamReader(InputStream in, String charsetName) 创建一个指定字符集的字符流;
OutputStreamWriter类
是Writer的子类,是字符流到字节流的桥梁;
OutputStreamWriter(OutputStream in) 创建一个使用默认字符集的字符流;
OutputStreamWriter(OutputStream in, String charsetName) 创建一个指定字符集的字符流。
经典案列
将GBK编码的文本文件,转换为UTF-8编码的文本文件
public static void main(String[] args) {
// 1.定义文件路径
String srcFile = "file_gbk.txt";
String destFile = "file_utf8.txt";
// 2.创建流对象
// 2.1 转换输入流,指定GBK编码
InputStreamReader isr = new InputStreamReader(new FileInputStream(srcFile) , "GBK");
// 2.2 转换输出流,默认utf8编码
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(destFile));
// 3.读写数据
// 3.1 定义数组
char[] cbuf = new char[1024];
// 3.2 定义长度
int len;
// 3.3 循环读取
while ((len = isr.read(cbuf))!=‐1) {
// 循环写出
osw.write(cbuf,0,len);
}
// 4.释放资源
osw.close();
isr.close();
}
序列化流
字节与对象之间的转换,将对象可以持久化存储在电脑文件上面;
序列化条件:
1,序列化对象需要实现Serializable接口;
2,如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient关键字修饰,不能使用static修饰
ObjectOutputStream类
将java对象的原始数据类型写出到文件,实现对象的持久储存;
public ObjectOutputStream(OutputStream out) 创建一个指定OutputStream的ObjectOutputStream;
public final void writeObject (Object obj) 将指定的对象写出
ObjectInputStream类
反序列化流;将序列化的原始数据恢复为对象;
public ObjectInputStream(InputStream in) 创建一个指定InputStream的ObjectInputStream;
public final Object readObject () 读取一个对象 返回一个Object类型可以强转为想要的类型;
可以防止修改数据之后class反序列化不能成功
// 加入序列版本号
private static final long serialVersionUID = 1L;
打印流
PrintStream 常用方法
public PrintStream(String fileName) 使用指定的文件名创建一个新的打印流;
System.out就是PrintStream类型的,只不过它的流向是系统规定的,打印在控制台上。不过,既然是流对象,
我们就可以玩一个"小把戏",改变它的流向
public class PrintDemo {
public static void main(String[] args) throws IOException {
// 调用系统的打印流,控制台直接输出97
System.out.println(97);
// 创建打印流,指定文件的名称
PrintStream ps = new PrintStream("ps.txt");
// 设置系统的打印流流向,输出到ps.txt
System.setOut(ps);
// 调用系统的打印流,ps.txt中输出97
System.out.println(97);
}
}