From 114a3c96e235f66a3eee20a31b97f6bdc49f59e3 Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Fri, 2 May 2014 23:12:24 +0200 Subject: Fix compression move which actually lost some data rename tricks somehow failed, but apparently there is a reliable Files.move() operation. Add some more debugging messages. --- src/io/CompressableDataWriter.java | 49 ++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 28 deletions(-) (limited to 'src/io/CompressableDataWriter.java') diff --git a/src/io/CompressableDataWriter.java b/src/io/CompressableDataWriter.java index 26a6c26..7460c96 100644 --- a/src/io/CompressableDataWriter.java +++ b/src/io/CompressableDataWriter.java @@ -8,6 +8,8 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; import java.util.logging.Level; import java.util.logging.Logger; import java.util.zip.GZIPInputStream; @@ -54,9 +56,13 @@ public class CompressableDataWriter extends DataWriter { bis = new BufferedInputStream(new FileInputStream(getFileName())); // file found containing magic? OK, gzip writable! compressable = isCompressed(bis); - if (CompressableDataWriter.this.convertUncompressed - && !compressable) { - tryConvertToGzip(); + if (!compressable) { + if (CompressableDataWriter.this.convertUncompressed) { + tryConvertToGzip(); + } else { + getLogger().info(getFileName() + ": not compressed and " + + "won't be compressed either."); + } } } catch (FileNotFoundException ex) { // file not found? Then we are free to write. @@ -94,45 +100,32 @@ public class CompressableDataWriter extends DataWriter { // 4. if (3) fails, delete old file and rename again File newTmpFile = null; FileInputStream fis = null; - OutputStream os = null; - boolean deleteTmp = true; + OutputStream gzOs = null; try { File origFile = new File(getFileName()); fis = new FileInputStream(origFile); newTmpFile = File.createTempFile(getFileName(), "origFile", origFile.getParentFile()); - os = new GZIPOutputStream(new FileOutputStream(newTmpFile)); + gzOs = new GZIPOutputStream(new FileOutputStream(newTmpFile)); // now compress data, hopefully we have enough time and disk - IOUtils.copy(fis, os); - os.close(); + IOUtils.copy(fis, gzOs); + gzOs.close(); fis.close(); // compression ready! Don't delete the result! - deleteTmp = false; - // first try overwriting the file if possible on this platform. - if (!newTmpFile.renameTo(origFile)) { - // that didn't work (Windows?), try deleting and rename - if (!origFile.delete()) { - deleteTmp = true; - getLogger().warning("Cannot rename compressed nor " - + "delete uncompressed " + getFileName()); - } else if (!newTmpFile.renameTo(origFile)) { - getLogger().warning("Uncompressed file is deleted, but " - + " compressed file cannot be renamed, sorry."); - } else { - compressable = true; - } - } else { - compressable = true; - } + Files.move(newTmpFile.toPath(), origFile.toPath(), + StandardCopyOption.REPLACE_EXISTING); + newTmpFile = null; + compressable = true; } catch (IOException ex) { // failed to convert (disk space too low? Not compressed?) - getLogger().log(Level.INFO, "Cannot compress/decompress", ex); + getLogger().log(Level.INFO, getFileName() + ": Unable to " + + "convert an uncompressed file", ex); } finally { IOUtils.closeQuietly(fis); - IOUtils.closeQuietly(os); - if (newTmpFile != null && deleteTmp) { + IOUtils.closeQuietly(gzOs); + if (newTmpFile != null) { newTmpFile.delete(); } } -- cgit v1.2.1