字符输出流与序列化( 三 )


将上面的代码进行改进如下
public class CopyFileDemo2 {public static void main(String[] args) {//1.定义变量, 存储源文件路径String source = "d:/iotest/src/xiaoquanquan.mp4";//2.定义变量, 存储目标文件路径String target = "d:/iotest/tar/xiaoquanquan-副本.mp4";try {//3.调用copyBinaryFile方法复制任意文件copyBinaryFile( source, target );System.out.println( source+" 文件复制成功!" );} catch (Exception e) {System.out.println( source+" 文件复制失败!" );e.printStackTrace();}}/** 方法作用: 复制指定位置的文本文件到另一位置(可以复制任何文件)* source参数: 源文件路径(即,要复制的文件路径)* target参数: 目标文件路径(即,通过源文件复制的副本文件路径)*/public static void copyBinaryFile(String source, String target) throws Exception {//1.定义带缓冲区的字节输入流, 读取源文件中的数据BufferedInputStream in = new BufferedInputStream( new FileInputStream( source ) );//2.定义带缓冲区的字节输出流, 将源文件中的数据写入到目标文件中BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream( target ) );//3.从源文件中读取(in)数据, 将读取到的数据写入(out)到目标文件中//定义一个字节数据, 将读进来的数据存入byte数组中, 再将byte数组写入到目标文件中byte[] buf = new byte[8192];int data;while( (data=http://www.kingceram.com/post/in.read( buf )) != -1 ) {//将byte数组中的数据写入到目标文件中out.write( buf );}//4.释放资源(关闭流)in.close();out.close();}/** 方法作用: 复制指定位置的文本文件到另一位置(只能复制文本文件)* source参数: 源文件路径(即,要复制的文件路径)* target参数: 目标文件路径(即,通过源文件复制的副本文件路径)*/public static void copyTextFile(String source, String target) throws Exception {//1.定义带缓冲区的字符输入流, 读取源文件中的数据BufferedReader in = new BufferedReader( new FileReader( source ) );//2.定义带缓冲区的字符输出流, 将源文件中的数据写入到目标文件中BufferedWriter out = new BufferedWriter( new FileWriter( target ) );//3.从源文件中读取(in)数据, 将读取到的数据写入(out)到目标文件中//定义一个字符数据, 将读进来的数据存入char数组中, 再将char数组写入到目标文件中char[] buf = new char[8192];int data;while( (data=in.read( buf )) != -1 ) {//将读取到的数据写入到目标文件out.write( buf );}//4.释放资源(关闭流)in.close();out.close();}}
3.序列化 / 反序列化 3.1.1.1 概述
序列化 ()是将对象的状态信息转换为可以存储或传输的形式的过程 。
– 简单地说: 将内存中的Java对象转换为字节序列(二进制)的过程就是序列化 。该字节序列中包含了对象的数据(比如成员变量,成员方法等)以及对象的类型信息 。
– 将内存中的Java对象转成二进制文件可以存储在磁盘上, 或者转成流数据, 这样可以通过网络进行Java对象数据的传输 。而【反序列化】:
– 将包含对象信息的字节序列(二进制)再转换为内存中的Java对象的过程就是反序列化 。
实现序列化:
– 利用字节输出流,将内存中的Java对象,按照固定格式转成字节序列输出
实现反序列化:
– 利用字节输入流,读取序列化的字节序列,将这些字节序列重新转换为Java对象
3.2. 应用场景
思考问题1:
内存中的Java对象在服务器关闭后, 随着内存的释放, 内存中的数据也会得到释放 。而在服务器重启后也很难恢复这些数据;
解决方法:
如果要重启服务器(比如:重新部署应用程序), 在关闭服务器之前, 可以将内存中的Java对象通过序列化转换为文件存储在磁盘上, 在部署完应用后, 启动服务器, 此时再通过反序列化将磁盘上的文件转换为服务器内存中的Java对象 。这样既重启了服务器, 实现了应用的重新部署, 也避免了重启服务器时内存中数据的丢失问题!