How to include a text file in my executable JAR file?

Discussion in 'Java' started by zyng, Aug 23, 2012.

  1. zyng

    zyng Guest

    Hi:

    My Java program needs to access a text file(in fact, the Java code will use Linux System command "cp" to copy this text file to a destination folder during running). Suppose this is my Java program HelloWorld.java:

    package aa.bb.cc;

    public class HelloWorld
    {
    ...

    public static void main(final String[] args)
    {
    final URL myUrl = this.getClass().getClassLoader().getResource("namelist.txt");

    final File nameFile = new File(myUrl.getPath());
    if(windowlayoutFile.exists() == false)
    {
    System.out.println(nameFile.getAbsolutePath() + " does not exist!!!");
    }
    else
    {
    System.out.println(nameFile.getAbsolutePath() + " exists");
    }
    }
    }

    This is the directory and file structure in my file system:
    /HOME/java_project/src/aa/bb/cc/HelloWorld.java
    /HOME/java_project/build/aa/bb/cc/HelloWorld.class
    /HOME/java_project/nonsrc/namelist.txt

    In Eclipse, I have added nonsrc as "external class folder" and the code above works! The output is:
    /HOME/java_project/nonsrc/windowlayout.xml exists
    I am still not clear why use "external class folder", but it works in Eclipse.

    Now, my problem is when creating an executable JAR file(helloworld.jar), my JAR content is(shown by the command "jar tf helloworld.jar"):
    aa/bb/cc/HelloWorld.class
    namelist.txt

    Now, if i am at /HOME/test directory and the JAR file is here too:
    java -jar helloworld.jar

    This is the confusing output:
    /HOME/test/file:/HOME/test/robot.jar!/namelist.txt does not exist!!!

    The answers by Google just do not give me a clear whole picture of what is going on. (I don't want to put namelist.txt at the same package location as HelloWorld.java. I guess, if I do that, I maybe able to make it work by myself)

    I am surprised by an exclamation shown in the file path too. I have never used the class URL in the past, which is used in my code now.

    Thank you very much.
    zyng, Aug 23, 2012
    #1
    1. Advertising

  2. zyng

    zyng Guest

    Oops, a typo in my original post:

    This is the confusing output:
    /HOME/test/file:/HOME/test/helloworld.jar!/namelist.txt does not exist!!!
    zyng, Aug 23, 2012
    #2
    1. Advertising

  3. zyng

    Jan Burse Guest

    Try:
    URLConnection con = myUrl.openConnection();
    InputStream in = con.getInputStream();

    You can then copy from the in, via a Java loop.

    zyng schrieb:
    > Hi:
    >
    > My Java program needs to access a text file(in fact, the Java code will use Linux System command "cp" to copy this text file to a destination folder during running). Suppose this is my Java program HelloWorld.java:
    >
    > package aa.bb.cc;
    >
    > public class HelloWorld
    > {
    > ...
    >
    > public static void main(final String[] args)
    > {
    > final URL myUrl = this.getClass().getClassLoader().getResource("namelist.txt");
    >
    > final File nameFile = new File(myUrl.getPath());
    > if(windowlayoutFile.exists() == false)
    > {
    > System.out.println(nameFile.getAbsolutePath() + " does not exist!!!");
    > }
    > else
    > {
    > System.out.println(nameFile.getAbsolutePath() + " exists");
    > }
    > }
    > }
    >
    > This is the directory and file structure in my file system:
    > /HOME/java_project/src/aa/bb/cc/HelloWorld.java
    > /HOME/java_project/build/aa/bb/cc/HelloWorld.class
    > /HOME/java_project/nonsrc/namelist.txt
    >
    > In Eclipse, I have added nonsrc as "external class folder" and the code above works! The output is:
    > /HOME/java_project/nonsrc/windowlayout.xml exists
    > I am still not clear why use "external class folder", but it works in Eclipse.
    >
    > Now, my problem is when creating an executable JAR file(helloworld.jar), my JAR content is(shown by the command "jar tf helloworld.jar"):
    > aa/bb/cc/HelloWorld.class
    > namelist.txt
    >
    > Now, if i am at /HOME/test directory and the JAR file is here too:
    > java -jar helloworld.jar
    >
    > This is the confusing output:
    > /HOME/test/file:/HOME/test/robot.jar!/namelist.txt does not exist!!!
    >
    > The answers by Google just do not give me a clear whole picture of what is going on. (I don't want to put namelist.txt at the same package location as HelloWorld.java. I guess, if I do that, I maybe able to make it work by myself)
    >
    > I am surprised by an exclamation shown in the file path too. I have never used the class URL in the past, which is used in my code now.
    >
    > Thank you very much.
    >
    >
    Jan Burse, Aug 23, 2012
    #3
  4. zyng

    Jeff Higgins Guest

    On 08/23/2012 11:23 AM, Jan Burse wrote:
    > Try:
    > URLConnection con = myUrl.openConnection();
    > InputStream in = con.getInputStream();
    >
    > You can then copy from the in, via a Java loop.
    >
    > zyng schrieb:
    >> Hi:
    >>
    >> My Java program needs to access a text file(in fact, the Java code
    >> will use Linux System command "cp" to copy this text file to a
    >> destination folder during running). Suppose this is my Java program
    >> HelloWorld.java:
    >>
    >> package aa.bb.cc;
    >>
    >> public class HelloWorld
    >> {
    >> ...
    >>
    >> public static void main(final String[] args)
    >> {
    >> final URL myUrl =
    >> this.getClass().getClassLoader().getResource("namelist.txt");
    >>
    >> final File nameFile = new File(myUrl.getPath());
    >> if(windowlayoutFile.exists() == false)
    >> {
    >> System.out.println(nameFile.getAbsolutePath() + " does not exist!!!");
    >> }
    >> else
    >> {
    >> System.out.println(nameFile.getAbsolutePath() + " exists");
    >> }
    >> }
    >> }
    >>
    >> This is the directory and file structure in my file system:
    >> /HOME/java_project/src/aa/bb/cc/HelloWorld.java
    >> /HOME/java_project/build/aa/bb/cc/HelloWorld.class
    >> /HOME/java_project/nonsrc/namelist.txt
    >>
    >> In Eclipse, I have added nonsrc as "external class folder" and the
    >> code above works!


    Eclipse has added nonsrc to the classpath
    and getResource is able to find it.

    Use a relative URL?

    The output is:
    >> /HOME/java_project/nonsrc/windowlayout.xml exists
    >> I am still not clear why use "external class folder", but it works in
    >> Eclipse.
    >>
    >> Now, my problem is when creating an executable JAR
    >> file(helloworld.jar), my JAR content is(shown by the command "jar tf
    >> helloworld.jar"):
    >> aa/bb/cc/HelloWorld.class
    >> namelist.txt
    >>
    >> Now, if i am at /HOME/test directory and the JAR file is here too:
    >> java -jar helloworld.jar
    >>
    >> This is the confusing output:
    >> /HOME/test/file:/HOME/test/robot.jar!/namelist.txt does not exist!!!
    >>
    >> The answers by Google just do not give me a clear whole picture of
    >> what is going on. (I don't want to put namelist.txt at the same
    >> package location as HelloWorld.java. I guess, if I do that, I maybe
    >> able to make it work by myself)
    >>
    >> I am surprised by an exclamation shown in the file path too. I have
    >> never used the class URL in the past, which is used in my code now.
    >>
    >> Thank you very much.
    >>
    >>

    >
    Jeff Higgins, Aug 23, 2012
    #4
  5. zyng

    Jeff Higgins Guest

    Oops! Sorry Jan Burse, I meant to reply to the original thread.
    Jeff Higgins, Aug 23, 2012
    #5
  6. zyng

    Lew Guest

    zyng wrote:
    > My Java program needs to access a text file(in fact, the Java code will use Linux System command "cp" to copy this text file to a destination folder during running). Suppose this is my Java program HelloWorld.java:
    >
    > package aa.bb.cc;
    >
    > public class HelloWorld
    > {
    > ...
    > public static void main(final String[] args)
    > {
    > final URL myUrl = this.getClass().getClassLoader().getResource("namelist.txt");


    <http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String)>

    You don't actually need to get the 'ClassLoader' explicitly, as the 'Class' method
    will work, too.

    <http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getResource(java.lang.String)>

    Both these search the classpath.

    Entries in ZIP files (like JARs) are distinguished by <JARname>!path

    > final File nameFile = new File(myUrl.getPath());
    > if(windowlayoutFile.exists() == false)


    '== false', really?

    What's wrong with 'if (!windowlayoutFile.exists())'?

    > {
    > System.out.println(nameFile.getAbsolutePath() + " does not exist!!!");
    > }
    > else
    > {
    > System.out.println(nameFile.getAbsolutePath() + " exists");
    > }
    > }
    > }
    >
    >
    > This is the directory and file structure in my file system:
    > /HOME/java_project/src/aa/bb/cc/HelloWorld.java
    > /HOME/java_project/build/aa/bb/cc/HelloWorld.class
    > /HOME/java_project/nonsrc/namelist.txt
    >
    > In Eclipse, I have added nonsrc as "external class folder" and the code above works! The output is:
    > /HOME/java_project/nonsrc/windowlayout.xml exists
    > I am still not clear why use "external class folder", but it works in Eclipse.


    You added the folder to your classpath. You'd do the same thing with the
    "-classpath" ("-cp") option from the tools' command line.

    > Now, my problem is when creating an executable JAR file(helloworld.jar), my JAR content is(shown by the command "jar tf helloworld.jar"):
    >
    > aa/bb/cc/HelloWorld.class
    >
    > namelist.txt


    So 'namelist.txt' is at the root of the JAR classpath node.

    'HelloWorld' is 'aa.bb.cc.HelloWorld'.
    'namelist.txt' is in the default (unnamed) package.

    > Now, if i am at /HOME/test directory and the JAR file is here too:
    >
    > java -jar helloworld.jar
    >
    > This is the confusing output:
    >
    > /HOME/test/file:/HOME/test/robot.jar!/namelist.txt does not exist!!!


    "robot.jar"?

    You're running from the JAR. Local directories have no relevance, except
    as you access them via 'File' constructs.

    > The answers by Google just do not give me a clear whole picture of what is going on. (I don't want to put namelist.txt at the same package location as HelloWorld.java. I guess, if I do that, I maybe able to make it work by myself)


    It's in the default package, findable via 'getResource("/namelist.txt")'.

    > I am surprised by an exclamation shown in the file path too. I have never used the class URL in the past, which is used in my code now.


    The bang character is part of the ZIP file reference syntax.

    But when you run "java -jar" you have to specify all extrinsic classpath
    stuff in the JAR manifest. Otherwise only elements within the JAR are accessible.

    --
    Lew
    Lew, Aug 23, 2012
    #6
  7. zyng

    Roedy Green Guest

    On Thu, 23 Aug 2012 08:01:19 -0700 (PDT), zyng <>
    wrote, quoted or indirectly quoted someone who said :

    >My Java program needs to access a text file(in fact, the

    Java code will use Linux System command "cp" to copy this text file
    to a destination folder during running). Suppose this is my Java
    program HelloWorld.java:

    you include it with ANT or Jar.exe

    You access it using getResource or getResourceAsStream.
    See http://mindprod.com/jgloss/resource.html

    for image examples see http://mindprod.com/jgloss/image.html
    --
    Roedy Green Canadian Mind Products http://mindprod.com
    A new scientific truth does not triumph by convincing its opponents and making them see the light,
    but rather because its opponents eventually die, and a new generation grows up that is familiar with it.
    ~ Max Planck 1858-04-23 1947-10-04
    Roedy Green, Aug 23, 2012
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Arnold Peters
    Replies:
    0
    Views:
    543
    Arnold Peters
    Jan 5, 2005
  2. muttley
    Replies:
    0
    Views:
    2,677
    muttley
    Oct 20, 2005
  3. cyberco
    Replies:
    4
    Views:
    3,707
    Roedy Green
    Feb 14, 2006
  4. Jason Cavett
    Replies:
    8
    Views:
    596
    Sanjay
    May 16, 2007
  5. laredotornado
    Replies:
    23
    Views:
    1,243
    Arne Vajhøj
    Jan 26, 2011
Loading...

Share This Page