File.separatorとFileSystem.getSeparator()とSystem.getProperty(“ file.separator”)?


136

プラットフォームに依存する「ファイル区切り」をプラットフォームに依存しないようにする方法は3つあるようです

いつどれを使用するかをどのように決定しますか?

それらの間にも違いはありますか?


ここで実際にプラットフォーム依存のファイル区切りを取得していませんか?ちょうどプラットフォームに依存しない邸宅です。
steinybot 2014年

@Steiny、そう、更新しました。
Pacerier 2014年

典型的なJavaの質問には少なくとも3つ以上の回答があります
Stimpson Cat

回答:


142

System.getProperties()System.setProperty(String key, String value)コマンドラインパラメータの呼び出しまたはコマンドラインパラメータを使用してオーバーライドできます。-Dfile.separator=/

File.separator デフォルトのファイルシステムのセパレーターを取得します。

FileSystems.getDefault() デフォルトのファイルシステムを取得します。

FileSystem.getSeparator()ファイルシステムの区切り文字を取得します。インスタンスメソッドとして、1つのJVM内の複数のファイルシステムでコードを操作する必要がある場合に、これを使用して、デフォルト以外のコードにさまざまなファイルシステムを渡すことができます。


2
Cool = D Btw「複数のファイルシステムの操作」について詳しく説明していただけますか?
Pacerier

4
@Pacerier理論的には、区切り文字が「:」の新しいファイルシステム(BringerFS)を作成し、NTFSとBringerFSの2つのパーティションを持つマシンがある場合、この機能で両方を使用できます(仮定Java Filesystemプロバイダーも作成しました)。
Bringer128

つまり、誰かがWindowsとUNIXの2つのパーティションを持っていて、彼が(Windowsパーティションで)私のアプリを実行しているような、クラスが彼のUNIXファイルシステムにアクセスできるということですか?(別のFileSystemがインストールされていないため、これを実際にテストすることはできませんでした。)
Pacerier

1
Windows上のファイルシステム用のほとんどのドライバーは、「Windowsスタイル」のファイルシステムAPIへの変換を実行するため、OSと移植性のないアプリが機能するようになります。実用的な使い方は、Windowsのような固定パラダイムなしで奇妙で素晴らしいファイルシステムをサポートするOSでなければなりません。
Bringer128

ああ、そしてあなたの他の質問に答えるために-あなたがFileSystem扱ったファイルシステムごとに異なるインスタンスを持っているでしょう。
Bringer128

31

コードがファイルシステムの境界を越えない場合、つまり1つのファイルシステムで作業している場合は、を使用しますjava.io.File.separator

これにより、説明したように、FSのデフォルトのセパレータが得られます。Bringer128で説明したように、System.getProperty("file.separator")コマンドラインオプションでオーバーライドでき、ほどタイプセーフではありませんjava.io.File.separator

最後の1つjava.nio.file.FileSystems.getDefault().getSeparator();はJava 7で導入されたので、コードを古いJavaバージョン間で移植可能にしたい場合は、今のところ無視することもできます。

したがって、これらのオプションはどれも他のものとほとんど同じですが、完全ではありません。ニーズに合ったものを選択してください。


java.ioのために廃止java.nio
Pacerier

13
@Pacerier:いいえ、非推奨ではありません。java.ioはと比べて少し低いレベルですがjava.nio、それでも非常に広く有用です。違いは、blogs.oracle.com / slc / entry / javanio_vs_javaioで確認できます。nioは置き換えられません。io複数の方法で拡張されます(io内部で使用されます)。
darioo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.