Launch External Programs on Windows #79
Chapter 11, Native Integration and Packaging
|
409
HACK
The Power of Runtime.exec( )
Native integration in Java has always depended on the Java Native Inter-
face, or JNI. Whether you code to JNI directly or use a third-party library,
you are still dealing with native C code through a Java layer. This has always
been problematic because in order to write a JNI library, you need to know
a lot about the internals of the underlying operating system. Most Java
developers went to Java to get away from that sort of thing, so it’s often not
worth it for something simple like opening a URL. There is another way of
talking to the native OS, though. You can use
Runtime.exec( ).
Since 1.0, Java has had the
Runtime.exec( )
static function to start another
program directly and pass command-line parameters. It’s easy to forget
about command-line utilities, but for simple things they can be far, far eas-
ier than trying to deal with JNI. The disadvantages of calling a native pro-
gram over a Java API are of course speed, since you are starting a new
process, and the fact that the program is not cross-platform. This may be an
acceptable tradeoff, however, since you could disable the feature that needs
the
exec( ) call or provide a different command for other platforms.
Open a Text File
Windows 2000 introduced a small program called start. Originally a sepa-
rate install, the
start program is now just a command built into the cmd.exe
that comes with Windows XP. It is a simple command but it can do some
powerful things, such as opening a file with the default viewer, showing a
directory in the file explorer, or even launching a web browser.
For example, the sample program in Example 11-1 will open a text file with
the default viewer (usually Windows Notepad).
That’s it!
cmd.exe is the command processor built into Windows (a hold-
over from the DOS days). Whenever you open a DOS box, you are running
cmd.exe. You can manually replicate the previous code by typing "start c:/
version.txt
" into a command-line window.
Example 11-1. Launching a text file with start
import java.io.IOException;
public class ExecTest {
public static void main(String[] args) throws IOException {
String cmd = "cmd.exe /c start ";
String file = "c:\\version.txt";
Runtime.getRuntime( ).exec(cmd + file);
}
}

Get Swing Hacks now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.