Atomically replace objects in filesystem putBlob

Fixes gaul/s3proxy#490.  This fixes a regression from
41ce90ec360a46cb7b03f7cb8b66e01a113aa5b6.  Continue to support
Windows logic although it is unclear if this is necessary.
diff --git a/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java b/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
index 8b9ada1..1a58fb5 100644
--- a/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
+++ b/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
@@ -24,6 +24,7 @@
 import static java.nio.file.Files.createDirectories;
 import static java.nio.file.Files.getFileAttributeView;
 import static java.nio.file.Files.getPosixFilePermissions;
+import static java.nio.file.Files.move;
 import static java.nio.file.Files.probeContentType;
 import static java.nio.file.Files.readAttributes;
 import static java.nio.file.Files.setPosixFilePermissions;
@@ -44,6 +45,7 @@
 import java.nio.file.AccessDeniedException;
 import java.nio.file.DirectoryStream;
 import java.nio.file.NoSuchFileException;
+import java.nio.file.StandardCopyOption;
 import java.nio.file.Path;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.nio.file.attribute.PosixFilePermission;
@@ -583,7 +585,8 @@
             eTag = actualHashCode.asBytes();
          }
 
-         if (outputFile.exists()) {
+         // TODO: is this necessary?
+         if (isWindows() && outputFile.exists()) {
             delete(outputFile);
          }
 
@@ -599,9 +602,7 @@
 
          setBlobAccess(containerName, tmpBlobName, access);
 
-         if (!tmpFile.renameTo(outputFile)) {
-            throw new IOException("Could not rename file " + tmpFile + " to " + outputFile);
-         }
+         move(tmpPath, outputFile.toPath(), StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING);
          tmpFile = null;
 
          return base16().lowerCase().encode(eTag);