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

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

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

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

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

Q&A

解決済

2回答

6988閲覧

javaのファイル圧縮について

kaori1994

総合スコア28

Java

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

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

0グッド

0クリップ

投稿2016/10/19 04:52

編集2016/10/19 05:13

お世話になっております。
現在、javaを使ってサーバに置いてあるファイルを圧縮しようとしております。

【やりたいこと】
1.javaを使用
2.同期元のファイル名とドキュメントルートから見た相対パスでディレクトリを指定
3.2で指定されたファイルを圧縮して、同期先のディレクトリに作成

検索していると、[ZipOutputStream]というもの使うと良い、といくつかでてきました。
以下、検索の中でわかりやすかったので試しているサンプルプログラムです。

import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; class ZipOutputStreamSample { /** * @param args [0]圧縮先ファイル、[1,2...]圧縮元ファイル */ public static void main(String[] args) { byte[] buf = new byte[128]; try { // 圧縮先ファイルへのストリームを開く ZipOutputStream out = new ZipOutputStream(new FileOutputStream(args[0])); for (int i = 0; i < args.length - 1; i++) { System.out.println("Add to zip from " + args[i + 1] + "."); // 圧縮元ファイルへのストリームを開く BufferedInputStream in = new BufferedInputStream(new FileInputStream(args[i + 1])); // エントリを作成する ZipEntry entry = new ZipEntry(args[i + 1]); out.putNextEntry(entry); // データを圧縮して書き込む int size; while ((size = in.read(buf, 0, buf.length)) != -1) { out.write(buf, 0, size); } // エントリと入力ストリームを閉じる out.closeEntry(); in.close(); } // 出力ストリームを閉じる out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } } }

大変見やすいコードで早速試しているのですが、以下が困っております。
⓵【圧縮したいファイル名とその同期元ディレクトリ(ドキュメントルートから見た相対パス】と
⓶【圧縮したzipの同期先ディレクトリ(ドキュメントルートから見た相対パス】】
サンプルコードのargs[0]に⓵を、args[1]に⓶を指定して
実行したのですが、⓵のファイルが圧縮されて⓶に作成されていませんでした。

そもそもこのサンプルはそういった事をするためのものではないのでしょうか・・・
できるできないのご指摘か、他に似たようなサンプルを頂けたら幸いです。

以上、よろしくお願いいたします。

【追記】
申し訳ありません。改めてパスの指定をしたところ、圧縮されたzipが目的のディレクトリに作成いたしました!
しかし、解凍してみると、相対パス指定をしたためか、ディレクトリを含めた圧縮になっていました。

例:
⓵ /test/test2/ZipFile.txt
⓶ /test/test3/ZipFile.zip

⓶にできたZipFile.zipを解凍すると testディレクトリから始まったものでした。
これをZipFile.zipだけ圧縮するにはどうしたらよいのか、ご教示いただけたら幸いです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

圧縮する際にカレントディレクトリを/test/test2/とし、圧縮ファイルにZipFile.txtを指定し、
圧縮して出来たファイルZipFile.zip/test/test3/に移動すればいいのではないでしょうか。

投稿2016/10/19 05:33

編集2016/10/19 05:36
moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaori1994

2016/10/19 05:53

ご回答ありがとうございます。 linuxなら zip -j ~ とかでできるのですが、javaだとディレクトリ除外は不可能という事でmoonphase様のやりかたでやるしかないのでしょうか・・・
moonphase

2016/10/19 06:06

次のコマンドでZipFile.txtのみ圧縮できましたが、やりたいことは別のことですか? java ZipOutputStreamSample ZipFile.zip ZipFile.txt
kaori1994

2016/10/19 06:11

ご回答ありがとうございます。 申し訳ありません。 java ZipOutputStreamSample ZipFile.zip ZipFile.txt; について少しだけご教示いただけると幸いです。
moonphase

2016/10/19 06:18

サンプルのJavaソースは指定されたものをそのまま圧縮するというコードです。 相対的に色々やりたいなら、指定されたパラメータがディレクトリの場合、ディレクトリエントリを再帰的に読み取り、ファイルなら圧縮するというコードを記載しなければならないと思いますがいかがでしょうか。 また、Javaを使用したいというのは学習の為ですか? 学習のためでなければzipコマンドをそのまま使うほうがやりたいことを実現できると思います。 もしくはJavaのZIPライブラリを使うとか。 https://github.com/zeroturnaround/zt-zip
kaori1994

2016/10/19 06:34

ご回答ありがとうございます。 サンプルのコードの意味もあまり理解できてないまま進めておりました。 そういった分岐が必要なのですね。考えてやってみます! はい、ただいま学習のため、ストリームを使った圧縮方法で作成しようと試みております。 processBuilder.commandを使った圧縮(zipコマンド)での実現はなんとか時間をかけてできました。 javaのZIPライブラリなどもあるのですね。ご丁寧にリンクありがとうございます。 これが終わり次第確認したいと思います。
guest

0

ファイルのみ圧縮する場合は、ZipEntryの引数をファイル名のみにすれば可能でした!

// エントリを作成する ZipEntry entry = new ZipEntry(ファイル名); out.putNextEntry(entry);

失礼いたします。

投稿2016/10/19 07:28

kaori1994

総合スコア28

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問