summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Wu <peter@lekensteyn.nl>2014-05-02 23:12:24 +0200
committerPeter Wu <peter@lekensteyn.nl>2014-05-02 23:12:24 +0200
commit114a3c96e235f66a3eee20a31b97f6bdc49f59e3 (patch)
treea7299337b57cbde6e4ce93e60b5f64ac27b67d49
parentdfae08051eabb3fec6999bed877b7df92d13bb44 (diff)
downloadTwitterDataAnalytics-114a3c96e235f66a3eee20a31b97f6bdc49f59e3.tar.gz
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.
-rw-r--r--src/io/CompressableDataWriter.java49
1 files changed, 21 insertions, 28 deletions
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();
}
}