第十三天

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值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值