summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Wu <peter@lekensteyn.nl>2014-05-02 19:42:32 +0200
committerPeter Wu <peter@lekensteyn.nl>2014-05-02 19:42:32 +0200
commit1ffe9168c9a753c1a9201998af83d9b12bda67c9 (patch)
treeee06a5a7b329aba15efcc4606ad2a45a317484c8
parent4244f2d82536bad4ac2b4d5306daf84378828b60 (diff)
downloadTwitterDataAnalytics-1ffe9168c9a753c1a9201998af83d9b12bda67c9.tar.gz
CompressableDataWriter: Implement conversion from uncompressed
-rw-r--r--src/io/CompressableDataWriter.java65
1 files changed, 64 insertions, 1 deletions
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());