2016-09-01 32 views
1

File.javaはとして変数を使用しています。パス名文字列のプレフィックスとその長さはどのくらいですか?

private final transient int prefixLength; 

そして、これは「抽象パス名の接頭辞」である、と言います。それはfs.prefixLength()メソッドを使用して変数prefixLength設定されている。ここで

public File(String pathname) { 
     if (pathname == null) { 
      throw new NullPointerException(); 
     } 
     this.path = fs.normalize(pathname); 
     this.prefixLength = fs.prefixLength(this.path); 
    } 

File.javaはまた、コンストラクタを有します。 UnixFileSystemのDefaultFileSystemクラスリターンオブジェクトの

private static final FileSystem fs = DefaultFileSystem.getFileSystem(); 

方法getFileSystem():

変数FSはとしてFile.javaに定義されています。 fs.prefixLength()メソッドは実際にはUnixFileSystemのprefixLength()メソッドを呼び出します。

public int prefixLength(String pathname) { 
     if (pathname.length() == 0) return 0; 
     return (pathname.charAt(0) == '/') ? 1 : 0; 
    } 

この方法が唯一のパス名またはパス名の最初の文字の長さに応じて0または1を返すことを意味:UnixFileSystemのprefixLength()メソッドは次のように実現されます。

私の疑問は: どのような長さですか、その意義は何ですか?

答えて

3

prefixLengthの背後にある考え方は、ファイル名の残りの部分とは別に、そのパスのルートの場所を示すファイル名の一部を処理することである:上記

c:\quick\brown\fox.java 
^^^ 

は、接頭辞がc:\です。

UNIXの実装は簡単です。ルートは/と現在のディレクトリ(接頭辞なし)の2つしかありません。

のWindows \\をサポートする実装、c:c:\、および\を以下に示します。

public int prefixLength(String path) { 
    char slash = this.slash; 
    int n = path.length(); 
    if (n == 0) return 0; 
    char c0 = path.charAt(0); 
    char c1 = (n > 1) ? path.charAt(1) : 0; 
    if (c0 == slash) { 
     if (c1 == slash) return 2; /* Absolute UNC pathname "\\\\foo" */ 
     return 1;     /* Drive-relative "\\foo" */ 
    } 
    if (isLetter(c0) && (c1 == ':')) { 
     if ((n > 2) && (path.charAt(2) == slash)) 
      return 3;    /* Absolute local pathname "z:\\foo" */ 
     return 2;     /* Directory-relative "z:foo" */ 
    } 
    return 0;      /* Completely relative */ 
} 
0

それはあなたの質問をクリアしていない、明確にするために試すことができます:

  • 1)どのようなタイプそれは長さですか?
  • 2)その意義は何ですか?

1)この長さは、ファイルパスの名前にバーがあるかどうかを示します。 UNIXファイルシステムでは、あなたのアカウントに「/」を取るために、このファイルパス内のファイルにアクセスしようとすると、おそらく、それが使用されている)....

when "/user/some_folder" return 1 
when "user/some_folder" return 0 
when "" return 0 

2を知ることが重要です。..

関連する問題