使用常见OpenOption组合的最快方法

时间:2013-12-18 16:50:46

标签: java nio nio2

是否有一种简洁,惯用的方式(可能使用Apache Commons)来指定OpenOption的常见组合,如StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING

3 个答案:

答案 0 :(得分:30)

这些都是您的轻松可能。

静态导入,以提高可读性:

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

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

使用默认值:

     //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)

最后,可以指定这样的选项集:

     Files.newByteChannel(path, EnumSet.of(CREATE_NEW, WRITE));

答案 1 :(得分:6)

我能提供的最佳建议是欺骗T ...和T []的等价性,其中一个其他stackoverflow讨论说应该有效

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

因此...

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

警告:未经测试。

答案 2 :(得分:1)

java.nio.file.Files有5种方法,带有OpenOption varargs参数:

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

他们直接不限制任何OpenOption组合,但所有这些组合都会在java.nio.file.spi.FileSystemProvider调用这三种方法中的一些:

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

FileSystemProvider.newInputStream(...)Files.newInputStream(...)

调用

FileSystemProvider.newOutputStream(...)被称为:

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

抽象FileSystemProvider.newByteChannel(...)由:

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

OptenOption组合限制:

  • FileSystemProvider.newInputStream(...)
    • UnsupportedOperationException:WRITE || APPEND
  • FileSystemProvider.newOutputStream(...)
    • 隐含地:写作
    • IllegalArgumentException:READ
    • 默认(如果非选项):CREATE&amp;&amp; TRUNCATE_EXISTING

抽象 FileSystemProvider.newByteChannel(...)方法具有平台相关的实现,可以扩展OpenOption组合限制(如sun.nio.fs.WindowsFileSystemProvider中所述)。

使用OpenOption vargars的所有Files方法在抽象FileSystemProvider.newByteChannel(...)中结束,该实现与平台相关。因此,Files方法中的OpenOption组合限制与平台有关。