IO流
分类
1.按照方向进行分类:输入流 输出流(相对于程序而言,从程序写数据到文件中是输出)
2.按照传输类型进行分类:字节流 字符流
3.组合: 字节输入流 字节输出流 字符输入流 字符输出流
字节输入流
InputStream 抽象类,不能new,可以作为超类,学习其所提供的共性方法
–FileInputStream 子类,操作文件的字节输入流,普通类
–BufferedInputStream 子类,缓冲字节输入流,普通类
字符输入流
Reader 抽象类,不能new,可以作为超类,学习其所提供的共性方法
–FileReader,子类,操作文件的字符输入流,普通类
–BufferedReader,子类,缓冲字符输入流,普通类 (高效流高效的原因在于底层维护了一个byte[],8192大小)
字节输出流
OutputStream 抽象类,不能new,可以作为超类,学习其所提供的共性方法
–FileOutputStream 子类,操作文件的字节输出流,普通类
–BufferedOutputStream 子类,缓冲字节输出流,普通类
字符输出流
Writer 抽象类,不能new,可以作为超类,学习其所提供的共性方法
–FileWriter,子类,操作文件的字符输出流,普通类
–BufferedWriter,子类,缓冲字符输出流,普通类
文件复制案例
public class TestCopyFile {
public static void main(String[] args) {
System.out.println("输入原文件的路径");//复制
String f=new Scanner(System.in).nextLine();
System.out.println("输入目标文件的路径");//复制到哪
String t=new Scanner(System.in).nextLine();
//接收到的路径进行封装,变成可以进行文件操作的File对象
File from=new File(f);
File to=new File(t);
ZJCopy(from,to);//自定义字节流复制文件的方法
//ZFCopy(from,to);//自定义字符流复制文件的方法
}
private static void ZFCopy(File from, File to) {
Reader in=null;//定义在整个方法都生效的字符输入流父类类型的变量
Writer out=null;//定义在整个方法都生效的字符输出流父类类型的变量
try {
in=new BufferedReader(new FileReader(from));
out=new BufferedWriter(new FileWriter(to));
int b;
while((b=in.read())!=-1){
out.write(b);//将本轮循环到的内容写出
}
System.out.println("文件复制成功");
}catch (Exception e){
System.out.println("文件复制失败");
e.printStackTrace();
}finally {
/*1.流资源必须释放,释放的是之前使用过程中所有的流对象
* 2.关流是有顺序的,注意,后创建的流先关闭,为了不影响其他的代码,不能先关先*/
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void ZJCopy(File from, File to) {
InputStream in=null;
OutputStream out = null;
try {
in=new BufferedInputStream(new FileInputStream(from));
out=new BufferedOutputStream(new FileOutputStream(to));
int b;
while ((b=in.read())!=-1){
out.write(b);
}
System.out.println("文件复制成功");
}catch(Exception e){
System.out.println("文件复制失败");
e.printStackTrace();
}finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
序列化与反序列化
序列化 是指将Java对象转换为字节序列的过程
反序列化 将字节序列转换为Java对象的过程
涉及到的流
序列化:ObjectOutputStream
反序列化:ObjectInputStream
- 反序列化时的UID与序列化时的UID要保持一致,或者测试时一次序列操作对应一次反序列化操作,否则不匹配就报错
- 需要给每个进行序列化的文件分配唯一的UID值