【JAVADAY14-文件操作,包装流,以及序列化反序列化】

包装流的使用,特点更快更效率的读写文件

读文件(文本内容)

package File;

import org.junit.jupiter.api.Test;

import java.io.*;
import java.nio.file.Path;

public class BufferedReader01 {
    public static void main(String[] args) throws IOException {
        //包装流可以对字符数组文件处理,功能更强大,读取更快
        //下面我们来用一下包装流
        //对字节的数据最好用stream,此方法更适用于读取文本文件
        String path="E:\\Test01.txt";
        //ReaderFile(path);
        ReaderFile02(path);
    }
    @Test
    //声明一个读文件的方法,为了代码的简洁
    public static void ReaderFile(String path) throws IOException {
        if(new File(path).isFile()){
            //创建一个使用默认大小输入缓冲区的缓冲字符输入流。最好包装一下read方法,我这里是字符,所以包装了filereader对象
            BufferedReader bufferedReader = new BufferedReader(new FileReader(path));
            char[] arr=new char[100];
            int read=0;
            while ((read=bufferedReader.read(arr,0,arr.length))!=-1){
                System.out.print(new String(arr,0,read));
            }
            bufferedReader.close();
        }else {
            System.out.println("文件不存在!无法读取!");
        }
    }
    public static void ReaderFile02(String Path) throws IOException{
        if(new File(Path).isFile()){
            //创建一个使用默认大小输入缓冲区的缓冲字符输入流。最好包装一下read方法,我这里是字符,所以包装了filereader对象
            BufferedReader bufferedReader = new BufferedReader(new FileReader(Path));
            String s = null;
            //使用readline方法按行读取效率高
            while ((s=bufferedReader.readLine())!=null){
                System.out.println(s);
            }
            bufferedReader.close();
        }else {
            System.out.println("文件不存在!无法读取!");
        }
    }
}

写入内容(文本)到文件

package File;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWrite01 {
    public static void main(String[] args) throws IOException {
        String path="E:\\Test01.txt";
        Write01(path);
        Write02(path);
    }
    //方式一 默认覆盖
    public static void Write01(String path) throws IOException {
        int read=0;
        char[] chars = {'A','b','c'};
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(path));
        bufferedWriter.write(chars);
        //注意此方法会覆盖掉原本的内容!!!
        //换行
        bufferedWriter.newLine();
        bufferedWriter.write(chars);
        System.out.println("添加完成");
        bufferedWriter.close();
    }
    //方式二 追加
    public static void Write02(String path) throws IOException {
        String s="我爱你";
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(path,true));
        //buffwrite底层添加的代码是利用filewriter的
        //因此想要追加就在filewriter添加一个true即可
        bufferedWriter.write(s);
        bufferedWriter.newLine();
        bufferedWriter.write(s);
        bufferedWriter.newLine();
        bufferedWriter.write(s);

        System.out.println("追加完成");
        bufferedWriter.close();
    }
}

文本类的拷贝

package File;

import java.io.*;

public class BufferCopy {
    public static void main(String[] args) throws IOException {
        String sourpath="E:\\JavaProject\\TnKeWar\\src\\Tnke\\Hero.java";
        String endpath="E:\\hero.java";
        //注意 下面方法只适用于复制文本类的文件 不要读取二进制文件
        copy(sourpath,endpath);
    }
    public static void copy(String sourpath,String endpath) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new FileReader(sourpath));
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(endpath));
        //先读取 在存放e
        String s;
        while ((s=bufferedReader.readLine())!=null){
            bufferedWriter.write(s);
        }
        System.out.println("复制完成!");
        bufferedReader.close();
        bufferedWriter.close();
    }
}

字节Buffer流

二进制文件的拷贝

package BufferByte;

import java.io.*;

public class BufferByteCopy {
    public static void main(String[] args) throws IOException {
        //这里用到的是字节处理流
        String sourpath="C:\\Users\\TMJIE5200\\Pictures\\150.png";
        String endpath="e:\\girel.png";
        Copy(sourpath,endpath);
    }
    public static void Copy(String sourpath,String endpath) throws IOException {
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(sourpath));
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(endpath));
        byte[] bytes=new byte[1024];
        int read;
        while ((read=bufferedInputStream.read(bytes))!=-1){
            bufferedOutputStream.write(bytes,0,read);
        }
        System.out.println("拷贝完成");
        bufferedInputStream.close();
        bufferedOutputStream.close();
    }
}

Object,序列化与反序列化

序列化

package ObjectFileStream;

import java.io.*;

public class OjectFileOutPutStream {
    public static void main(String[] args) throws IOException {
        //序列化一个类
        String path = "E:\\data.dat";
        Serializ(path);
    }

    public static void Serializ(String path) throws IOException {
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(path));
        objectOutputStream.writeObject(new Animals("小明", 18, "男"));
        objectOutputStream.writeInt(100);
        objectOutputStream.close();
        System.out.println("序列化完成!");
    }
}

反序列化

package ObjectFileStream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;

public class ObjectInputStream01 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //反序列化
        String path="E:\\data.dat";
        Fun(path);
    }
    public static void Fun(String path) throws IOException, ClassNotFoundException {
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(path));
        //注意顺序问题
        //即读取数据必须和输入时的顺序一致
        System.out.println("对象:"+objectInputStream.readObject());
        System.out.println("数字:"+objectInputStream.readInt());
        //如果想在反序列化时调用类的方法,必须让此类是公共类
        System.out.println(new Animals("小王",22,"女"));
        objectInputStream.close();
        System.out.println("反序列化完成!");
    }
}

上述中使用的Animals类

package ObjectFileStream;

import java.io.Serializable;

public class Animals implements Serializable {
    private String Name;
    private int Age;
    private String Sex;
    //序列化的类中建议加上下面seriaVersionUID为了提高版本的兼容性
    private static final long seriaVersionUID = 1L;

    public Animals(String name, int age, String sex) {
        Name = name;
        Age = age;
        Sex = sex;
    }

    //序列化时默认序列化所以成员,除了static 和 transient修饰的成员
    @Override
    public String toString() {
        return "Animals{" +
                "Name='" + Name + '\'' +
                ", Age=" + Age +
                ", Sex='" + Sex + '\'' +
                '}';
    }
}

序列化与反序列化细节

文件的序列化操作,即保存值和保存值对应的类型
文件的反序列化操作,根据保存的文件,恢复成原本的样子
前提:
想要实现序列化,需要在序列化的类实现下面2个接口之一

serializable(这个接口没有方法)、externalizable (这个接口有方法需要实现)标记一个类是可以序列化的
因此我们一般选择serializable
//序列化时默认序列化所以成员,除了static 和 transient修饰的成员
//序列化的类中建议加上下面seriaVersionUID为了提高版本的兼容性
private static final long seriaVersionUID=1L;

序列化类中的属性,必须实现了serializable,比如int和string 他们的包装类 Inteage 和 String 都实现了的
如果你定义了一个 private Master=new Master(),那么你在序列化时一定报错
怎么解决呢,在Mster类实现serializable即可。
序列化具有继承性,父类实现了serializable子类就默认实现了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Keyle777

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值