diff --git a/src/main/java/org/scijava/io/handle/FileHandle.java b/src/main/java/org/scijava/io/handle/FileHandle.java index 3bcbfe6dd..39b6e0448 100644 --- a/src/main/java/org/scijava/io/handle/FileHandle.java +++ b/src/main/java/org/scijava/io/handle/FileHandle.java @@ -29,8 +29,11 @@ package org.scijava.io.handle; +import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Date; import org.scijava.io.location.FileLocation; @@ -50,7 +53,7 @@ public class FileHandle extends AbstractDataHandle { private RandomAccessFile raf; /** The mode of the {@link RandomAccessFile}. */ - private String mode = "rw"; + private String mode; /** True iff the {@link #close()} has already been called. */ private boolean closed; @@ -232,6 +235,28 @@ public synchronized void close() throws IOException { closed = true; } + // -- WrapperPlugin methods -- + + @Override + public void set(FileLocation loc) { + super.set(loc); + + // Infer the initial mode based on file existence + permissions. + final File file = loc.getFile(); + String mode; + if (file.exists()) { + final Path path = loc.getFile().toPath(); + mode = ""; + if (Files.isReadable(path)) mode += "r"; + if (Files.isWritable(path)) mode += "w"; + } + else { + // Non-existent file; assume the intent is to create it. + mode = "rw"; + } + setMode(mode); + } + // -- Typed methods -- @Override