欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【java基础:IO】带配置文件的文件切割与合并Demostration

程序员文章站 2022-04-17 18:32:50
...

第一部分:带写入配置文件的文件切割代码。

package splitfile;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

public class SplitFileDemo {

	/*
	 * 需求:将制定文件切割成1M为单位的小文件,并输出。
	 * 方法:其实就是采用了通过数组缓存的方法进行文件的读取,每次就缓存制定的大小,读完指定大小后就输出到一个文件,
	 * 再读再输出到另外一个文件。
	 */
	private static final int SIZE = 1024*1024;//设定大小1M
	public static void main(String[] args) throws IOException {
		method_2();
	}
	
	/**
	 * 下面是带配置文件的文件切割方法,切割完成之后把被切割的文件名以及切成了多少个文件存入配置文件中!
	 * @throws IOException 
	 */
	public static void method_2() throws IOException {
		//分割文件
		File file=new File("F:\\2016.mp3");
		File dir=new File("F:\\splitfiles");
		if(!dir.exists()) {
			dir.mkdirs();
		}
		FileInputStream fis=new FileInputStream(file);
		byte[] buf=new byte[SIZE];
		int len=0;
		int count=1;
		FileOutputStream fos=null;
		while((len=fis.read(buf))!=-1) {
			/*
			 * 注意:碎片文件.part的格式可以自定义,不一定是.part,.hehe也是可以的!
			 */
			fos=new FileOutputStream(new File(dir,(count++)+".part"));
			fos.write(buf, 0, len);
			fos.close();//开一次,则关一次
		}
		fis.close();	
		//创建配置文件,保存分割之前的文件名和分割之后的文件数量(这个数量加上了配置文件的数量)。	
		fos=new FileOutputStream(new File(dir,count+".properties"));
		Properties pt=new Properties();
		pt.setProperty("filename", file.getName());
		pt.setProperty("time", String.valueOf(count));
		pt.store(fos, "partfiles info");
	}
	
	/**
	 * 下面是不带配置文件的分割方法
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public static void method_1() throws FileNotFoundException, IOException {
		File file=new File("F:\\2016.mp3");
		File dir=new File("F:\\splitfiles");
		if(!dir.exists()) {
			dir.mkdirs();
		}
		FileInputStream fis=new FileInputStream(file);
		FileOutputStream fos=null;
		byte[] buf=new byte[SIZE];
		int len=0;
		int count=1;
		while((len=fis.read(buf))!=-1) {
			/*
			 * 注意:碎片文件.part的格式可以自定义,不一定是.part,.hehe也是可以的!
			 */
			fos=new FileOutputStream(new File(dir,(count++)+".part"));
			fos.write(buf, 0, len);
			fos.close();//开一次,则关一次
		}
		fis.close();
	}
}


第二部分:带读取配置文件的文件合并代码

package mergefiles;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Properties;

public class MergeFiles {
	
	/*
	 * 需求:和并几个碎片文件,采用SequenceInputStream,然后输出到一个文件中;
	 */
	public static void main(String[] args) throws IOException {
		File file=new File("F:\\splitfiles");
		mergefiles_2(file);
	}
	

	/**
	 * 下面是带配置文件检测方法的文件合并程序
	 * @param file
	 * @throws IOException 
	 */
	private static void mergefiles_2(File file) throws IOException {
		
		//获取碎片文件夹里面的文件并检测是否有配置文件
		File[] files=file.listFiles(new SuffixFilter(".properties"));
		if(files.length!=1) {
			throw new RuntimeException("碎片文件配置信息不对,请确认后再试!");
		}
		
		//接下来就是获取配置文件。
		File confile=null;
		for(File file1:files) {
			if((file1.getName()).endsWith(".properties")) {
				confile=file1;
			}
		}
		
		//既然已经找到了配置文件了,接下来就是用Properties集合来存储配置文件中的键值对。
		Properties pt=new Properties();
		FileInputStream fis=new FileInputStream(confile);
		pt.load(fis);
		
		//获取配置文件中的键值对信息
		String filename=pt.getProperty("filename");
		int count=Integer.parseInt(pt.getProperty("time"));
		
		//下面将从键值对中获取的文件数与从指定目录中的文件数进行一个对不,不对的话就抛出异常
		File[] partfiles=file.listFiles(new SuffixFilter(".part"));
		if((count-1)!=partfiles.length) {//count-1的原因是count是包括配置文件在内的数量
			throw new RuntimeException("碎片文件个数不对,请确认后再试!");
		}		
//==================================================================================		
		//当一切都正常了之后,接下来就是整合碎片文件!与之前不含配置文件的操作步骤类似。
		//首先建立一个大流
		ArrayList<FileInputStream> al=new ArrayList<>();
		for(int i=0;i<partfiles.length;i++) {
			al.add(new FileInputStream(partfiles[i]));
		}
		Enumeration<FileInputStream> en=Collections.enumeration(al);
		SequenceInputStream sis=new SequenceInputStream(en);//至此输入的大流才建成!
		
		//接下来就是输出了
		FileOutputStream fos=new FileOutputStream(new File(file,filename));
		byte[] buf=new byte[1024];
		int len=0;
		while((len=sis.read(buf))!=-1) {
			fos.write(buf, 0, len);
		}
		fos.close();
		sis.close();		
	}


	/**
	 * 下面的方法是不带配置文件的文件合并程序。
	 * @param dir
	 * @throws IOException
	 */
	public static void mergefiles_1(File dir) throws IOException {
		//建立一个大流
		ArrayList<FileInputStream> al=new ArrayList<>();
		int num=(dir.list()).length;//计算dir目录下的文件数量
		for(int i=1;i<=num;i++) {
			al.add(new FileInputStream(new File(dir,i+".part")));
		}
		Enumeration<FileInputStream> en=Collections.enumeration(al);
		SequenceInputStream sis=new SequenceInputStream(en);//至此输入的大流才建成!
		//接下来就是输出了
		FileOutputStream fos=new FileOutputStream(new File(dir,"mergerfile.mp3"));
		byte[] buf=new byte[1024];
		int len=0;
		while((len=sis.read(buf))!=-1) {
			fos.write(buf, 0, len);
		}
		fos.close();
		sis.close();
	}

}


第三部分:第二部分中过滤器SuffixFilter类的代码

package mergefiles;

import java.io.File;
import java.io.FilenameFilter;

public class SuffixFilter implements FilenameFilter {
	private String suffixName;
	
	public SuffixFilter(String suffixName) {
		super();
		this.suffixName = suffixName;
	}

	@Override
	public boolean accept(File dir, String name) {

		return name.endsWith(suffixName);
	}

}





上一篇: uva 11300

下一篇: 113. MySQL 日志管理