Give the Java Classpath Plenty of Environment Space
Some Java applications require rather lengthy additions to the CLASSPATH environment variable when executing those applications from a DOS window. For instance, if you are using IBM's Java Toolbox for the AS/400, you have to add your PC's location of the jt400.jar or jt400.zip files to your CLASSPATH, and, if you start to use Java's JFC Swing library, you'll have to add the path for the swingall.jar file. You can make these additions easily with the DOS batch commands shown in Figure 1.
But when you start to add more and more Java zip and jar files to your CLASSPATH environment variable, you may experience the DOS "Out of environment space" error. So, how do you increase your PC's environment space?
To permanently increase environment space, add the following line to your CONFIG.SYS file, and then restart your system:
shell=command.com /e:8192 /p
Don Denoncourt Senior Technical Editor Midrange Computing
Don't Let Main Do the Driving
When you first start to program in Java, you learn to code a function called main. The main function of a class is automatically invoked by the Java runtime environment.
Most RPG programmers who learn Java use the main function like the main routine of an RPG program. But the main function is not the best place to put your driver code. Consider the Java application in Figure 2.
This class seems to make sense, but you get the following compile errors:
Cannot make a static reference to a nonstatic field in class JavaApplication
Cannot make a static reference to the instance method named doStuff for class JavaApplication.
The reason for these errors is that object fields and functions are different from class fields and functions. A class field or function is qualified with the Java keyword static. The main function is a good example. It's static, which means it can only operate on
fields declared as static and invoke functions declared as static. Static fields are considered class fields because there is never more than one instance of those variables for a class, no matter how many objects of that class type are instantiated (created).
Nonstatic fields are considered object fields because there are separate instances of those fields for every object instantiated from that class. Static class functions can be invoked without having an object instance of that class. The only restriction on static functions is that they can operate only on static fieldshence the term class function.
Nonstatic fields and functions are considered object fields and functions because there is a unique instance of them for every object created of that class type. Using main as a driver function works fine if you make all of your other functions static and use local variables or static class fields, but that is not object-oriented programming. You'd be better off using Visual Basic.
The main function should be used only to bootstrap or jumpstart a class by having it instantiate itself. Then, whatever driver code the application requires goes in the class's constructor function. I've illustrated this in Figure 3.
Don Denoncourt Senior Technical Editor Midrange Computing
Improve the Performance of IFSFileInputStream and IFSFileOutputStream
The AS/400 Toolbox for Java provides classes for accessing files in the integrated file system of the AS/400. IFSFileInputStream reads data from a file, and IFSFileOutputStream writes data to a file. These files do not buffer or cache data; they access the AS/400 when they receive a request to read or write data. If your application does file IO many times or in small chunks, performance will suffer.
Fortunately, these Toolbox classes were designed to improve performance via the Java buffering technology. IFSFileInputStream extends java.io.InputStream. IFSFileOutputStream extends java.io.OutputStream. Java classes that improve the performance of java.io.InputStream and java.io.OutputStream can also be used with IFSFileInputStream and IFSFileOutputStream.
For example, the program in Figure 4 accesses data in a file on the AS/400 via the IFSFileInputStream and IFSFileOutputStream classes of the Toolbox. In the first case, it uses a BufferedInputStream class to cache data. In the second case, it accesses data directly via a call to the Toolbox class. Performance is greatly improved when reading and writing data through buffers.
David Wall IBM Rochester
More Error Information from the AS/400 Toolbox for Java JDBC Driver
By default, the AS/400 Toolbox for Java JDBC driver returns only first-level text for error messages. If you want more information about errors, add ;errors=full to the URL you use for connecting to the database. This addition tells the driver to return both first- and second-level text for error messages.
Clifton M. Nock IBM Rochester
Trace a JDBC Program with the AS/400 Toolbox for Java JDBC Driver
When debugging a Java application or applet that uses JDBC, it can be helpful to examine a trace of what the JDBC driver is doing. With the AS/400 Toolbox for Java JDBC driver, the trace will show a lot of information, including full-stack traces for any errors that occur and summaries of which SQL statements are prepared and executed, what results are returned, and when various resources are opened and closed.
There are two ways to turn on tracing. In the Java program itself, the code in Figure 5 will tell the JDBC driver manager to dump trace information to the standard output device. If you do not have access to the source code of the JDBC application or applet, add ;trace=true to the URL that you use for connecting to the database.
Clifton M. Nock IBM Rochester
SET CLASSPATH=%classpath%;C:jt400libjt400.jar
SET CLASSPATH=%classpath%;C:swingswingall.jar public class JavaApplication {
int field;
public static void main(String argv[]) {
field = 1;
doStuff();
}
private void doStuff() {
field++; public class JavaApplication {
int field;
public static void main(String argv[]) {
new JavaApplication ();
}
public JavaApplication() {
field = 1;
doStuff();
}
private void doStuff() {
field++; import java.io.*;
import java.util.*;
import java.math.*;
import com.ibm.as400.access.*;
public class readfile2 extends Object
{
public static void main(String[] args)
{
System.out.println(" ");
System.out.println("Starting application");
System.out.println(" ");
try
Figure 1: Setting the Java classpath environment variable
Figure 2: The main function drives the program
Figure 3: The main function jumpstarts the class
{
AS400 system = new AS400();
int loopCount = 5000;
System.out.println("writing to file - cached");
IFSFileOutputStream outFileIFS = new IFSFileOutputStream(system,
"/daw/a.a");
BufferedOutputStream outputFile = new BufferedOutputStream(outFileIFS, 1024);
byte data = 0;
long timeStart = System.currentTimeMillis();
for (int i = 0; i < loopCount; i++)
{
outputFile.write(data);
}
outputFile.flush();
System.out.println(" Write time: " + (System.currentTimeMillis()timeStart));
System.out.println("reading from file - cached");
timeStart = System.currentTimeMillis();
IFSFileInputStream inFileIFS = new IFSFileInputStream(system, "/daw/a.a");
BufferedInputStream inputFile = new BufferedInputStream(inFileIFS, 1024);
for (int i = 0; i < loopCount; i++)
{
data = (byte) inputFile.read();
}
System.out.println(" Read time: " + (System.currentTimeMillis() -timeStart));
System.out.println("");
System.out.println("writing to file - no cache");
IFSFileOutputStream outFileIFS2 = new IFSFileOutputStream(system, "/daw/a.a2");
timeStart = System.currentTimeMillis();
for (int i=0; i < loopCount; i++)
{
outFileIFS2.write(data);
}
outFileIFS2.flush();
System.out.println(" Write time: " + (System.currentTimeMillis() - timeStart));
System.out.println("reading from file - no cache");
timeStart = System.currentTimeMillis();
IFSFileInputStream inFileIFS2 = new IFSFileInputStream(system, "/daw/a.a2");
for (int i = 0; i < loopCount; i++)
{
data = (byte) inFileIFS2.read();
}
System.out.println(" Read time: " + ( System.currentTimeMillis() - timeStart));
}
catch (Exception e) { System.out.println(e);}
System.exit(0);
}
}
DriverManager.setLogStream ( System.out);
LATEST COMMENTS
MC Press Online