1.节点流与处理流
IO流根据封装类型不同可以分为节点流与处理流/包装流
⑴节点流:流对象直接对数据操作,构造方法(文件)
⑵处理流/包装流:流对象包含的是另一个流,提供一些额外数据处理
2.包装流
BufferedInputStream && BufferedOutputStream
⑴普通方法进行包装,效率不高
public static void main(String[] args) throws IOException {
//普通方法进行实现,效率不高
FileInputStream in = new FileInputStream("D:/show.txt");
FileOutputStream out = new FileOutputStream("D:/show1.txt");
BufferedInputStream bin = new BufferedInputStream(in);//对数据进行包装处理
BufferedOutputStream bout = new BufferedOutputStream(out);
int b = 0;
while ((b = bin.read()) != -1) {
bout.write(b);
}
bout.flush();//关闭之前,刷新缓冲区
bin.close();
bout.close();
}
}
⑵用数组进行进行实现,效率较高
public static void main(String[] args) throws IOException {
//数组进行包装实现,效率较高
FileInputStream in=new FileInputStream("D:\\show.txt");
FileOutputStream out =new FileOutputStream("D:\\show1.txt");
BufferedInputStream bin=new BufferedInputStream(in);
BufferedOutputStream bout=new BufferedOutputStream(out,2048);
int size=0;
byte b[]=new byte[1024];
while((size=bin.read(b))!=-1){
bout.write(b);
}
bout.flush();
bin.close();
bout.close();
}
缓存原理:read时,会把读入数据缓存到底层数组中。write时,并不是每一次write时,就向磁盘去写数据,而是等到内部缓冲数组写满时,再向磁盘进行输出操作 。当自己的数组长度大于数组缓冲区,则直接写出,反之则先读到数组缓冲区中。
3.字符流(只能读取纯文本文件)
Reader 是字符输入流的基类 FileReader
Writer 是字符输出流的基类 FileWriter
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("D:/show.txt");
FileWriter fw = new FileWriter("D:/show2.txt", true);//写入数据时,留之前的内容,向后面追加内容
BufferedReader bfr = new BufferedReader(fr);
BufferedWriter bfw = new BufferedWriter(fw);
String line = null;
while ((line = bfr.readLine()) != null) {
bfw.write(line);
bfw.newLine();//进行换行
}
bfw.flush();
bfr.close();
bfw.close();
}
}
4.打印流(字节打印流PrintStream和字符打印流PrintWriter)
含义:单向从程序中向目标输出数据
5.ObjectStream
⑴对象存储在内存中,程序中止运行,内存数据清空,有时需要保存内存中的数据,需要用流对象,将对象数据存到文件中,做对象数据持久化(长久保存)
ObjectInputStream ObjectOutputStream都属于处理流
此过程为I对象的序列化和反序列化,其中反序列也是一种创建对象的方法。
⑵序列化与反序列化
package com.ffyc.javaIo;
import java.io.*;
import java.util.Date;
public class Object {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//序列化
/*FileOutputStream fos=new FileOutputStream("D:/show.txt");
ObjectOutputStream obj=new ObjectOutputStream(fos);
Date date=new Date();
Car c= new Car("丰田",200);
String s="ajbkc";
obj.writeObject(date);
obj.writeObject(s);*/
//反序列化
FileInputStream fin=new FileInputStream("D:/show.txt");
ObjectInputStream ois=new ObjectInputStream(fin);
Date date=(Date)ois.readObject();
String s=(String)ois.readObject();
System.out.println(date);
System.out.println(s);
}
}
6.Serializable 序列化接口
如果需要某类对象进行序列化,那么此类必须实现Serializable 接口 ,会为类生成一个版本号,会自动默认生成,但会有一个问题,每个类改变了,版本号则重新生成。
7.transient关键字
transient关键字修饰的内容不能生成或输出,修饰的属性在序列化中不会保存在文件中