University of North Carolina at Asheville

CSCI 273.002: Mathematical Programming


Lab 05

Input and Output

[Introduction] [Instructions] [What To Submit]


Introduction

This lab will give you a chance to work with some key features of input and output in Java programming. These topics are covered in Section 1.5 of your text.

Instructions:

To complete this project, follow the steps listed below:

  1. Login to your home directory and launch a terminal window. Use the cd command to change your default directory to csci/273.002/labs. For the moment, just leave this window lurking around for future reference.
  2. Now launch the NetBeans IDE and raise the New Project dialog. Define the project to be a Java Application named Lab05. Make sure that the project folder will be created within your csci/273.002/labs folder. As in your previous labs, you should also uncheck the Create Main Class checkbox before you click Finish.
  3. Now go to the Booksite. Find the source file RandomSeq.java (Program 1.5.1 in your text). Right-click on the link to the plain-text version of this file and use the Save Link As... popup menu option to download it into your Lab05/src/ folder. Important: remember to download only the plain-text versions of these textbook files, not the HTML versions. NetBeans will automatically detect this new file and add it to the default package of your Lab05 project.

    Before moving on, you should take the time to look over the source code for RandomSeq.java. Hopefully you will have no trouble seeing what this program should do when you run it, but ask your lab instructor about anything that might seem unclear.

  4. Build the project. This step should cause you no problems, since at this stage you are just compiling an unedited Booksite demo. But if anything goes wrong, check immediately with your lab instructor before proceeding.

    Important reminder: for our purposes it will not be sufficient merely to compile individual source files. Unfortunately, this is all that happens if you right-click on a source file and select the Compile File option. Instead you want to use the Build or Clean and Build option. This compiles all the source files in your project, and it creates the dist subfolder containing the distribution JAR file named Lab05.jar. As usual, we will be using this JAR file to run individual project files from the terminal window.

  5. Now switch back to your terminal window, and set your default directory to be the Lab05 subfolder. Use the ls dist command to list the dist folder contents. You should see the file Lab05.jar. If not, it's again time to consult with your lab instructor.
  6. Enter the command
    
        java -cp dist/Lab05.jar RandomSeq 10
        

    You should now be staring at a list of 10 random real values in the terminal window.

  7. Your next task is to make RandomSeq write its output to a textfile, rather than the terminal window. To do this, we simply redefine the standard output device associated with the command you entered above, which by default is just the terminal window. This procedure is called redirection and it can be done for standard input (normally the keyboard) as well as standard output. For output, we simply change the command to
    
        java -cp dist/Lab05.jar RandomSeq 10 > randomseq.txt
        
    which creates a new textfile named randomseq.txt and makes it the standard output for this invocation of RandomSeq. If you now use ls to list the files in your Lab05 folder, you should see randomseq.txt as well as the usual NetBeans subfolders. You can use either the cat or more command to list the contents of randomseq.txt.

    Of course you could choose other names for the output file. You can also supply a complete or relative pathname (not just a base name) to create the file in some other folder. For instance, try

    
        java -cp dist/Lab05.jar RandomSeq 10 > ../randomseq2.txt
        
    and then see if you can find the new file randomseq2.txt.
  8. The authors of your text have provided two useful library classes named StdOut.java and StdIn.java to help simplify programs that use standard input and output. While these classes are not really so different from the current standard Java library classes for I/O, they are used in many of the textbook demo applications. So in this lab you will get a little practice with these libraries, starting with StdOut.

    First you need to download these libraries, either from the Booksite or directly from the links above, and add them to the default package for your project. While you are at it, you will also want to download another library class named StdDraw.java, which is intended to help you write programs for drawing graphics.

  9. Now go back and edit RandomSeq.java, replacing System.out by StdOut throughout the text. Then Build the project again before proceeding to the next step.
  10. To run the new version, re-enter the command
    
        java -cp dist/Lab05.jar RandomSeq 10
        

    Hopefully you now see the same sort of display in the terminal window that the original version produced...

  11. The authors wrote StdOut in order to simplify the task of producing standard output, especially formatted output. In particular, StdOut has a printf() method similar to one developed long ago for C programmers. An example is shown below:
    
        StdOut.printf("%7.5f\n", Math.random());
        
    This statement prints a single random value on a line, just like the println() statement in RandomSeq.java. But it prints the value using a format specifier string that specifies the total number of character spaces used to display it (7 in this case), as well as the number of digits shown after the decimal point (5).

    Try out this feature now, by replacing the println() statement in RandomSeq by the printf() version as written above. Rebuild the project and run RandomSeq to see the formatted values. We will use the new version for the rest of this lab.

    Note: As of Java 1.5 there is a standard System.out.printf() statement, which is quite similar to the textbook StdOut version.

  12. Now we turn to a program that requires data from standard input (which by default is your keyboard). Return to the Booksite and find the source file Average.java (Program 1.5.3 in your text). Download this source (again, the plain-text version) into your Lab05/src/ folder. Take a moment to scan through this program, and try to figure out what it does. Then Build your Lab05 project yet again.

    Now return to the terminal window, and enter the command

    
        java -cp dist/Lab05.jar Average
    Note that nothing seems to happen at first. That is because this program is waiting for you to provide the standard input stream it is looking for. This will happen only when you start entering data from the keyboard. In this case, you want to supply a sequence of real numbers, separated from each other by whitespace (blanks, tabs, newlines -- but no commas or other punctuation marks). For keyboard input on Unix/Linux systems, you will "end" this stream whenever you type ctrl-D. For Microsoft Windows systems, you end the standard input stream by typing ctrl-Z, followed by the ENTER key.

    So... enter, say, 5 values, not all on the same line, and then type ctrl-D. What happens at that point?

  13. Next we redirect the standard input stream, so that the list of real numbers needed by the Average program will be read from a textfile rather than the keyboard. Recall that we just happen to have a suitable textfile lying around, namely the file randomseq.txt generated by RandomSeq in a previous step.

    The command to redirect the input is as follows:

    
        java -cp dist/Lab05.jar Average < randomseq.txt 
        
    So enter this command, and the Average program should immediately read all the numbers in randomseq.txt and write its results to standard output (which in this case is the screen again).
  14. In the last step you saw a case of one program producing output which became the input for a second program. This sort of thing is done so often that Linux and many other operating systems provide a mechanism called piping for "hooking programs together", so that the standard output of one becomes the standard input of another. One simple example of this is the following command:
    
        cat randomseq.txt | sort
        
    The first part of this invokes the cat command, which in this case will list the contents of randomseq.txt to its standard output. This is follwed by a vertical bar (|), which represents the pipe that sends this output as standard input to a sort command. As used here, sort treats its standard input as a sequence of lines (character strings) which it sorts (using standard lexicographic order) and then passes on to its own standard output.

    So enter this command, and see if the results help to clarify all the words you just tried to read...

  15. As a somewhat more long-winded example, try your hand at using the pipe mechanism to have RandomSeq generate 1000 numbers, which Average reads and processes. Let the standard output of Average be the screen, so that when you run this command all you will see is something like the following:

    
        Number  = 1000
        Average = 0.498597009999994
        

  16. For your final exercise in this lab, you will need to download a slightly modified version of RandomSeq.java, namely RandomSeq2.java, and add it to your Lab05 project. Rebuild the project and run this version with the input argument 10, then examine its output. As you can see, this version first prints the number N of random values that it will generate. Then it prints a sequence of N lines, with each line containing two numbers. The first is just the loop counter value, while the second is the random value itself. For what follows, you should think of the first value as the index (or subscript) of the corresponding random value in the sequence.

    Now use the textbook StdDraw class (which you should have downloaded along with StdOut and StdIn) to write a complete new program named DrawRandomSeq, which reads the output of RandomSeq2 and produces a graphic display similar to the one shown below:

    This display shows N random values (1000 in this example), with each value plotted vs. its index. Thus the x-scale of the plot should be from 0 to N. You can decide for yourself what sort of y-scale works best here.

    Note that the horizontal blue line shown above is just the average of all the random values. For this part you probably want to compute the average directly within DrawRandomSeq.


What To Submit

When your project is complete and working correctly, demonstrate it to your lab instructor. Then, before you exit NetBeans, clean your Lab05 project. Finally, before you logout, switch back to your terminal and set your default directory back to csci/273.002/labs. Then create a JAR file of your Lab05 project folder, using the command

jar cf Lab05Project.jar Lab05
Please leave both your Lab05 project folder and Lab05Project.jar in your csci/273.002/labs directory for the remainder of the semester.