IO流:
将一个文件拆分为若干个文件的过程如下
先将一个文件的全部内容读取到缓存区当中,然后在分别写入多个文件当中。
public static void main(String[] args) throws Exception {
//原文件(待拆分的文件)
File file = new File("G:\\video.zip");
//拆分后的目录
File file1 = new File("G:\\video");
splitFile(file,file1);
}
private static void splitFile(File file, File file1) throws IOException {
//判断是否存在文件夹,不存在就创建
if (!file1.exists()){
file1.mkdir();
}
//思路 : 拆分:1个输入流 ,n个输出流 (a,b,c)
//合并: n个输入流 ,1个输出流 (注意顺序a,b,c)
//拆分:1个输入流
FileInputStream inputStream = new FileInputStream(file);
FileOutputStream outputStream =null;
//定义缓冲区为1M,当缓冲区填满时,一次性刷出成一个文件
byte[] bytes = new byte[1024 * 1024];
int len =-1;
int count = 0;
while((len = inputStream.read(bytes))>0){
outputStream = new FileOutputStream(new File(file1,count++ +".part"));
outputStream.write(bytes,0 ,len);
//关闭流、关闭之前会强行清理缓冲区
outputStream.close();
}
inputStream.close();
}
拆分的时候:如何 将文件名、分割的数量保留,为后续合并做准备,再生成一个配置文件config.properties保存上述描述信息。有以下两种方法:
//方式一:
//配置文件
outputStream = new FileOutputStream(new File("G:\\video\\config.properties"));
//查询当前系统的换行符
String properties = System.getProperty("line.separator");
//文件名
outputStream.write(("filename="+file.getName()).getBytes());
outputStream.write(properties.getBytes());
//拆分的个数
outputStream.write(("count="+(count-1)).getBytes());
outputStream.close()
/***************************************************************/
//方式二: Properties,将内存中的多个 属性以 key=value的形式 写到硬盘中
Properties properties = new Properties();
properties.setProperty("filename",file.getName());
properties.setProperty("count",count+"");
//写入硬盘 (保存:持久化)
properties.store(outputStream,"file config");
outputStream.close();
合并文件:
public void test1()throws Exception {
//读取多个拆分后的文件(inputs:所有输入流的集合)
ArrayList<FileInputStream> inputs = new ArrayList<>();
//数据先写固定,后面读取配置文件的个数
for (int i = 0; i < 23; i++) {
inputs.add(new FileInputStream("G:\\video\\"+i+".part"));
}
//指定合并后的文件输出流,写入到my.zip文件当中
FileOutputStream outputStream = new FileOutputStream("G:\\my.zip");
//将多个输入流依次读入内存,最后再一次性输出到my.zip
byte[] buf = new byte[1024 * 1024];
for (FileInputStream input : inputs) {
int read = input.read(buf);
outputStream.write(buf,0,read);
}
//关闭文件
outputStream.close();
for (FileInputStream input : inputs) {
input.close();
}
}
优化,通过配置文件读取
/*读取配置文件*/
public Properties getProperties() throws Exception{
String path = "G:\\video\\config.properties";
FileInputStream inputStream = new FileInputStream(path);
Properties properties = new Properties();
properties.load(inputStream);
return properties;
}
private void mergeFile() throws Exception {
//通过配置文件获取filename和count
Properties properties = getProperties();
String filename = (String) properties.get("filename");
int count = Integer.valueOf(String.valueOf(properties.get("count"))) ;
//System.out.println(filename+":"+count);
ArrayList<FileInputStream> inputs = new ArrayList<>();
for (int i = 0; i < count; i++) {
inputs.add(new FileInputStream("G:\\video\\"+i+".part"));
}
//将list集合转换为Enumeration集合
Enumeration<FileInputStream> enumeration = Collections.enumeration(inputs);
//多个流 -> 一个流
SequenceInputStream sin = new SequenceInputStream(enumeration);
FileOutputStream outputStream = new FileOutputStream("G:\\"+filename);
int len =-1;
byte[] bytes = new byte[1024 * 1024];
while ((len = sin.read(bytes))>0){
outputStream.write(bytes,0,len);
}
outputStream.close();
sin.close();
}
读取配置文件信息
public class ConfReader {
public static void main(String[] args) throws Exception {
//读取配置文件
File confFile = new File("G:\\video\\config.properties");
readConfig(confFile);
}
private static void readConfig(File confFile) throws Exception {
BufferedReader bufferedReader = new BufferedReader(new FileReader(confFile));
String line =null;
//一行一行读取
while ((line = bufferedReader.readLine())!=null){
String[] split = line.split("=");
if (line.startsWith("filename")){
System.out.println(split[0]+"="+split[1]);
}else if (line.startsWith("count")){
System.out.println(split[0]+"="+split[1]);
}else{
}
bufferedReader.close();
}
}