| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

「Java ファイルの分割結合」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
(ページの作成:「==Java ファイルの分割結合== [Java]{{category コード片}} java sdk 5.0 以上 簡易ファイル分割結合ツール。JavaSDKがインストールされ…」)
 
 
(同じ利用者による、間の2版が非表示)
1行目: 1行目:
==Java ファイルの分割結合==
+
==[[Java ファイルの分割結合]]==
[Java]{{category コード片}}
+
[[Java]] | [[Category:コード片]]
 
java sdk 5.0 以上
 
java sdk 5.0 以上
  
簡易ファイル分割結合ツール。JavaSDKがインストールされたPCでコンパイルして使ってください。
+
簡易ファイル分割結合ツール。[[Java]]SDKがインストールされたPCでコンパイルして使ってください。
  
 
  import java.io.BufferedInputStream;
 
  import java.io.BufferedInputStream;
73行目: 73行目:
 
     boolean isFirstCreateFlg = true;
 
     boolean isFirstCreateFlg = true;
 
      
 
      
     while((ret = is.read(buf)) > 0) {
+
     while((ret = is.read(buf)) > 0) {
       if ((sizeCnt >= sizeLimit) || isFirstCreateFlg) {
+
       if ((sizeCnt >= sizeLimit) || isFirstCreateFlg) {
 
         closeBufferdOutputStream(os);
 
         closeBufferdOutputStream(os);
 
         os = getBufferedOutputStream(
 
         os = getBufferedOutputStream(
104行目: 104行目:
 
     String[] fs = od.list(new FilenameFilter(){
 
     String[] fs = od.list(new FilenameFilter(){
 
                   public boolean accept(File dir, String name) {
 
                   public boolean accept(File dir, String name) {
                     return name.matches("^.*" + FILE_NAME_REP);
+
                     return name.matches("^.*" + FILE_NAME_[[R]]EP);
 
                 }
 
                 }
 
                 });
 
                 });
114行目: 114行目:
 
     int ret = -1;
 
     int ret = -1;
 
      
 
      
     for (int i=0; i<fs.length ;i++) {
+
     for (int i=0; i&lt;fs.length ;i++) {
 
       if (os == null) {
 
       if (os == null) {
 
         String originalFileName = absolutePath(od, fs[i].replaceFirst(FILE_NAME_REP, ""));  
 
         String originalFileName = absolutePath(od, fs[i].replaceFirst(FILE_NAME_REP, ""));  
121行目: 121行目:
 
       is = getBufferedInputStream(absolutePath(od, fs[i]));
 
       is = getBufferedInputStream(absolutePath(od, fs[i]));
 
        
 
        
       while((ret = is.read(buf)) > 0) {
+
       while((ret = is.read(buf)) &gt; 0) {
 
         os.write(buf, 0, ret);
 
         os.write(buf, 0, ret);
 
         os.flush();
 
         os.flush();

2020年2月16日 (日) 04:27時点における最新版

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());
  }
}