web-dev-qa-db-ja.com

一般的なOpenOptionの組み合わせを使用する最も簡単な方法

StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTINGのようなOpenOptionの一般的な組み合わせを指定するための簡潔で慣用的な方法(おそらくApache Commonsを使用)はありますか?

16

これらはあなたが持っている簡単な可能性です。

読みやすさを向上させるための静的インポート:

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));
35
Franz Ebner

私が提供できる最善の提案は、T ...とT []の同等性をごまかすことです。これは、他のスタックオーバーフローの議論の1つが機能するはずだと言っています

Javaで可変引数を持つメソッドに配列を引数として渡すことはできますか?

そう...

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

警告:テストされていません。

6
keshlam

_Java.nio.file.Files_には、OpenOptionvarargsパラメーターを持つ5種類のメソッドがあります。

_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(...)
_

抽象FileSystemProvider.newByteChannel(...)は次の人によって呼び出されます。

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

OptenOption組み合わせの制限:

  • FileSystemProvider.newInputStream(...)
    • UnsupportedOperationException:書き込み||追加
  • FileSystemProvider.newOutputStream(...)
    • 暗黙的に:書き込み
    • IllegalArgumentException:READ
    • デフォルト(オプション以外の場合):CREATE && TRUNCATE_EXISTING

abstractFileSystemProvider.newByteChannel(...)メソッドにはプラットフォームに依存する実装があり、これによりOpenOptionの組み合わせ制限が拡張される場合があります(_Sun.nio.fs.WindowsFileSystemProvider_のように)。

内部でOpenOption vargarsを使用するすべてのFilesメソッドは、実装がプラットフォームに依存する抽象FileSystemProvider.newByteChannel(...)で終わります。したがって、FilesメソッドのOpenOptionの組み合わせの制限は、プラットフォームによって異なります。

1
zeugor