Java ファイルの分割結合
ナビゲーションに移動
検索に移動
Java ファイルの分割結合
Java | java sdk 5.0 以上
簡易ファイル分割結合ツール。JavaSDKがインストールされたPCでコンパイルして使ってください。
- import java.io.BufferedInputStream;
- import java.io.BufferedOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.FilenameFilter;
- import java.util.Arrays;
- public class Split {
- private final int BUF_SIZE_1KB = 1024; //1kb
- private final String SEQ_LEN = "3";
- private final String FILE_SEQ_SUFFIX = "%0"+ SEQ_LEN + "d";
- private final String FILE_NAME_REP = "_[0-9]{"+ SEQ_LEN + "}$";
- public static void main(String[] args) {
- Split me = new Split();
- int splitSize = 1000; // 1mb default
- try {
- String mode = args[0];
- if ("-help".equals(mode)) {
- Split.printUsage();
- return;
- } else if
- ("s".equals(mode) || "-s".equals(mode)) {
- try {
- splitSize = Integer.parseInt(args[3]);
- } catch (Exception e) {}
- me.split(args[1], args[2], splitSize);
- } else if
- ("c".equals(mode) || "-c".equals(mode)) {
- me.concat(args[1]);
- } else {
- Split.printUsage();
- }
- } catch (Exception e) {
- Split.printUsage();
- e.printStackTrace();
- }
- System.out.println("finish");
- }
- /**
- * ファイルを指定サイズ(KB)で分割
- * @param inFile 対象ファイル
- * @param outDir 出力ディレクトリ
- * @param sizeKb サイズ
- * @throws Exception
- */
- public void split(String inFile, String outDir, int sizeKb) throws Exception {
- File od = createDir(outDir);
- byte[] buf = new byte[BUF_SIZE_1KB];
- BufferedInputStream is = getBufferedInputStream(inFile);
- BufferedOutputStream os = null;
- int sizeLimit = sizeKb;
- int sizeCnt = 0;
- int idx = 1;
- int ret = -1;
- boolean isFirstCreateFlg = true;
- while((ret = is.read(buf)) > 0) {
- if ((sizeCnt >= sizeLimit) || isFirstCreateFlg) {
- closeBufferdOutputStream(os);
- os = getBufferedOutputStream(
- absolutePath(od,
- (new File(inFile)).getName() + "_" + String.format(FILE_SEQ_SUFFIX, idx++))
- );
- isFirstCreateFlg = false;
- sizeCnt = 0;
- }
- os.write(buf,0, ret);
- os.flush();
- sizeCnt++; // kb
- }
- closeBufferdOutputStream(os);
- closeBufferdInputStream(is);
- }
- /**
- * ファイルを結合
- * @param outDir 分割されたファイルがあるディレクトリ
- * @throws Exception
- */
- public void concat(String outDir) throws Exception {
- File od = new File(outDir);
- if (!od.exists() || !od.isDirectory()) {
- return;
- }
- String[] fs = od.list(new FilenameFilter(){
- public boolean accept(File dir, String name) {
- return name.matches("^.*" + FILE_NAME_REP);
- }
- });
- BufferedInputStream is = null;
- BufferedOutputStream os = null;
- Arrays.sort(fs);
- byte[] buf = new byte[BUF_SIZE_1KB];
- int ret = -1;
- for (int i=0; i<fs.length ;i++) {
- if (os == null) {
- String originalFileName = absolutePath(od, fs[i].replaceFirst(FILE_NAME_REP, ""));
- os = getBufferedOutputStream(originalFileName);
- }
- is = getBufferedInputStream(absolutePath(od, fs[i]));
- while((ret = is.read(buf)) > 0) {
- os.write(buf, 0, ret);
- os.flush();
- }
- os.flush();
- closeBufferdInputStream(is);
- }
- closeBufferdOutputStream(os);
- }
- private String absolutePath(File dir, String filename) {
- return dir.getAbsolutePath() + File.separator + filename;
- }
- private BufferedInputStream getBufferedInputStream(String inputFilename) throws FileNotFoundException {
- return new BufferedInputStream(new FileInputStream(new File(inputFilename)));
- }
- private void closeBufferdOutputStream(BufferedOutputStream os) throws Exception {
- if (os != null) {
- os.flush();
- os.close();
- }
- }
- private void closeBufferdInputStream(BufferedInputStream is) throws Exception {
- if (is != null) {
- is.close();
- }
- }
- private BufferedOutputStream getBufferedOutputStream(String fineName) throws Exception {
- File f = new File(fineName);
- f.createNewFile();
- return new BufferedOutputStream(new FileOutputStream(f));
- }
- private File createDir(String dirName) {
- File od = new File(dirName);
- if (!od.exists()) {
- od.mkdir();
- }
- return od;
- }
- private static void printUsage() {
- StringBuilder buf = new StringBuilder();
- buf.append("java split mode target_file output_dir [output_filesize(kb)]\n");
- buf.append("\tmode:-s split file, -c concatinate files\n");
- buf.append("\ttarget_file:target file to split.\n");
- buf.append("\toutput_dir:target directory for output splitted files.\n");
- buf.append("\toutput_filesize(kb):output file size as KB.\n");
- System.out.println(buf.toString());
- }
- }
© 2006 矢木浩人