【问题标题】:Quickest way to use common OpenOption combinations使用常见 OpenOption 组合的最快方法
【发布时间】:2014-01-06 23:13:17
【问题描述】:

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

【问题讨论】:

  • 通用组合无论如何都被指定为默认值。
  • @franzebner 是吗?
  • 如后面所列,是的,它们是 :) Files.new* 中的 OpenOptions 是可选的,并且默认值是预定义的。

标签: java nio nio2


【解决方案1】:

我能提供的最佳建议是在 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);

警告:未经测试。

【讨论】:

  • 这肯定会奏效。我有点希望 Apache Commons 或 Guava 已经这样做了。但似乎很少有人在 Java 7 中使用 NIO.2
  • 您可以投票赞成答案,因为它会起作用,而且没有更好的选择。但由于除非获得至少两票赞成,否则不会授予赏金,我不确定这会有所作为。
【解决方案2】:

这些是您所拥有的简单可能性。

静态导入,增加可读性:

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

【讨论】:

  • 这些都是很好的建议,谢谢!顺便说一句,你知道是否有可能获得这些方法来创建必要的目录?
  • 作为提示:Files.createDirectories(dir, attrs) 和 Files.createDirectory(dir, attrs)!注意差异。
  • 我的意思是 FileUtils.writeByteArrayToFile 将在路径中创建不存在的目录,而 Files.write 失败。
  • 具体实现.. Apache Commons != JDK 7 SE!
  • 具体实现是什么?我知道 Commons 不是 JDK。我在问是否有办法获得相同的行为。
【解决方案3】:

java.nio.file.Files 有 5 种带有 OpenOption 可变参数的方法:

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

它们直接不限制任何OpenOption 组合,但它们都在后台调用java.nio.file.spi.FileSystemProvider 的这3 个方法中的一些方法:

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

FileSystemProvider.newInputStream(...) 被调用:Files.newInputStream(...)

FileSystemProvider.newOutputStream(...) 被调用:

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

abstract FileSystemProvider.newByteChannel(...) 被调用:

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

OptenOption组合限制:

  • FileSystemProvider.newInputStream(...)
    • UnsupportedOperationException:写 ||追加
  • FileSystemProvider.newOutputStream(...)
    • 隐式:写
    • IllegalArgumentException:读取
    • 默认(如果没有选项):CREATE && TRUNCATE_EXISTING

abstract FileSystemProvider.newByteChannel(...) 方法有一个依赖于平台的实现,它可以扩展OpenOption 组合限制(如sun.nio.fs.WindowsFileSystemProvider)。

在底层使用OpenOption vargars 的All Files 方法以抽象FileSystemProvider.newByteChannel(...) 结尾,该实现取决于平台。因此,Files 方法中的OpenOption 组合限制取决于平台。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 2012-01-06
    • 2017-02-06
    • 1970-01-01
    相关资源
    最近更新 更多