File.separatorまたはFile.pathSeparator


519

ではFile、クラスが2つの文字列がある、separatorpathSeparator

違いは何ですか?いつどちらを使用すればよいですか?


6
ネーミングは少しわかりにくいですが、このようなものが必要な速度はひどいものです(cf. Perl)。pathSeparatorCharseparatorCharの例を見てください。または、単純なニーモニックを使用します。pathSeparatorはパスを区切ります。
maaartinus、

6
画面にそれらの両方を印刷する分を取ることは、あなたの質問に答えたでしょう...
ジャン=フランソワ・コルベット

13
私は概ね同意しますが、彼のシステムでそれらを印刷するだけでは、他のオペレーティングシステムのバリアントを表示することはできません。
b1nary.atr0phy 2015

回答:


681

あなたが意味する場合File.separatorFile.pathSeparator、その後:

  • File.pathSeparatorファイルパスのリストで個々のファイルパスを区切るために使用されます。Windowsでは、PATH環境変数を検討してください。;Windowsの場合File.pathSeparatorはファイルパスを区切るためにa を使用します;

  • File.separatorいずれかである/か、\特定のファイルへのパスを分割するために使用されています。たとえば、Windowsでは\C:\Documents\Test


6
以下のように思えるFile.separatorしなければならないFile.fileSeparatorにについてFile.pathSeparator
エディ

1
@エディ私はあなたの要点を理解していますが、クラス名がであるため、それは冗長かもしれませんFile。ファイルの部分が暗示されていると思います。しかし、なぜJavaを使って多くのことをしたのかは誰にもわかりません。
user489041 2016

117

ファイルパスを構築するときは、セパレータを使用します。したがって、UNIXではセパレータは/です。したがって、UNIXパスを構築する場合/var/tempは、次のようにします。

String path = File.separator + "var"+ File.separator + "temp"

pathSeparatorクラスパスのようにファイルのリストを処理する場合は、を使用します。たとえば、アプリがjarのリストを引数として受け取った場合、そのリストをunixでフォーマットする標準的な方法は次のとおりです。/path/to/jar1.jar:/path/to/jar2.jar:/path/to/jar3.jar

したがって、ファイルのリストを指定すると、次のようになります。

String listOfFiles = ...
String[] filePaths = listOfFiles.split(File.pathSeparator);

5
このような* nixパスを構築する場合は、すでにプラットフォーム依存のコードがある/var/tempためFile.separator、使用しても意味がありません。パスをハードコーディングすることもできます。
isapir 2016年

109

java.io.Fileクラスには、4つの静的セパレータ変数が含まれています。よりよく理解するために、いくつかのコードの助けを借りて理解しましょう

  1. separator:文字列としてのプラットフォーム依存のデフォルトの名前区切り文字。Windowsの場合は「\」、UNIXの場合は「/」
  2. separatorChar:separatorと同じですが、charです
  3. pathSeparator:パス区切り文字のプラットフォーム依存変数。たとえば、UNIXシステムでは「:」および「;」で区切られたパスのPATHまたはCLASSPATH変数リスト Windowsシステム
  4. pathSeparatorChar:pathSeparatorと同じですが、charです

これらはすべて最終的な変数であり、システムに依存することに注意してください。

これらのセパレーター変数を出力するJavaプログラムは次のとおりです。FileSeparator.java

import java.io.File;

public class FileSeparator {

    public static void main(String[] args) {
        System.out.println("File.separator = "+File.separator);
        System.out.println("File.separatorChar = "+File.separatorChar);
        System.out.println("File.pathSeparator = "+File.pathSeparator);
        System.out.println("File.pathSeparatorChar = "+File.pathSeparatorChar);
    }

}

Unixシステムでの上記のプログラムの出力:

File.separator = /
File.separatorChar = /
File.pathSeparator = :
File.pathSeparatorChar = :

Windowsシステムでのプログラムの出力:

File.separator = \
File.separatorChar = \
File.pathSeparator = ;
File.pathSeparatorChar = ;

プログラムプラットフォームを独立させるには、これらの区切り文字を常に使用してファイルパスを作成するか、PATH、CLASSPATHなどのシステム変数を読み取る必要があります。

以下は、セパレータを正しく使用する方法を示すコードスニペットです。

//no platform independence, good for Unix systems
File fileUnsafe = new File("tmp/abc.txt");
//platform independent and safe to use across Unix and Windows
File fileSafe = new File("tmp"+File.separator+"abc.txt");

1
Javaではバックスラッシュ文字は実際には\\であることに注意してください。単一のバックスラッシュは他の特殊文字の省略形のエスケープ文字であるため、バックスラッシュ自体を使用してエスケープします。Stringそしてchar、上記の方法によって返されたが、適切にフォーマットされたバックスラッシュ(Windowsの場合)を返却します。
エリック、

新しいファイル( "tmp / abc.txt"); これは、windowsとlinuxには正確ですが、unix new File( "tmp \\ abc.txt")には正しくありません。これはunixのみの問題です
DEV-Jacol
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.