プログラムの概要
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}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/14 07:42