2

次のJavaコードがあります:

public interface Defaults {
  public static final String DIR_PATH = "a/b/c/";
  File DIR_FILE = new File(DIR_PATH);
}

public class Main {
  public File directory = Defaults.DIR_FILE;
}

これは Windows マシンでコンパイルされ、ローカルの nexus リポジトリにデプロイされました。その後、Linux マシンでの Maven ビルド中に実行されました。nullをmain.directory.list()返すことになります。mvnDebugを使用すると、ファイルのパスが実際にはa\b\c! デバッガーを使用してディレクトリを に変更するとnew File("a/b/c")、コードが機能します。

コンパイラがシステム固有のセパレータをエンコードしたのはなぜですか? 解決策はありますか?

4

4 に答える 4

3

他の人が言うこととは異なり、これは Windows とFile.separator.

String DIR_PATH = "a/b/c/"は単なる文字列であり、Java もコンパイラもそれが何を意味するのかを理解しようとしないため、Windows と Linux の両方で同じ値が得られます。

また/、Unix と Windows の両方でファイル区切りとして機能するため、これも問題ではありません。必要に応じて、Java は に変換/\ます。

File DIR_FILE = new File(DIR_PATH);は定数ですがnew File()、実行時にクラスがロードされるときに VM によって引き続き実行されます。そのため、コンパイラがバイト コードを生成する間、パスはWindows 形式に変換されません。

したがって、説明する問題は別の場所にある必要があります。または、投稿したコード例の重要な部分が、質問のために単純化したときに変更されました。私の推測では、誰かが Windows スタイルのパスを別の場所のコードまたは構成に入れ、あなたはこれを見落としたのでしょう。

そうは言っても、パスを構築する安全な方法は次を使用することFile(File, String)です:

File DIR_PATH = new File( "a", new File( "b", "c" ) );

これにより、ファイルの区切り記号に関係なく、常に機能するパスが作成されます。必要な場合は、使用できます

File DIR_PATH = "a" + File.separator + "b" + File.separator + "c";

しかし、それはより複雑な例では失敗する可能性があり、読むべきテキストが多くなります。

于 2013-05-06T09:27:02.953 に答える
2

はい、使用しますFile.separatorChar

システム依存のデフォルトの名前区切り文字。このフィールドは、システム プロパティ file.separator の値の最初の文字を含むように初期化されます。UNIX システムでは、このフィールドの値は「/」です。Microsoft Windows システムでは「\」です。

于 2013-05-06T08:47:02.857 に答える
1

次のようなプラットフォームに依存しないファイル/ディレクトリ区切り記号を使用しますFile.separator

于 2013-05-06T08:50:03.780 に答える
0
public static final String DIR_PATH = "a"+File.separator"+"b"+File.separator+"c"
于 2013-05-06T08:51:33.390 に答える