【Java】フォルダ圧縮処理

フォルダ内のファイルを圧縮します。

/** 
 * フォルダ圧縮処理
 * @param 圧縮対象フォルダ「C:\work\dir」
 * @param 圧縮ファイル名「C:\work\send_20181104150000.zip」
 */
private void dirCompress(String dir, String zipFileName) throws Exception {

  // 圧縮ストリームオブジェクトを宣言する。
  ZipOutputStream zos = null;

  try {
    // 圧縮ストリームオブジェクトを生成する。
    zos = ZipOutputStream(
      new FileOutputStream(
        new File(zipFileName)), Charset.forName("MS932"));

    // フォルダ内のファイル一覧を取得する。
    List<Path> filePahtList = Files.list(Paths.get(dir).collect(Collectors.toList());

    // ファイル一覧分繰り返す。
    for (Path filePath : filePathList) {
      archive(zos, filePath, Paths.get(dir).getFileName().toString() + "\\" + filePath.getFileName().toString());
    }

    zos.closeEntry();
    zos.finish();

  } catch (Exception e) {
    LOGGER.error("エラー発生");
    throw new Exception("エラー発生", e);

  } finally {
    if (zos != null) {
      try {
        zos.close();
      } catch (Exception e) {
        LOGGER.error("エラー発生");
        throw new Exception("エラー発生", e);
      }
    }
  }
}

 * 圧縮処理
 * @param zos 圧縮ストリーム
 * @param filePath 圧縮対象ファイルパス
 * @param fileName 圧縮対象ファイル名
 */
private void archive(ZipOutputStream zos, Path filePath, String fileName) throws Exception {

  // 圧縮対象ファイルの読込ストリームを宣言する。
  BufferedInputStream bis = null;

  try {
    // zipエントリを作成する。
    zos.putNextEntry(new ZipEntry(fileName));

    // ファイルの場合
    if (! Files.isDirectory(filePath)) {
      // 圧縮対象ファイルを読み込む。
      bis = new BufferedInputStream(new FileInputStream(filePath.toString()));

      // 圧縮対象ファイルをzipファイルに出力する。
      int readSize = 0;
      byte[] buffer = new byte[1024];
      while ((readSize = bis.read(buffer, 0, buffer.length)) != -1) {
        zos.write(buffer, 0, readSize);
      }
    }
  } finally {
    if (bis != null) {
      bis.close();
    }
    zos.closeEntry();
  }
}

【Java】画像のマスク処理

画像に対して個人情報等をマスクする際に利用します。

private void imageMaskBlack(String imageFile) thorws Exception {

  // 変数を宣言する。
  BufferedImage bimg = null;
  Graphics graphics = null;
  ImageReader jpgReader = null;
  ImageWriter jpgWriter = null;

  try {
    // イメージファイルを読み込む。(ImageIO.readは利用しない方針)
    jpgReader ImageIO.getImageReadersByFormatName("jpeg").next();
    jpgReader.setInput(ImageIO.createImageInputStream(new File(imageFile)));
    bimg = jpgReader.read(0);

    // Graphicsオブジェクトを取得する。
    graphics = bimg.getGraphics();
    graphics.setColor(Color.BLACK);
    // X座標、Y座標、幅、高さを指定し黒色でマスクする。
    // 画像の左上がX座標:0、Y座標:0
    graphics.fillRect(100, 50, 100, 100);
    graphics.drawImage(bimg, 0, 0, null);

    // 品質と解像度指定
    // イメージを書き込むため、ImageIOからjpg用のImageWriterを取得する。
    jpgWriter = ImageIO.getImageWritersByFormatName("jpeg").next();

    // ImageWriterのパラメータ設定
    // パラメータを取得する。
    JPEGImageWriteParam jpgWriteParam = (JPEGImageWriteParam)jpgWriter.getDefaultWriteParam();
    // パラメータに品質指定を行うモードを指定する。
    jpgWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    // パラメータに品質を指定する。(0.0f~1.0f)
    jpgWriteParam.setCompressionQuality(0.5f);

    // ImageWriterのメタデータの設定
    // メタデータを取得する。
    IIOMetadata imageMeta = jpgWriter.getDefaultImageMetadata(new ImageTypeSpecifier(bimg), jpgWriteParam);
    // メタデータからXMLのツリー構造を取得する。
    Element tree = (Element)imageMeta.getAsTree("javax_imageio_jpeg_image_1.0");
    // ツリー構造から要素「JFIF」を取得する。
    Element jfif = (Element)tree.getElementsByTagName("app0JFIF").item(0);
    //DPI指定を行うモードを指定する。
    jfif.setAttribute("resUnits", "1");
    // X座標は300dpiを指定する。
    jfif.setAttribute("Xdensity", 300);
    // Y座標は300dpiを指定する。
    jfif.setAttribute("Ydensity", 300);
    // メタデータにツリー構造を設定し直す。
    imageMeta.setFromTree("javax_imageio_jpeg_image_1,0", tree);

    // これまでに行った設定を元にイメージファイルを出力する。(ImageIO.writeは利用しない方針)
    jpgWriter.setOutput(ImageIO.createImageOutputStream(new File(imageFile)));
    jpgWriter.write(null, new IIOImage(bimg, null, imageMeta), jpgWriteParam);

  } finally {
    if (grahics != null) {
      graphics.dispose();
      graphics = null;
    }
    if (jpgWriter != null) {
      jpgWriter.reset();
      jpgWriter = null;
    }
    if (jpgReader != null) {
      jpgReader.reset();
      jpgReader = null;
    }
    if (bimg != null) {
      bimg.flush();
      bimg = null;
    }
  }
}