【阶段一目标:文件的分割】
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 =