Path: csiph.com!x330-a1.tempe.blueboxinc.net!newsfeed.hal-mli.net!feeder3.hal-mli.net!newsfeed.hal-mli.net!feeder1.hal-mli.net!de-l.enfer-du-nord.net!feeder2.enfer-du-nord.net!feeds.phibee-telecom.net!usenet.ukfsn.org!not-for-mail From: Martin Gregorie Newsgroups: comp.lang.java.programmer Subject: Re: Resource confusion Date: Tue, 31 Jan 2012 02:45:25 +0000 (UTC) Organization: UK Free Software Network Lines: 63 Message-ID: References: NNTP-Posting-Host: 84.45.235.129 Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Trace: localhost.localdomain 1327977925 8760 84.45.235.129 (31 Jan 2012 02:45:25 GMT) X-Complaints-To: usenet@localhost.localdomain NNTP-Posting-Date: Tue, 31 Jan 2012 02:45:25 +0000 (UTC) User-Agent: Pan/0.135 (Tomorrow I'll Wake Up and Scald Myself with Tea; GIT 30dc37b master) Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:11662 On Mon, 30 Jan 2012 13:33:30 -0800, Roedy Green wrote: > On Sat, 28 Jan 2012 17:47:48 +0000 (UTC), Novice > wrote, quoted or indirectly quoted someone who said : > >>I'm having trouble figuring out the best way of obtaining existing files >>for my program to use. > > I would put the read-only config files in a resource in a jar. This > means they can't get lost and they work even if the user is not capable > of configuring his own files. They are also compact. They get updated > automatically when you update the program. > > You problem then becomes, where to put the user's files. JNLP lets you > allocate some space with a hideous name, not really suitable for the > user to insert things except via your game. If he creates them with a > text editor you might import them into that space or store the filenames > (not files) in your own space so he can pick them off a menu by > unqualified name, and you then go fetch them from the original locations > as needed. > Same here: I'd put the defaults in the jar and, allow the user to put overriding files in a master location and a one local to the user: if it was a UNIX type system the master location would be /usr/local/etc and the local location would be the hidden directory ~/.myapp and the program would use a search something like this; List config = new List(); config.add("~/.myapp/config.txt"); config.add("/usr/local/etc/config.txt"); boolean found = false; for (String s : config) { File cf = new File(s); if (cf.exists()) { found = true; // use the configuration in cf } } if (!found) // use the default configuration held as a resource in the jar file which lets the user's configuration take preference over the site configuration in /usr/local/etc, which in turn takes precedence over the jar file resource. NOTE: this assumes that each configuration is complete. Another way to do it is to read all three config files in the *reverse* order (from jar file, then /usr/local/etc and finally from ~/.myapp) with items read from an earlier file being overwritten by matching items from a later file. This approach means that the config in the jar file must give a default value for every item, but the site and user configurations only need to provide values for items they want to customise. -- martin@ | Martin Gregorie gregorie. | Essex, UK org |