1、序列化和反序列化
-
序列化 --- 将一个java对象转换成2进制流数据过程
因为我们做操作的java对象可能需要在多态计算机之间传递。
如何实现序列化?
-
为被序列化的java对象的生成类实现一个序列化接口(Serializable)
public interface Serializable
特殊---该接口一个方法都没有。
类的序列化有实现java.io.Serializable接口的类启用。
不实现此接口的类将不会使任何状态序列化或反序列化,可序列化类的所有子类型都是可序列化的。
-
通过java提供ObjectOutputStream类的writeObject(Object obj)
构造方法
ObjectOutputStream(OutputStream out)创建一个写入指定的OutputStream字节输出流的ObjectOutputStream。
常用方法
void writeObject(Object obj)将指定的对象写入ObjectOutputStream
public class Student implements Serializable{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
public class ObjectOutputStreamTest { public static void main(String[] args) throws Exception{ File file = new File("E:" + File.separator + "20220202" + File.separator + "test.txt"); FileOutputStream fos = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(fos); Student student = new Student(); student.setName("张三"); student.setAge(20); oos.writeObject(student); oos.close(); fos.close(); } }
-
-
反序列化---将二进制流数据转换成java对象的过程
需要ObjectInputStream类的Object readObject()方法读取对象。
构造方法
ObjectInputStream(InputStream in)
常用方法
Object readObject()从ObjectInputStream读取一个对象。
public class ObjectInputStreamTest {
public static void main(String[] args) throws Exception{
File file = new File("E:" + File.separator + "20220202" + File.separator + "test.txt");
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
Student student = (Student) ois.readObject();
System.out.println(student.getName() +"," + student.getAge());
fis.close();
ois.close();
}
}
总结:
操作步骤
-
创建文件对象,用来指定读写的位置
-
创建输入/输出流的对象
-
调用输入/输出对象的读(read/readXXX())/写(write/writeXXX())方法
-
关闭流。
-
stream结尾的是字节流,将读写的数据转换成字节数组。
-
Reader结尾的是字符输入流,将读取的数据保存给String/字符数组。
-
Writer结尾的的字符输出流,将写出的数据转换成String/字符数组。
作业1:
获取C盘下windows目录下所有的exe文件。
public class WindowsFile {
public static void main(String[] args) {
File file = new File("C:" + File.separator + "Windows");
//得到C盘下的windows目录中的所有文件以及文件对象
File[] files = file.listFiles();
//保存的列表
List<String> exeFileList = new ArrayList<>();
//遍历C盘下的windows目录汇总的所有文件以及文件夹对象得到文件的名称
for (File f : files) {
if(f.isFile()){
//获取文件名称
String fileName = f.getName();
//截取文件名称字符串得到“exe”后缀名
String substring = fileName.substring(fileName.lastIndexOf(".") + 1);
//通过后缀名得到指定文件
if(substring.equals("exe")){
//保存到列表中
exeFileList.add(fileName);
}
}
}
//查看得到的exe文件
for (String s : exeFileList) {
System.out.println(s);
}
}
}
作业2:复制文件:D:\image-20221204205705789.png ---copy--->E:\20220202\image-20221204205705789.png
public class CopyFile {
public static void main(String[] args) throws Exception {
File fileSrc = new File("D:" + File.separator + "image-20221204205705789.png");
File fileDes = new File("E:" + File.separator + "20220202" + File.separator + "image-20221204205705789.png");
FileInputStream fis = new FileInputStream(fileSrc);
FileOutputStream fos = new FileOutputStream(fileDes);
byte[] bytes = new byte[(int)fileSrc.length()];
fis.read(bytes);
fos.write(bytes);
fis.close();
fos.close();
}
}