1

我有一个属性文件包含的文件名只说file=fileName.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

当您使用相对文件名时,例如fileName.dat,您要求在当前目录中使用此名称的文件。当前目录与包无关。它是启动 JVM 的目录。

因此,如果您在c:\foo\bar启动应用程序时位于目录中(使用java -cp ... pack.MyClass),它将查找文件c:\foo\bar\fileName.dat.

于 2012-06-30T09:55:00.823 回答
1

尝试..

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

..或者简单地说

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

..for 最后一行,如果在mainmyClass 可用的类加载器main()通常是引导类加载器,而不是用于应用程序资源的类加载器。

于 2012-06-30T10:29:13.217 回答
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 回答
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 回答