Re: Is It Possible to Make Java Find a File on Your Computer?
In article <36Sdnf7hivdgVV7bnZ2dnUVZ_uiknZ2d@comcast.com>,
Lew <lew@lewscanon.com> wrote:
Knute Johnson wrote:
Desktop.open() opens the file in the appropriate program eg. an .xls
file will be opened with MS Excel if you have it installed or OO Calc if
you have that installed. Whatever would happen if you typed the file
name on the command line or double clicked on it in Explorer.
Desktop.edit() opens it in the default editor.
Desktop is so simple to use everybody has been confused by my
"path_to_.xls". That was supposed to mean "put the path to your .xls
file here." I think it is far superior to using Runtime.exec() and more
portable since with exec() you have to know what program is going to be
run.
In other words, Desktop exploits the file association of the host OS, correct?
There used to be a lot of discussion about active data, that is, data files
that execute themselves. Helper-app associations essentially achieve that, at
least appear to, with the added flexibility of user choice about which app
actually provides the behaviors for a given data class like spreadsheets.
The fact that Desktop respects local behavior associations makes it most
potent indeed.
I read this post and thought to myself "hm, this idea of file
associations seems fairly standardized in the Windows world, but
in Unix?" So I tried the almost-self-contained example upthread
(in a post by Andrew Thompson) on a Linux box [*], and .... Wow.
Nothing very useful happens in a text-only console, which is not
a huge surprise, but under GNOME (desktop environment), opening
"empty.doc" brings up OpenOffice Writer. Pretty cool, if one likes
this sort of functionality!
[*] Fedora Core 4, if it matters.
Further investigation (skimming an entry in Sun's tutorial
about the new Desktop class and the API) indicates that file
associations are obtained via some sort of interaction with GNOME.
Experiment indicates that the "open", "browse", and "mail" actions
Just Work (to bring up appropriate programs), but that "edit"
and "print" aren't supported. Huh. I'm mildly curious about --
well, several things:
Is the lack of support for editing and printing is true on all
Linux (and Unix?) systems? If so, I wonder why.
What happens if you try this stuff under a window manager / desktop
environment other than GNOME?
Is it easy to configure things to bring up one's own choice of
"appropriate programs" rather than whatever is set up by default
(on my system, Firefox for "browse", Evolution for "mail", and for
"open" something based on the file's extension -- e.g., OO Writer
for .doc, gedit for .txt)?
Below are two pieces of code, one to check which functions are
supported and another to try the ones that are on my system (open,
browse, mail), in case anyone wants to report results on other
systems. Note that is pretty much quick-and-dirty-hack code.
==== check what's supported ====
import java.awt.*;
import java.io.*;
public class DesktopCheck {
public static void main(String[] args) throws Exception {
System.out.println("desktop supported? " +
Desktop.isDesktopSupported());
Desktop dt = Desktop.getDesktop();
for (Desktop.Action a : Desktop.Action.values()) {
System.out.println("action " + a + " supported? " +
dt.isSupported(a));
}
}
}
==== try some Desktop actions (adapted from Andrew's example) ====
import java.awt.*;
import java.io.*;
import java.net.*;
public class FileAssociation {
public static void open(File document) throws Exception {
Desktop dt = Desktop.getDesktop();
dt.open(document);
}
public static void browse(URI document) throws Exception {
Desktop dt = Desktop.getDesktop();
dt.browse(document);
}
public static void mail(URI document) throws Exception {
Desktop dt = Desktop.getDesktop();
dt.mail(document);
}
public static void main(String[] args) {
if (args.length < 3) {
System.err.println("Need parameters: " +
"filename to open, URL to browse, mail address");
System.exit(1);
}
try {
open(new File(args[0]));
} catch(Exception ex) {
ex.printStackTrace();
}
try {
browse(new URI(args[1]));
} catch(Exception ex) {
ex.printStackTrace();
}
try {
mail(new URI("mailto:" + args[2]));
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
--
B. L. Massingill
ObDisclaimer: I don't speak for my employers; they return the favor.