`
yangwn
  • 浏览: 75543 次
  • 性别: Icon_minigender_2
  • 来自: 大连
社区版块
存档分类
最新评论
  • icewubin: kimmking 写道icewubin 写道Dollyn 写道 ...
    Java
  • kimmking: icewubin 写道Dollyn 写道我十分怀疑最后一条,很 ...
    Java
  • beneo: 完全忽略了一個好的JVM的優化能力 難道java是C編譯器么 ...
    Java
  • icewubin: Dollyn 写道我十分怀疑最后一条,很多编译器都会自动做类似 ...
    Java
  • Dollyn: 我十分怀疑最后一条,很多编译器都会自动做类似优化吧(不知道JD ...
    Java

NIO2

    博客分类:
  • JAVA
阅读更多

对文件进行分割与组合:

-c 组合

-s 分割

例如:

-s 1000(字节数)   ./src/test.txt

-c 16(下标文件数) ./src/text.txt

package com.tata.java.io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;

public class SequenceStreamDemo {
	public static void main(String[] args) {
		try {
			// args[0]: 指定分割(s)或连接(c)
			switch (args[0].charAt(1)) {
			case 's':
				// args[1]: 每个分割文件的大小
				int size = Integer.parseInt(args[1]);
				// args[2]: 指定要被分割的文件名称
				seperate(args[2], size);
				break;
			case 'c':
				// args[1]: 指定要被组合的文件个数
				int number = Integer.parseInt(args[1]);
				// args[2]: 组合后的文件名称
				concatenate(args[2], number);
				break;
			}
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("Using: java UseSequenceStream [-s/-c]"
					+ " (size/number) filename");
			System.out.println("-s: 分割文件\n-c: 组合文件");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	// 分割文件
	public static void seperate(String filename, int size) throws IOException {
		FileInputStream fileInputStream = new FileInputStream(
				new File(filename));
		BufferedInputStream bufInputStream = new BufferedInputStream(
				fileInputStream);
		byte[] data = new byte[1];
		int count = 0;
		// 还原文件大小及指定分割的大小
		// 决定要分割为几个文件
		if (fileInputStream.available() % size == 0)
			count = fileInputStream.available() / size;
		else
			count = fileInputStream.available() / size + 1;
		// 开始进行分割
		for (int i = 0; i < count; i++) {
			int num = 0;
			// 分割的文件加上下划线与编号
			File file = new File(filename + "_" + (i + 1));
			BufferedOutputStream bufOutputStream = new BufferedOutputStream(
					new FileOutputStream(file));
			while (bufInputStream.read(data) != -1) {
				bufOutputStream.write(data);
				num++;
				if (num == size) {
					// 分割出一个文件
					bufOutputStream.flush();
					bufOutputStream.close();
					break;
				}
			}
			if (num < size) {
				bufOutputStream.flush();
				bufOutputStream.close();
			}
		}
		System.out.println("分割为" + count + "个文件");
	}

	// 连接文件
	public static void concatenate(String filename, int number)
			throws IOException {
		// 收集文件用的List
		List<InputStream> list = new ArrayList<InputStream>();
		for (int i = 0; i < number; i++) {
			// 文件名必须为下划线加上编号
			File file = new File(filename + "_" + (i + 1));
			list.add(i, new FileInputStream(file));
		}
		final Iterator<InputStream> iterator = list.iterator();
		// SequenceInputStream 需要一个Enumeration对象来构建
		Enumeration<InputStream> enumation = new Enumeration<InputStream>() {
			public boolean hasMoreElements() {
				return iterator.hasNext();
			}

			public InputStream nextElement() {
				return iterator.next();
			}
		};

		// 建立SequenceInputStream// 并使用BufferedInputStream
		BufferedInputStream bufInputStream = new BufferedInputStream(
				new SequenceInputStream(enumation), 8192);
		BufferedOutputStream bufOutputStream = new BufferedOutputStream(
				new FileOutputStream(filename), 8192);
		byte[] data = new byte[1];
		// 读取所有文件数据并写入目的地文件
		while (bufInputStream.read(data) != -1)
			bufOutputStream.write(data);
		bufInputStream.close();
		bufOutputStream.flush();
		bufOutputStream.close();
		System.out.println("组合" + number + "个文件 OK!!");
	}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics