Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Quickest way to use common OpenOption combinations

Tags:

java

nio

nio2

Is there a concise, idiomatic way (maybe using Apache Commons) to specify common combinations of OpenOption like StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING

like image 257
Aleksandr Dubinsky Avatar asked Dec 18 '13 16:12

Aleksandr Dubinsky


3 Answers

These are the easy possibilities you have.

Static Imports, to increase readability:

import static java.nio.file.StandardOpenOption.CREATE_NEW;
import static java.nio.file.StandardOpenOption.WRITE;

OpenOption[] options = new OpenOption[] { WRITE, CREATE_NEW };

Use defaults:

     //no Options anyway
     Files.newBufferedReader(path, cs)

     //default: CREATE, TRUNCATE_EXISTING, and WRITE not allowed: READ
     Files.newBufferedWriter(path, cs, options)

     //default: READ not allowed: WRITE
     Files.newInputStream(path, options)

     //default: CREATE, TRUNCATE_EXISTING, and WRITE not allowed: READ
     Files.newOutputStream(path, options)

     //default: READ do whatever you want
     Files.newByteChannel(path, options)

Finally it's possible to specify optionsets like this:

     Files.newByteChannel(path, EnumSet.of(CREATE_NEW, WRITE));
like image 120
Franz Ebner Avatar answered Nov 11 '22 16:11

Franz Ebner


The best suggestion I can offer would be to cheat on the equivalence of T... and T[], which one of the other stackoverflow discussions says should work

Can I pass an array as arguments to a method with variable arguments in Java?

So...

OpenOption myOptions[] = {StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING};
OutputStream foo=OutputStream.newOutputStream(myPath,myOptions);

Caveat: Untested.

like image 44
keshlam Avatar answered Nov 11 '22 16:11

keshlam


java.nio.file.Files has 5 flavours of methods with OpenOption varargs parameters:

Files
    .newBufferedWriter(...)
    .write(...)
    .newOutputStream(...)
    .newInputStream(...) 
    .newByteChannel(...)

They directly don't restrict any OpenOption combination, but all of them under the hood call to some of these 3 methods at java.nio.file.spi.FileSystemProvider:

FileSystemProvider
    .newInputStream(Path, OpenOption...)
    .newOutputStream(Path, OpenOption...)
    .newByteChannel(Path, Set<? extends OpenOption>, FileAttribute<?>...)

FileSystemProvider.newInputStream(...) is called by: Files.newInputStream(...)

FileSystemProvider.newOutputStream(...) is called by:

Files
    .newBufferedWriter(...)
    .newOutputStream(...)
    .write(...)

abstract FileSystemProvider.newByteChannel(...) is called by:

  • Files.newByteChannel(...)
  • FileSystemProvider.newInputStream(...)
  • FileSystemProvider.newOutputStream(...)

OptenOption combination restrictions:

  • FileSystemProvider.newInputStream(...)
    • UnsupportedOperationException: WRITE || APPEND
  • FileSystemProvider.newOutputStream(...)
    • Implicitly: WRITE
    • IllegalArgumentException: READ
    • default (if non options): CREATE && TRUNCATE_EXISTING

The abstract FileSystemProvider.newByteChannel(...) method has a platform dependent implementation, which may extend the OpenOption combination restrictions (as in sun.nio.fs.WindowsFileSystemProvider).

All Files method which uses OpenOption vargars under the hood ends in the abstract FileSystemProvider.newByteChannel(...), which implementation is platform dependent. So, the OpenOption combinations restriction in Files methods are platform dependent.

like image 41
zeugor Avatar answered Nov 11 '22 16:11

zeugor