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

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

ただいまの
回答率

88.58%

File.createTempFile メソッドで作成した一時ファイルの削除について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 3,178

syachiku

score 104

 プログラムの概要

File.createTempFile メソッドで作成した複数の一時ファイルをzip形式で出力した後、一時ファイルを削除するというプログラムです。

 起きている問題

zipに含めるファイル数が1つの場合だと削除まで問題なく完了しますが、
zipに含めるファイル数が複数になると、最後の一時ファイル以外、削除ができません。

 試したこと、確認したこと

実行させたいJavaのバージョンは1.6ですが、一度Javaの実行環境を1.7に変え、Files.delete メソッドで例外を取得したところ、他プロセスが使用中というエラーでした。
また、zip出力が無ければ複数ファイルの削除ができました。

 実行環境

Javaのバージョンは1.6
Eclipseのバージョンは4.4です。

解決策があればご教授お願いします。

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import org.apache.commons.io.IOUtils;

public class FileMain {
    private static final String DIR = "./tmp/";
    public static void main(String[] args) {
        File file = new File(DIR);
        File file2 = new File(DIR);
        File file3 = new File(DIR);
        try {
            file = File.createTempFile("prefix", ".suffix", file);

            // ファイルに書き込み
            FileWriter fw = new FileWriter(file, true);
            BufferedWriter bw = new BufferedWriter(fw);
            PrintWriter pw = new PrintWriter(bw);
            pw.write("こんにゃく");
            pw.flush();
            pw.close();

            file2 = File.createTempFile("prefix", ".suffix", file2);

            // ファイルに書き込み
            FileWriter fw2 = new FileWriter(file2, true);
            BufferedWriter bw2 = new BufferedWriter(fw2);
            PrintWriter pw2 = new PrintWriter(bw2);
            pw2.write("たまねぎ");
            pw2.flush();
            pw2.close();

            file3 = File.createTempFile("prefix", ".suffix", file3);

            // ファイルに書き込み
            FileWriter fw3 = new FileWriter(file3, true);
            BufferedWriter bw3 = new BufferedWriter(fw3);
            PrintWriter pw3 = new PrintWriter(bw3);
            pw3.write("にんじん");
            pw3.flush();
            pw3.close();


            File[] files = {file, file2, file3};
            ZipOutputStream zos = null;
            try {
                zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(new File(DIR + "hoge.zip"))));
                createZip(zos, files);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                IOUtils.closeQuietly(zos);
            }


        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // ファイルを削除
            if (file != null && file.exists()) {
                file.delete();
            }
            if (file2 != null && file2.exists()) {
                file2.delete();
            }
            if (file3 != null && file3.exists()) {
                file3.delete();
            }
        }
    }

    private static void createZip(ZipOutputStream zos, File[] files) throws IOException {
        byte[] buf = new byte[1024];
        InputStream is = null;
        try {
            for (File file : files) {
                ZipEntry entry = new ZipEntry(file.getName());
                zos.putNextEntry(entry);
                is = new BufferedInputStream(new FileInputStream(file));
                int len = 0;
                while ((len = is.read(buf)) != -1) {
                    zos.write(buf, 0, len);
                }
            }
        } finally {
            IOUtils.closeQuietly(is);
        }
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

createZipメソッドの中で それぞれのファイル読み込みした最後でclose()しておらず、ループの最後のInputStreamしか閉じていないのが理由です。

for (File file : files) {
  ...

  is = new BufferedInputStream(new FileInputStream(file));

  ....

  while ((len = is.read(buf)) != -1) {
    zos.write(buf, 0, len);
  }
  is.close();
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/14 16:42

    回答の通りで解決できました。ありがとうございます。

    キャンセル

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

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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