IO流--文件切割合并&对象的序列化

【阶段一目标:文件的分割】
    1,切割文件的原理:一个源对应多个目的;切割文件的两种方式。
    2,碎片文件的命名和编号。
    3,程序代码体现。
    4,如何记录源文件的类型以及碎片的个数(建立配置信息文件)(其实也可以将这些信息记录碎片文件中)
    5,通过Properties属性集建立配置文件。
        常见方法:load(InputStream) load(Reader)  
        store(OutputStream,conmments),store(Writer,conmments)
    6,Properties的作为配置在应用程序很常见,主要用于将配置信息持久化。
        建立的配置文件扩展名规范: .properties。


    【学习结果】
    1,自己独立完成文件切割程序。★★★★★
    2,独立完成程序试用期次数的限定。★★★★
------------------------
【阶段二目标:文件的合并】
    1,文件合并的原理:多个源对应一个目的。
    2,每一个碎片对应一个输入流,多个输入流对象先要进行集合存储。
    3,SequenceInputStream可以解决这个问题。将多个源合并成一个源。
    4,读取配置文件信息,并加入健壮性的判断。
    5,独立解决碎片文件缺少的判断。

    【学习结果】
    1,完成几个基本的碎片文件的合并。
    2,读取配置文件信息,加入更多合理的判断,完成文件的合并。★★★★
------------------------
【阶段三目标:对象的序列化和反序列化】
    1,对象的序列化,就是将对象持久化存储。
    目的是将对象的数据持久化,便于下次程序对该对象数据的使用。

    2,写入到文件中使用FileOutputStream,但是无法写入对象,
    需要额外功能,在OutputStream的子类中找到了ObjectOutputStream。

    3,写入对象时出现了异常NotSerializableException,通过查阅api。
    发现序列化的类必须实现一个接口Serializable,才可以启动序列化功能。

    4,对象存储后,必须通过OutputInputStream才可以读取出来。
    readObject读取,编译时会出现ClassNotFoundException,说明读取对象文件必须要有对应的字节码文件。
    读取对象就是对象的反序列化。

    5,当写入对象的类源码发现变化,在反序列化出现InvalidClassException。
    通过阅读序列化接口Serializable发现 序列号变化了。
    根据该接口的文档描述,显示声明序列号 private static final long serialVersionUID = 42L;
    所以,该接口的作用就是用来启动类的序列化功能,并要求给类加一个序列号。

    6,注意:静态的数据不会被序列化,非静态的数据想要不被序列化可以用transient(瞬态)关键字修饰。

    【学习结果】
    1,明确对象序列化的作用,是用于对一些对象数据进行持久化,在程序出现问题下次启动时这些对象的数据还可以使用。
    2,序列化接口的作用?
    3,非静态的数据不要被序列化怎么解决?

读取配置文件信息的原始方法

也是Properties load方法的原理

public class ReaderPartConfigDemo {
   

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        //解析partConfig文件中的信息。

        File configFile = new File("E:\\PartFiles\\7.partconfig");
        readPathConfig(configFile);

    }

    public static void readPathConfig(File configFile) throws IOException {

        /*
         * 配置文件规律,只要读取一行文本,按照 = 对文本进行切割即可。
         */
        BufferedReader bufr = new BufferedReader(new FileReader(configFile));

        String line = null;
        while((line=bufr.readLine())!=null){
            String[] arr = line.split("=");
            System.out.println(arr[0]+":::::"+arr[1]);
            //map.put(arr[0],arr[1]);
        }
        /*
         *  发现配置文件信息很多,需要进行存储。
         *  用哪个容器呢?个数不确定,就使用集合。
         *  发现信息中存在对应关系,使用Map集合。
         *  发现一点配置文件中的信息都是字符串,这些信息不在内存中而是在硬盘上。
         *  map中和io技术集合的集合对象: Properties,它里面存储的键值都是字符串,通常这个集合就用于配置文件的操作。
         *  
         */


        bufr.close();


    }

}

切割文件,并用Properties存储碎片文件信息

public class SplitFileTest {
   

    private static final int BUFFER_SIZE = 1048576;//1024*1024
    private static final String LINE_SEPARATOR = System.getProperty("line.separator");

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
//      练习:将一个媒体文件切割成多个碎片。
        /*
         * 思路:
         * 1,读取源文件,将源文件的数据分别复制到多个文件中。
         * 2,切割方式有两种:按照碎片个数切,要么按照指定大小切。
         * 3,一个输入流对应多个输出流。
         * 4,每一个碎片都需要编号,顺序不要错。
         * 
         */

        File srcFile = new File("E:\\1.mp3");
        File partsDir = new File("E:\\PartFiles");
        splitFile(srcFile,partsDir);

    }

    /**
     * 切割文件。
     * @param srcFile
     * @param partsDir
     * @throws IOException 
     */
    public static void splitFile(File srcFile, File partsDir) throws IOException {

        //健壮性的判断。
        if(!(srcFile.exists() && srcFile.isFile())){
            throw new RuntimeException("源文件不是正确的文件或者不存在");
        }

        if(!partsDir.exists()){
            partsDir.mkdirs();
        }

        //1,使用字节流读取流和源文件关联。
        FileInputStream fis = new FileInputStream(srcFile);

        //2,明确目的。目的输出流有多个,只创建引用。
        FileOutputStream fos = 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值