java: io操作---文件按指定大小拆分合并2

需求: 某文件太大, 需要拆分保存, 问如何快速拆分? 拆分后如何完整合并?

使用的java类: RandomAccessFile   

=========================================================

拆分思路:

一个''输入流''--->分内容到: 多个''输出流''

合并思路:

多个''输入流''---->合并内容到: 一个''输出流''

=========================================================

// 按照指定位置, 大小, 拆分某文件
	private static void split(String srcFile, String destDir, int fileSize) throws Exception {
		// 创建文件对象
		File src = new File(srcFile);
		File destFolder = new File(destDir);
		if (!destFolder.exists()) {
			destFolder.mkdirs();
		}

		RandomAccessFile rand = new RandomAccessFile(src, "r");// 输入流
		// 计算拆分后文件的: 个数
		double size = fileSize * 1024 * 1024;// MB-->byte
		int count = (int) Math.ceil(src.length() / size);

		// 拆分文件
		String srcName = src.getName();
		byte[] buf = new byte[(int) size];
		int len = 0;
		for (int i = 1; i <= count; i++) {
			// 定义拆分后的文件
			File destFile = new File(destDir, srcName + ".part" + i);
			destFile.createNewFile();// 创建空的目标文件
			RandomAccessFile dest = new RandomAccessFile(destFile, "rw");// 输出流
			// 拷贝文件
			len = rand.read(buf);
			dest.write(buf, 0, len);
			dest.close();
		}

		// 关闭资源
		rand.close();
		System.out.println("split ok..\n");
	}
//合并文件
	private static void merge(String srcDir, String destDir) throws Exception {
		// 多个输入流==>一个输出流
		File src = new File(srcDir);
		File[] files = src.listFiles();
		Arrays.sort(files, new Comparator<File>() {

			public int compare(File f1, File f2) {
				int index=f1.getName().lastIndexOf(".part");
				int num=Integer.parseInt(f1.getName().substring(index+5));
				int index2=f2.getName().lastIndexOf(".part");
				int num2=Integer.parseInt(f2.getName().substring(index2+5));
				
				return num-num2;
			}
		});
		String formerName = "";
		for (File f : files) {
			if (f.isFile() && f.getName().lastIndexOf(".part") != -1) {
				formerName = f.getName().replaceAll(".part\\d", "");
				break;
			}
		}
		// 创建:一个输入流
		File formerFile = new File(destDir, formerName);
		System.out.println("原文件名==="+formerName);
	
		File parentFile = formerFile.getParentFile();
		if (!parentFile.exists()) {
			parentFile.mkdirs();// 创建父目录
		}
		if (!formerFile.exists()) {
			formerFile.createNewFile();
		}
		RandomAccessFile randTo = new RandomAccessFile(formerFile, "rw");// 输入流

		// 创建:多个输出流
		byte[] buf = new byte[1024];
		int len = 0;
		for (File f : files) {
			if (f.isFile() && f.getName().lastIndexOf(".part") != -1) {
				System.out.println("merge拆分的文件----"+f.getName());;
				RandomAccessFile source = new RandomAccessFile(f, "r");// 输入流
				while ((len = source.read(buf)) != -1) {
					randTo.write(buf, 0, len);
				}
				source.close();// 关闭资源
			}
		}
		randTo.close();// 关闭资源
		System.out.println("merge ok...");
	}

测试及结果

public static void main(String[] args) throws Exception {

		// 拆
		 split("/home/wang/a.tar.gz","aa",30);//15MB
		// 合
		merge("aa", "bb");
	}
      






猜你喜欢

转载自blog.csdn.net/eyeofeagle/article/details/81043914
今日推荐