質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • Java

    16124questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Javaで指定したディレクトリ下にあるファイルを圧縮する

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 73

dish

score 7

Javaで指定したディレクトリ下にあるファイルをファイルの更新日時を条件に新しいディレクトリにコピーし、圧縮するプログラムを作っています。
圧縮するところまでは出来たのですが、実行してみるとzipファイルのみ作成されて中身が空のままファイルがコピー出来ていません。
ちなみにzip化は以下のサイトを参考に実装しました。
Java ZIP圧縮する方法 ディレクトリ指定やファイル指定 - ZipEntry・ZipOutputStream

mainのコード

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;

public class a {
    public static void main(String[] args) {
//////////保存先のディレクトリの作成
        //    Windows Vista 以降での仕様(UAC)でシステムルートドライブ(C:\)には書き込めない(管理者権限の昇格が必要)のでとりあえずD:に作成
        //"D:\\test"にするとファイル名が\\testになる
        //Fileクラスのオブジェクトを生成
        File newdir = new File("D:\\test\\sub");

        if (newdir.mkdir()){
          System.out.println("ディレクトリの作成に成功しました");
        }else{
          System.out.println("ディレクトリの作成に失敗しました");
        }            


/////////ファイルのコピー        
        //Fileクラスのオブジェクトを作成
        File dir = new File("D:\\logs\\lsm-application\\20190508");
        //listFiles:指定したディレクトリに含まれるファイルやディレクトリを配列で返す
        File[] list = dir.listFiles();

        //nullチェック
        //listfilesは指定したパス名がディレクトリを示さない場合や入出力エラーが発生した場合にnullを返す
        //null状態のままオブジェクト配列を参照するとjava.lang.NullPointerExceptionの例外が発生
        if(list != null) {
            //読み込んだファイルやディレクトリの数を表示
            System.out.println(list.length);
        } else {
            System.out.println("null");
        }

        //最終更新日時表示書式
        //SimpleDateFormat(String)で指定されたパターン、デフォルトのロケール、日付フォーマット記号を持つ、オブジェクトを生成
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

        // ファイルの最終更新日時(タイムスタンプ)を取得
        // 1970年1月1日0時0分0秒からの経過ミリ秒
        //long lastModified = list.lastModified();

        //最終更新日時書式整形
        //String lastModifiedStr = sdf.format(lastModified);    

        //表示
        //System.out.println(lastModifiedStr);

        for (int i=0; i<list.length; i++) {

            // ファイルの最終更新日時(タイムスタンプ)を取得
            // 1970年1月1日0時0分0秒からの経過ミリ秒
            long lastModified = list[i].lastModified();

            //最終更新日時書式整形
            //String lastModifiedStr = sdf.format(lastModified);

            System.out.println(list[i]);
            //System.out.println(lastModifiedStr);

            //ファイルのコピー
            Path sourcePath = Paths.get(list[i].getPath());
            Path destinationPath = Paths.get("D:\\test\\sub\\" + list[i].getName() + ".txt");

            //あsファイルの更新日時をlong型からCalendar型に変換
            Calendar source = Calendar.getInstance();
                //setTimeInMillis:Calendar の現在時刻を、指定された long 値から設定
            source.setTimeInMillis(lastModified);

            //CalendarクラスやDateクラスは月を0~11で表すため一カ月ずれる!!
            //日時の設定
            Calendar start = Calendar.getInstance();
            start.set(2019, 4, 8, 06, 00, 00);

            //日時の設定
            Calendar end = Calendar.getInstance();
            end.set(2019, 4, 8, 12, 00, 00);

            //cal1.compareTo(cal2)
            //同じなら0、cal1過去・cal2(引数)が未来なら負数1、cal1が未来なら正数を返す
            int diff1 = source.compareTo(start);
            int diff2 = source.compareTo(end);

            if(diff1 > 0 && diff2 < 0) {
            //ファイルのコピー
                try {
                    Files.copy(sourcePath,destinationPath);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }


        }

        ZipCompressUtils.compressDirectory("D:\\test\\subzip.zip", "D:\\test\\sub\\");


    }
}


mainクラス単体では最後の
ZipCompressUtils.compressDirectory("D:\\test\\subzip.zip", "D:\\test\\sub\\");
の行を追加する前はうまく実行できました。

ZipCompressUtilsクラスのコード

package com.en.saka.util;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
//import org.apache.tools.zip.ZipEntry;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
//import org.apache.tools.zip.ZipOutputStream;

/**
 * ZipCompressUtils は、ZIP 圧縮をおこなう上で利便性の高い機能を提供します。
 *
 * @author saka-en.
 * @version $Revision: 1.0 $ $Date: 2013.10.24 $ $Description: 新規作成 $
 */
public class ZipCompressUtils {

    /**
     * 指定されたディレクトリ内のファイルを ZIP アーカイブし、指定されたパスに作成します。
     * デフォルト文字コードは Shift_JIS ですので、日本語ファイル名も対応できます。
     *
     * @param fullPath 圧縮後の出力ファイル名をフルパスで指定 ( 例: C:/sample.zip )
     * @param directory 圧縮するディレクトリ ( 例; C:/sample )
     * @return 処理結果 true:圧縮成功 false:圧縮失敗
     */
    public static boolean compressDirectory( String filePath, String directory ) {
        File baseFile = new File(filePath);
        File file = new File(directory);
        ZipOutputStream outZip = null;
        try {
            // ZIPファイル出力オブジェクト作成
            outZip = new ZipOutputStream(new FileOutputStream(baseFile));
            archive(outZip, baseFile, file);
        } catch ( Exception e ) {
            // ZIP圧縮失敗
            return false;
        } finally {
            // ZIPエントリクローズ
            if ( outZip != null ) {
                try { outZip.closeEntry(); } catch (Exception e) {}
                try { outZip.flush(); } catch (Exception e) {}
                try { outZip.close(); } catch (Exception e) {}
            }
        }
        return true;
    }

