我有一个包含文件名的属性文件,只说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}}
答案 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");
..如果main
在myClass
中的最后一行main()
中可用的类加载器通常是引导类加载器,而不是类加载器用于申请资源。
答案 3 :(得分:0)
大多数情况下,最好在"fileName.dat"
文件夹中找到"user.home"
,system property。首先从File
创建"user.home"
路径,然后尝试在那里找到该文件。这是一个猜测,因为您没有提供应用程序的确切用户,但这将是最常见的地方。
您当前正在读取当前文件夹,该文件夹由
决定String currentDir = new File(".").getAbsolutePath();
或
System.getProperty("user.dir")
答案 4 :(得分:0)
答案 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!/"
}
}