Object流|对象流|引用数据类型流;
字节流的功能流
ObjectInputStream-----反序列化输入流
新增方法--Object readObject() 从ObjectInputStream中读取一个对象。 等等
ObjectOutputStream-----序列化输出流
新增方法 void writeObject(Object obj) 将指定的对象写入ObjectOutputStream。
序列化: 将对象数据转为可存储或者可传输的状态的过程
不是所有类型的数据都能序列化 java.io.Serializable(如果写出的对象类型没有实现序列化接口,会遇到运行时异常java.io.NotSerializableException)
1、序列化与反序列化顺序保持一致
2、不是所有的属性都需要序列化 transient
3、static的成员不会被序列化
4、如果父类实现类序列化接口,子类所有内容都可以进行序列化
序列号: 当实现了序列化的类型默认存在一个序列号
当类中的成员发生改变,序列号默认会重新生成
作用: 使用序列号可以实现检查前后版本不一致问题
通过快捷键生成序列号:
1.类型必须实现了序列化接口
2.Setting中进行配置
3.双击类名alt+enter,自动生成序列号
CommonsIO 是apache的一个开源的工具包,封装了IO操作的相关类,使用Commons IO可以很方便的读写文件,url源代码等。(是一个第三方的开源组件)
使用第三方组件的步骤:
1.对应官网中下载源码 jar
2.在项目下新建一个文件夹目录lib,lib下存放以后项目所依赖的所有jar包
3.选中jar包,右键add as lib...
4.在项目下对应类中进行使用
public class Class004_Obect {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//testWrite("D://heihei.txt");
testRead("D://heihei.txt");
}
public static void testRead(String path) throws IOException, ClassNotFoundException {
//1.构建输入流
ObjectInputStream is = new ObjectInputStream(new FileInputStream(path));
//2.读入数据
Person p = (Person) is.readObject();
int[] arr = (int[]) is.readObject();
//3.处理数据
System.out.println(p);
System.out.println(Arrays.toString(arr));
//4.关闭
is.close();
}
//序列化输出
public static void testWrite(String path) throws IOException {
//1.定义输出流
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(path));
//2.准备数据
Person p = new Person("张三",18);
p.a = 10;
int[] arr = {1,2,3,4,5};
//3.写出
os.writeObject(p);
os.writeObject(arr);
//4.刷出
os.flush();
//5.关闭
os.close();
p.a = 100;
}
}
class Person implements Serializable {
private static final long serialVersionUID = -1108656603703788489L;
private String name;
private transient int age;
public static int a ;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = 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;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
",a="+a+
'}';
}
}
public class Class001_CommonsIO {
public static void main(String[] args) throws IOException {
//#### IO工具类IOUtils
//`IOUtils.copy(InputStream input, OutputStream output) `// 此方法有多个重载方法,满足不同的输入输出流
IOUtils.copy(new FileInputStream("D://test.txt"),new FileOutputStream("D://xixi.txt"));
//IO 工具类 FilenameUtils
//`FilenameUtils.getBaseName(String filename)` // 去除目录和后缀后的文件名
System.out.println(FilenameUtils.getBaseName("D://test.txt"));
//`FilenameUtils.getExtension(String filename)` // 获取文件的后缀
System.out.println(FilenameUtils.getExtension("D://logo.png"));
//`isExtension(String fileName, String text) `// 判断fileName是否是text后缀名
System.out.println(FilenameUtils.isExtension("D://logo.jpg","png"));
//IO 工具类 FileUtils
//`FileUtils.copyFile(File srcFile, File destFile)` // 复制文件
FileUtils.copyFile(new File("D://test.txt"), FileUtils.getFile("D://hehe.txt"));
//`FileUtils.copyFileToDirectory(File srcFile, File destDir)` // 复制文件到一个指定的目录
FileUtils.copyFileToDirectory(new File("D://test.txt"), new File("D://eee")); //目标路径不存在,也可以帮助创建
//`FileUtils.writeStringToFile(File file, String data, String encoding, boolean append)`// 指定知否追加
FileUtils.writeStringToFile(new File("D://test.txt"), "\r\nwangwuwuwuwuwuwuwu", "UTF-8",true);
//`FileUtils.deleteDirectory(File directory)` // 删除文件夹,包括文件夹和文件夹里面所有的文件
FileUtils.deleteDirectory(new File("D://DDD"));
//`FileUtils.copyDirectory(File srcDir, File destDir)` // 复制文件夹(文件夹里面的文件内容也会复制)
FileUtils.copyDirectory(new File("D://AAA"), new File("D://BBB"));
//`FileUtils.copyDirectoryToDirectory(File srcDir, File destDir)` // 以子目录的形式将文件夹复制到到另一个文件夹下
FileUtils.copyDirectoryToDirectory(new File("D://AAA"), new File("D://BBB"));
//`FileUtils.copyDirectory(File srcDir, File destDir, FileFilter filter)` // 复制文件夹,带有文件过滤功能
FileUtils.copyDirectory(new File("D://AAA"), new File("D://HAHA"), FileFilterUtils.fileFileFilter());
}
}