Where to put a file to read from a class under a package in java?

只谈情不闲聊 提交于 2019-12-11 05:50:13

问题


I have a properties file contains the file name only say file=fileName.dat. I've put the properties file under the class path and could read the file name(file.dat) properly from it in the mainClass. After reading the file name I passed the file name(just name not the path) to another class under a package say pack.myClass to read that file. But the problem is pack.myClass could not get the file path properly. I've put the file fileName.dat both inside and outside the packagepack but couldn't make it work.

Can anybody suggest me that where to put the file fileName.dat so I can read it properly and the whole application would be portable too.

Thanks!

The code I'm using to read the config file and getting the file name:

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

Then in myClass which is under package named pack I am doing:

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:


I assume that you are trying to read properties file using getResource method of class. If you put properties file on root of the classpath you should prefix file name with '/' to indicate root of classpath, for example getResource("/file.dat"). If properties file is under the same folder with the class you on which you invoke getResource method, than you should not use '/' prefix.




回答2:


When you use a relative file name such as fileName.dat, you're asking for a file with this name in the current directory. The current directory has nothing to do with packages. It's the directory from which the JVM is started.

So if you're in the directory c:\foo\bar when you launch your application (using java -cp ... pack.MyClass), it will look for the file c:\foo\bar\fileName.dat.




回答3:


Try..

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

..or simply

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

..for the last line if the main is in myClass The class loader available in the main() will often be the bootstrap class-loader, as opposed to the class-loader intended for application resources.




回答4:


Class.getResource will look in your package directory for a file of the specified name.

JavaDocs here

Or getResourceAsStream is sometimes more convenient as you probably want to read the contents of the resource.




回答5:


Most of the time it would be best to look for the "fileName.dat" somewhere in the "user.home" folder, which is a system property. First create a File path from the "user.home" and then try to find the file there. This is a bit of a guess as you don't provide the exact user of the application, but this would be the most common place.

You are currently reading from the current folder which is determined by

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

or

System.getProperty("user.dir")



回答6:


To read a file, even from within a jar archive:

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(); 
 }

with

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!/"
    }
}


来源:https://stackoverflow.com/questions/11273064/where-to-put-a-file-to-read-from-a-class-under-a-package-in-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!