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

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

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

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

Q&A

解決済

1回答

7609閲覧

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

syachiku

総合スコア117

Java

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

0グッド

0クリップ

投稿2018/11/14 04:29

プログラムの概要

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

起きている問題

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

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

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

実行環境

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

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

Java

1import java.io.BufferedInputStream; 2import java.io.BufferedOutputStream; 3import java.io.BufferedWriter; 4import java.io.File; 5import java.io.FileInputStream; 6import java.io.FileOutputStream; 7import java.io.FileWriter; 8import java.io.IOException; 9import java.io.InputStream; 10import java.io.PrintWriter; 11import java.util.zip.ZipEntry; 12import java.util.zip.ZipOutputStream; 13 14import org.apache.commons.io.IOUtils; 15 16public class FileMain { 17 private static final String DIR = "./tmp/"; 18 public static void main(String[] args) { 19 File file = new File(DIR); 20 File file2 = new File(DIR); 21 File file3 = new File(DIR); 22 try { 23 file = File.createTempFile("prefix", ".suffix", file); 24 25 // ファイルに書き込み 26 FileWriter fw = new FileWriter(file, true); 27 BufferedWriter bw = new BufferedWriter(fw); 28 PrintWriter pw = new PrintWriter(bw); 29 pw.write("こんにゃく"); 30 pw.flush(); 31 pw.close(); 32 33 file2 = File.createTempFile("prefix", ".suffix", file2); 34 35 // ファイルに書き込み 36 FileWriter fw2 = new FileWriter(file2, true); 37 BufferedWriter bw2 = new BufferedWriter(fw2); 38 PrintWriter pw2 = new PrintWriter(bw2); 39 pw2.write("たまねぎ"); 40 pw2.flush(); 41 pw2.close(); 42 43 file3 = File.createTempFile("prefix", ".suffix", file3); 44 45 // ファイルに書き込み 46 FileWriter fw3 = new FileWriter(file3, true); 47 BufferedWriter bw3 = new BufferedWriter(fw3); 48 PrintWriter pw3 = new PrintWriter(bw3); 49 pw3.write("にんじん"); 50 pw3.flush(); 51 pw3.close(); 52 53 54 File[] files = {file, file2, file3}; 55 ZipOutputStream zos = null; 56 try { 57 zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(new File(DIR + "hoge.zip")))); 58 createZip(zos, files); 59 } catch (IOException e) { 60 e.printStackTrace(); 61 } finally { 62 IOUtils.closeQuietly(zos); 63 } 64 65 66 } catch (IOException e) { 67 e.printStackTrace(); 68 } finally { 69 // ファイルを削除 70 if (file != null && file.exists()) { 71 file.delete(); 72 } 73 if (file2 != null && file2.exists()) { 74 file2.delete(); 75 } 76 if (file3 != null && file3.exists()) { 77 file3.delete(); 78 } 79 } 80 } 81 82 private static void createZip(ZipOutputStream zos, File[] files) throws IOException { 83 byte[] buf = new byte[1024]; 84 InputStream is = null; 85 try { 86 for (File file : files) { 87 ZipEntry entry = new ZipEntry(file.getName()); 88 zos.putNextEntry(entry); 89 is = new BufferedInputStream(new FileInputStream(file)); 90 int len = 0; 91 while ((len = is.read(buf)) != -1) { 92 zos.write(buf, 0, len); 93 } 94 } 95 } finally { 96 IOUtils.closeQuietly(is); 97 } 98 } 99}

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

java

1for (File file : files) { 2 ... 3 4 is = new BufferedInputStream(new FileInputStream(file)); 5 6 .... 7 8 while ((len = is.read(buf)) != -1) { 9 zos.write(buf, 0, len); 10 } 11 is.close(); 12}

投稿2018/11/14 07:05

A-pZ

総合スコア12011

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

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

syachiku

2018/11/14 07:42

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問