从java中的包下面的类中放置文件的位置?

时间:2012-06-30 09:32:30

标签: java file-io file-read filepath

我有一个包含文件名的属性文件,只说file=fileName.dat。我已将属性文件放在类路径下,并可以在mainClass中正确读取文件名(file.dat)。在读取文件名后,我将文件名(只是名称而不是路径)传递给一个名为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); 中:

{{1}}

6 个答案:

答案 0 :(得分:3)

我假设您正在尝试使用类的getResource方法读取属性文件。如果将属性文件放在类路径的根目录上,则应在文件名前加上“/”以指示类路径的根,例如getResource(“/ file.dat”)。如果属性文件与您调用getResource方法的类位于同一文件夹下,则不应使用“/”前缀。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

试试..

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

..或只是

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

..如果mainmyClass中的最后一行main()中可用的类加载器通常是引导类加载器,而不是类加载器用于申请资源。

答案 3 :(得分:0)

大多数情况下,最好在"fileName.dat"文件夹中找到"user.home"system property。首先从File创建"user.home"路径,然后尝试在那里找到该文件。这是一个猜测,因为您没有提供应用程序的确切用户,但这将是最常见的地方。

您当前正在读取当前文件夹,该文件夹由

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

System.getProperty("user.dir")

答案 4 :(得分:0)

Class.getResource将在您的包目录中查找指定名称的文件。

JavaDocs here

或者getResourceAsStream有时候更方便,因为您可能想要阅读资源的内容。

答案 5 :(得分: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!/"
    }
}