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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Java

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

解決済

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

junkjunk
junkjunk

総合スコア0

Java

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

1回答

0評価

0クリップ

3171閲覧

投稿2019/06/10 07:12

編集2022/01/12 10:58

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

mainのコード

java

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(); } } c_zip.zip( "D:\\test\\subzip.zip", "sourcePath"); } ZipCompressUtils.compressDirectory("D:\\test\\subzip.zip", "D:\\test\\sub\\"); } }

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

ZipCompressUtilsクラスのコード

java

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ページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

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

jimbe
jimbe

2019/06/10 14:03

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

2019/06/11 00:07

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

2019/06/11 01:34

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

2019/06/11 04:53

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

Java

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