有没有简洁、惯用的方式(可能使用Apache Commons),可以指定OpenOption的常见组合,例如StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING
有没有简洁、惯用的方式(可能使用Apache Commons),可以指定OpenOption的常见组合,例如StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING
以下是您可以使用的简单方法。
使用静态导入来增加可读性:
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));
我能提供的最好建议是欺骗T和T[]的等价性,另一个stackoverflow讨论中提到这应该可行。
所以...
OpenOption myOptions[] = {StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING};
OutputStream foo=OutputStream.newOutputStream(myPath,myOptions);
java.nio.file.Files
有五种方法可以使用OpenOption
可变参数:
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(...)
OpenOption
组合限制如下:
FileSystemProvider.newInputStream(...)
FileSystemProvider.newOutputStream(...)
摘要:FileSystemProvider.newByteChannel(...)
方法具有平台相关的实现,可能会扩展 OpenOption
组合限制(例如,sun.nio.fs.WindowsFileSystemProvider
)。
所有使用 OpenOption
可变参数的文件方法最终都会调用抽象的 FileSystemProvider.newByteChannel(...)
方法,其实现是平台相关的。因此,文件方法中的 OpenOption
组合限制也是平台相关的。