2012-06-30 44 views
1

我有一个属性文件包含文件名称只能说file=fileName.dat。我将属性文件放在类路径下,并可以从mainClass中正确读取文件名(file.dat)。在读取文件名后,我将文件名(仅命名为路径)传递给包下的另一个类,例如pack.myClass来读取该文件。但问题是pack.myClass无法正确获取文件路径。我已将文件fileName.dat放在包pack的内部和外部,但无法使其正常工作。把文件放在java包下的类中读取的位置?

有人可以建议我在哪里放置文件fileName.dat,这样我就可以正确读取它,整个应用程序也可以随身携带。

谢谢!

我使用读取配置文件和获取文件名中的代码:在myClass这是在名为pack我做的包

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*/ 

然后:

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); 
+0

请向我们提供的代码,以及运行时系统和(Java 2 SE?)指示应用程序的用户 –

+0

向我们显示一些代码。 –

+0

@owlstead:我使用我工作的代码编辑了我的问题 – flyleaf

回答

3

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

+0

请看看我的代码我编辑了我的问题 – flyleaf

+0

getResourceAsStream和FileReader使用完全不同的策略来定位文件。 getResourceAsStream在classpath中搜索文件,FileReader在文件系统路径中搜索文件。他们不同,只坚持一个策略。 – Deniz

+0

如果我使用getResourceAsStream,我可以将它传递给我在下一行中执行的BufferReader? – flyleaf

0

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

您正在从由

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

System.getProperty("user.dir") 
+0

请有一个在我的问题中看到我编辑的部分与我正在工作的代码 – flyleaf

+0

相应地更改了我的答案,如果这是正确的,它仍然取决于您的“用例” –

0

Class.getResource确定会看着你的包目录指定名称的文件当前文件夹读取。

JavaDocs here

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

1

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

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

1

尝试..

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

..或者干脆

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

..for如果mainmyClassmain()可用往往会引导类加载器的类加载器,而不是用于应用程序资源的类加载器的最后一行。

+0

我可以按照我的说法读取属性文件, mc.readTheFile()它可以获取文件名,但是我需要知道将文件filename.dat放在哪里是很好的地方,所以readTheFle()可以读取文件,整个过程将是可移植的,这样我就可以整个工作只使用类文件,它会自动找到文件名.dat – flyleaf

+1

不要再把它想象成一个'文件',如果它在应用程序中ation Jar,它不是**普通的'File',不能写入。它可以被**找到并通过'URL'或'InputStream'读取。 –

0

,甚至从一个罐子存档中读取文件,:

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!/" 
    } 
} 
相关问题