1

プロパティファイルには、ファイル名のみが含まれていますfile=fileName.dat。プロパティ ファイルをクラス パスの下に配置し、ファイル名 (file.dat) を適切に読み取ることができましたmainClass。ファイル名を読んだ後、ファイル名(パスではなく名前だけ)をパッケージの下の別のクラスに渡し、そのファイルpack.myClassを読み取るように言いました。しかし問題はpack.myClass、ファイル パスを正しく取得できなかったことです。ファイルをfileName.datパッケージの内側と外側の両方に配置しましたが、機能packさせることができませんでした。

誰かがファイルをどこに置くべきか教えてくれますかfileName.dat?

ありがとう!

構成ファイルを読み取り、ファイル名を取得するために使用しているコード:

Properties prop = new Properties();
InputStream in = mainClass.class.getResourceAsStream("config.properties");
prop.load(in);
in.close();

myClass mc = new myClass();
mc.readTheFile(prop.getProperty("file"));
/*until this code is working good*/

次に、私がやっているmyClassという名前のパッケージの下にあります:pack

public void readTheFile(String filename) throws IOException {
    FileReader fileReader = new FileReader(filename); /*this couldn't get the file whether i'm putting the file inside or outside the package folder */
    /*after reading the file I've to do the BufferReader for further operation*/
    BufferedReader bufferedReader = new BufferedReader(fileReader);
4

6 に答える 6

3

クラスの getResource メソッドを使用してプロパティ ファイルを読み込もうとしているとします。プロパティ ファイルをクラスパスのルートに配置する場合は、ファイル名の前に「/」を付けて、クラスパスのルートを示す必要があります (例: getResource("/file.dat"))。プロパティ ファイルが、getResource メソッドを呼び出すクラスと同じフォルダーの下にある場合は、'/' プレフィックスを使用しないでください。

于 2012-06-30T09:45:47.110 に答える
1

試す..

myClass mc = new myClass();
InputStream in = mc.getClass().getResourceAsStream("/pack/config.properties");

..または単に

InputStream in = mc.getClass().getResourceAsStream("config.properties"); 

..がにある場合の最後の行でmainは、でmyClass 使用可能なクラスローダーmain()は、アプリケーションリソース用のクラスローダーではなく、ブートストラップクラスローダーになることがよくあります。

于 2012-06-30T10:29:13.217 に答える
1

のような相対ファイル名を使用すると、現在のディレクトリfileName.datにあるこの名前のファイルを要求しています。現在のディレクトリはパッケージとは関係ありません。これは、JVM が開始されるディレクトリです。

c:\foo\barそのため、 ( を使用して) アプリケーションを起動するときにディレクトリにいる場合java -cp ... pack.MyClass、ファイルが検索されますc:\foo\bar\fileName.dat

于 2012-06-30T09:55:00.823 に答える
0

jar アーカイブ内からでもファイルを読み取るには、次のようにします。

readTheFile(String package, String filename) throws MalformedURLException, IOException
{
    String filepath = package+"/"+filename;  
    // like "pack/fileName.dat" or "fileName.dat"

    String s = (new SourceBase()).getSourceBase() + filepath;
    URL url = new URL(s);
    InputStream ins = url.openStream();
    BufferedReader rdr = new BufferedReader(new InputStreamReader(ins, "utf8"));
    do {
        s = rdr.readLine();
        if(s!= null) System.out.println(s);
    }
    while(s!=null);
    rdr.close(); 
 }

class SourceBase
{
    public String getSourceBase()
    {
    String cn = this.getClass().getName().replace('.', '/') + ".class";
    // like "packagex/SourceBase.class"

    String s = this.getClass().getResource('/' + cn).toExternalForm();
    // like "file:/javadir/Projects/projectX/build/classes/packagex/SourceBase.class"
    // or "jar:file:/opt/java/PROJECTS/testProject/dist/
    //                testProject.jar!/px/SourceBase.class"

    return s.substring(0, s.lastIndexOf(cn));
    // like "file:/javadir/Projects/projectX/build/classes/"
    // or "jar:file:/opt/java/PROJECTS/testProject/dist/testProject.jar!/"
    }
}
于 2012-06-30T11:44:34.213 に答える
0

ほとんどの場合、システム プロパティであるフォルダ内の"fileName.dat"どこかを探すのが最善です。最初にからパスを作成し、そこからファイルを見つけようとします。アプリケーションの正確なユーザーを提供していないため、これは少し推測ですが、これは最も一般的な場所です。"user.home"File"user.home"

現在、によって決定される現在のフォルダーから読み取っています。

String currentDir = new File(".").getAbsolutePath();

また

System.getProperty("user.dir")
于 2012-06-30T09:46:07.373 に答える
0

Class.getResource は、パッケージ ディレクトリで指定された名前のファイルを探します。

JavaDocsはこちら

あるいは、おそらくリソースの内容を読みたいので、getResourceAsStream の方が便利な場合もあります。

于 2012-06-30T09:47:04.363 に答える