    /**
     * 指定された ArrayList のファイルを ZIP アーカイブし、指定されたパスに作成します。
     * デフォルト文字コードは Shift_JIS ですので、日本語ファイル名も対応できます。
     *
     * @param filePath 圧縮後のファイル名をフルパスで指定 ( 例: C:/sample.zip )
     * @param fileList 圧縮するファイルリスト  ( 例; {C:/sample1.txt, C:/sample2.txt} )
     * @return 処理結果 true:圧縮成功 false:圧縮失敗
     */
    public static boolean compressFileList( String filePath, ArrayList<String> fileList ) {

        ZipOutputStream outZip = null;
        File baseFile = new File(filePath);
        try {
            // ZIPファイル出力オブジェクト作成
            outZip = new ZipOutputStream(new FileOutputStream(baseFile));
            // 圧縮ファイルリストのファイルを連続圧縮
            for ( int i = 0 ; i < fileList.size() ; i++ ) {
                // ファイルオブジェクト作成
                File file = new File((String)fileList.get(i));
                archive(outZip, baseFile, file, file.getName(), "Shift_JIS");
            }
        } catch ( Exception e ) {
            // ZIP圧縮失敗
            return false;
        } finally {
            // ZIPエントリクローズ
            if ( outZip != null ) {
                try { outZip.closeEntry(); } catch (Exception e) {}
                try { outZip.flush(); } catch (Exception e) {}
                try { outZip.close(); } catch (Exception e) {}
            }
        }
        return true;
    }

    /**
     * ディレクトリ圧縮のための再帰処理
     *
     * @param outZip ZipOutputStream
     * @param baseFile File 保存先ファイル
     * @param file File 圧縮したいファイル
     */
    private static void archive(ZipOutputStream outZip, File baseFile, File targetFile) {
        if ( targetFile.isDirectory() ) {
            File[] files = targetFile.listFiles();
            for (File f : files) {
                if ( f.isDirectory() ) {
                    archive(outZip, baseFile, f);
                } else {
                    if ( !f.getAbsoluteFile().equals(baseFile)  ) {
                        // 圧縮処理
                        archive(outZip, baseFile, f, f.getAbsolutePath().replace(baseFile.getParent(), "").substring(1), "Shift_JIS");
                    }
                }
            }
        }
    }

    /**
     * 圧縮処理
     *
     * @param outZip ZipOutputStream
     * @param baseFile File 保存先ファイル
     * @param targetFile File 圧縮したいファイル
     * @parma entryName 保存ファイル名
     * @param enc 文字コード
     */
    private static boolean archive(ZipOutputStream outZip, File baseFile, File targetFile, String entryName, String enc) {
        // 圧縮レベル設定
        outZip.setLevel(5);

        // 文字コードを指定
        outZip.setEncoding(enc);
        try {

            // ZIPエントリ作成
            outZip.putNextEntry(new ZipEntry(entryName));

            // 圧縮ファイル読み込みストリーム取得
            BufferedInputStream in = new BufferedInputStream(new FileInputStream(targetFile));

            // 圧縮ファイルをZIPファイルに出力
            int readSize = 0;
            byte buffer[] = new byte[1024]; // 読み込みバッファ
            while ((readSize = in.read(buffer, 0, buffer.length)) != -1) {
                outZip.write(buffer, 0, readSize);
            }
            // クローズ処理
            in.close();
            // ZIPエントリクローズ
            outZip.closeEntry();
        } catch ( Exception e ) {
            // ZIP圧縮失敗
            return false;
        }
        return true;
    }
}


ZipCompressUtilsクラスについて以下のようなエラーメッセージエラーメッセージが出ます。

1.1行目:package com.en.saka.util;の部分
エラーメッセージ「宣言されたパッケージが予想されたパッケージ""に一致しません」

2.19行目:public class ZipCompressUtils { の部分
エラーメッセージ「型ZipCompressUtilsは既に宣言されています」

3.123行目:outZip.setEncoding(enc);
エラーメッセージ「メソッドsetEncoding(String)は型ZipOutputStreamで未定義です」

2については他にZipCompressUtilsクラスを作成したか探してみましたが見当たりませんでした。
その他色々サイトを見てみたんですが、javaに慣れておらずサイトに記載されている内容がいまいちわかりませんでした。
質問してばかりで申し訳ないのですがどなたか原因と対処法についてご教示頂けると幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jimbe

    2019/06/10 23:03

    ZipCompressUtils.java は com/en/saka/util フォルダの中にあるでしょうか.

    キャンセル

  • dish

    2019/06/11 09:07

    確認したところ違う場所にありました。
    package宣言文が間違っているということでしょうか?

    キャンセル

  • jimbe

    2019/06/11 10:34

    間違っているかどうかは, クラスを何処に配置するかを決める dish さん次第です.
    オリジナル通りのパッケージで使用したいのでしたら, パッケージに合ったフォルダに配置する必要がありますし, パッケージは変更してもよいなら, フォルダに合ったパッケージに変更する必要があります.

    キャンセル

  • dish

    2019/06/11 13:53

    jimbeさん
    パッケージについて調べてみたところ自分の認識が足りていなかったようです。jimbeさんのおっしゃる通り、mainと同じパッケージに含むように配置してみました。ご指摘ありがとうございます。

    キャンセル

回答 1

check解決した方法

0

encoding文を削除したらコンパイル通りました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Java

    16124questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。