From 1ffe9168c9a753c1a9201998af83d9b12bda67c9 Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Fri, 2 May 2014 19:42:32 +0200 Subject: CompressableDataWriter: Implement conversion from uncompressed --- src/io/CompressableDataWriter.java | 65 +++++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/src/io/CompressableDataWriter.java b/src/io/CompressableDataWriter.java index 68bb789..7523b78 100644 --- a/src/io/CompressableDataWriter.java +++ b/src/io/CompressableDataWriter.java @@ -1,11 +1,15 @@ package io; import java.io.BufferedInputStream; +import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; +import java.util.logging.Level; +import java.util.logging.Logger; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import org.apache.commons.io.IOUtils; @@ -46,7 +50,10 @@ public class CompressableDataWriter extends DataWriter { bis = new BufferedInputStream(new FileInputStream(getFileName())); // file found containing magic? OK, gzip writable! compressable = isCompressed(bis); - // TODO: convert uncompressed + if (CompressableDataWriter.this.convertUncompressed + && !compressable) { + tryConvertToGzip(); + } } catch (FileNotFoundException ex) { // file not found? Then we are free to write. compressable = true; @@ -75,6 +82,62 @@ public class CompressableDataWriter extends DataWriter { return false; } + private void tryConvertToGzip() { + // How to convert: + // 1. Rename old file + // 2. Create new compressed file in same dir + // 3. rename new file to old + // 4. if (3) fails, delete old file and rename again + File newTmpFile = null; + FileInputStream fis = null; + OutputStream os = null; + boolean deleteTmp = true; + try { + File origFile = new File(getFileName()); + fis = new FileInputStream(origFile); + newTmpFile = File.createTempFile(getFileName(), "origFile", + origFile.getParentFile()); + os = new GZIPOutputStream(new FileOutputStream(newTmpFile)); + + // now compress data, hopefully we have enough time and disk + IOUtils.copy(fis, os); + os.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; + } + } catch (IOException ex) { + // failed to convert (disk space too low? Not compressed?) + getLogger().log(Level.INFO, "Cannot compress/decompress", ex); + } finally { + IOUtils.closeQuietly(fis); + IOUtils.closeQuietly(os); + if (newTmpFile != null && deleteTmp) { + newTmpFile.delete(); + } + } + } + + private Logger getLogger() { + return Logger.getLogger(this.getClass().getName()); + } + @Override public InputStream getInputStream() throws IOException { FileInputStream fis = new FileInputStream(getFileName()); -- cgit v1.2.1