- •Preface
- •1.1 Machine Language
- •1.3 The Java Virtual Machine
- •1.4 Building Blocks of Programs
- •1.5 Object-oriented Programming
- •1.6 The Modern User Interface
- •Quiz on Chapter 1
- •2 Names and Things
- •2.1 The Basic Java Application
- •2.2.1 Variables
- •2.2.2 Types and Literals
- •2.2.3 Variables in Programs
- •2.3.2 Operations on Strings
- •2.3.3 Introduction to Enums
- •2.4 Text Input and Output
- •2.4.1 A First Text Input Example
- •2.4.2 Text Output
- •2.4.3 TextIO Input Functions
- •2.4.4 Formatted Output
- •2.4.5 Introduction to File I/O
- •2.5 Details of Expressions
- •2.5.1 Arithmetic Operators
- •2.5.2 Increment and Decrement
- •2.5.3 Relational Operators
- •2.5.4 Boolean Operators
- •2.5.5 Conditional Operator
- •2.5.7 Type Conversion of Strings
- •2.5.8 Precedence Rules
- •2.6 Programming Environments
- •2.6.1 Java Development Kit
- •2.6.2 Command Line Environment
- •2.6.3 IDEs and Eclipse
- •2.6.4 The Problem of Packages
- •Exercises for Chapter 2
- •Quiz on Chapter 2
- •3 Control
- •3.1 Blocks, Loops, and Branches
- •3.1.1 Blocks
- •3.1.2 The Basic While Loop
- •3.1.3 The Basic If Statement
- •3.2 Algorithm Development
- •3.2.2 The 3N+1 Problem
- •3.2.3 Coding, Testing, Debugging
- •3.3.1 The while Statement
- •3.3.2 The do..while Statement
- •3.3.3 break and continue
- •3.4 The for Statement
- •3.4.1 For Loops
- •3.4.2 Example: Counting Divisors
- •3.4.3 Nested for Loops
- •3.5 The if Statement
- •3.5.1 The Dangling else Problem
- •3.5.2 The if...else if Construction
- •3.5.3 If Statement Examples
- •3.5.4 The Empty Statement
- •3.6 The switch Statement
- •3.6.1 The Basic switch Statement
- •3.6.2 Menus and switch Statements
- •3.6.3 Enums in switch Statements
- •3.7.1 Exceptions
- •3.7.2 try..catch
- •3.7.3 Exceptions in TextIO
- •Exercises for Chapter 3
- •Quiz on Chapter 3
- •4 Subroutines
- •4.1 Black Boxes
- •4.2.2 Calling Subroutines
- •4.2.3 Subroutines in Programs
- •4.2.4 Member Variables
- •4.3 Parameters
- •4.3.1 Using Parameters
- •4.3.2 Formal and Actual Parameters
- •4.3.3 Overloading
- •4.3.4 Subroutine Examples
- •4.3.5 Throwing Exceptions
- •4.3.6 Global and Local Variables
- •4.4 Return Values
- •4.4.1 The return statement
- •4.4.2 Function Examples
- •4.4.3 3N+1 Revisited
- •4.5 APIs, Packages, and Javadoc
- •4.5.1 Toolboxes
- •4.5.3 Using Classes from Packages
- •4.5.4 Javadoc
- •4.6 More on Program Design
- •4.6.1 Preconditions and Postconditions
- •4.6.2 A Design Example
- •4.6.3 The Program
- •4.7 The Truth About Declarations
- •4.7.1 Initialization in Declarations
- •4.7.2 Named Constants
- •4.7.3 Naming and Scope Rules
- •Exercises for Chapter 4
- •Quiz on Chapter 4
- •5 Objects and Classes
- •5.1.1 Objects, Classes, and Instances
- •5.1.2 Fundamentals of Objects
- •5.1.3 Getters and Setters
- •5.2 Constructors and Object Initialization
- •5.2.1 Initializing Instance Variables
- •5.2.2 Constructors
- •5.2.3 Garbage Collection
- •5.3 Programming with Objects
- •5.3.2 Wrapper Classes and Autoboxing
- •5.4 Programming Example: Card, Hand, Deck
- •5.4.1 Designing the classes
- •5.4.2 The Card Class
- •5.4.3 Example: A Simple Card Game
- •5.5.1 Extending Existing Classes
- •5.5.2 Inheritance and Class Hierarchy
- •5.5.3 Example: Vehicles
- •5.5.4 Polymorphism
- •5.5.5 Abstract Classes
- •5.6 this and super
- •5.6.1 The Special Variable this
- •5.6.2 The Special Variable super
- •5.6.3 Constructors in Subclasses
- •5.7 Interfaces, Nested Classes, and Other Details
- •5.7.1 Interfaces
- •5.7.2 Nested Classes
- •5.7.3 Anonymous Inner Classes
- •5.7.5 Static Import
- •5.7.6 Enums as Classes
- •Exercises for Chapter 5
- •Quiz on Chapter 5
- •6 Introduction to GUI Programming
- •6.1 The Basic GUI Application
- •6.1.1 JFrame and JPanel
- •6.1.2 Components and Layout
- •6.1.3 Events and Listeners
- •6.2 Applets and HTML
- •6.2.1 JApplet
- •6.2.2 Reusing Your JPanels
- •6.2.3 Basic HTML
- •6.2.4 Applets on Web Pages
- •6.3 Graphics and Painting
- •6.3.1 Coordinates
- •6.3.2 Colors
- •6.3.3 Fonts
- •6.3.4 Shapes
- •6.3.5 Graphics2D
- •6.3.6 An Example
- •6.4 Mouse Events
- •6.4.1 Event Handling
- •6.4.2 MouseEvent and MouseListener
- •6.4.3 Mouse Coordinates
- •6.4.4 MouseMotionListeners and Dragging
- •6.4.5 Anonymous Event Handlers
- •6.5 Timer and Keyboard Events
- •6.5.1 Timers and Animation
- •6.5.2 Keyboard Events
- •6.5.3 Focus Events
- •6.5.4 State Machines
- •6.6 Basic Components
- •6.6.1 JButton
- •6.6.2 JLabel
- •6.6.3 JCheckBox
- •6.6.4 JTextField and JTextArea
- •6.6.5 JComboBox
- •6.6.6 JSlider
- •6.7 Basic Layout
- •6.7.1 Basic Layout Managers
- •6.7.2 Borders
- •6.7.3 SliderAndComboBoxDemo
- •6.7.4 A Simple Calculator
- •6.7.5 Using a null Layout
- •6.7.6 A Little Card Game
- •6.8 Menus and Dialogs
- •6.8.1 Menus and Menubars
- •6.8.2 Dialogs
- •6.8.3 Fine Points of Frames
- •6.8.4 Creating Jar Files
- •Exercises for Chapter 6
- •Quiz on Chapter 6
- •7 Arrays
- •7.1 Creating and Using Arrays
- •7.1.1 Arrays
- •7.1.2 Using Arrays
- •7.1.3 Array Initialization
- •7.2 Programming With Arrays
- •7.2.1 Arrays and for Loops
- •7.2.3 Array Types in Subroutines
- •7.2.4 Random Access
- •7.2.5 Arrays of Objects
- •7.2.6 Variable Arity Methods
- •7.3 Dynamic Arrays and ArrayLists
- •7.3.1 Partially Full Arrays
- •7.3.2 Dynamic Arrays
- •7.3.3 ArrrayLists
- •7.3.4 Parameterized Types
- •7.3.5 Vectors
- •7.4 Searching and Sorting
- •7.4.1 Searching
- •7.4.2 Association Lists
- •7.4.3 Insertion Sort
- •7.4.4 Selection Sort
- •7.4.5 Unsorting
- •7.5.3 Example: Checkers
- •Exercises for Chapter 7
- •Quiz on Chapter 7
- •8 Correctness and Robustness
- •8.1 Introduction to Correctness and Robustness
- •8.1.1 Horror Stories
- •8.1.2 Java to the Rescue
- •8.1.3 Problems Remain in Java
- •8.2 Writing Correct Programs
- •8.2.1 Provably Correct Programs
- •8.2.2 Robust Handling of Input
- •8.3 Exceptions and try..catch
- •8.3.1 Exceptions and Exception Classes
- •8.3.2 The try Statement
- •8.3.3 Throwing Exceptions
- •8.3.4 Mandatory Exception Handling
- •8.3.5 Programming with Exceptions
- •8.4 Assertions
- •8.5 Introduction to Threads
- •8.5.1 Creating and Running Threads
- •8.5.2 Operations on Threads
- •8.5.4 Wait and Notify
- •8.5.5 Volatile Variables
- •8.6 Analysis of Algorithms
- •Exercises for Chapter 8
- •Quiz on Chapter 8
- •9.1 Recursion
- •9.1.1 Recursive Binary Search
- •9.1.2 Towers of Hanoi
- •9.1.3 A Recursive Sorting Algorithm
- •9.1.4 Blob Counting
- •9.2 Linked Data Structures
- •9.2.1 Recursive Linking
- •9.2.2 Linked Lists
- •9.2.3 Basic Linked List Processing
- •9.2.4 Inserting into a Linked List
- •9.2.5 Deleting from a Linked List
- •9.3 Stacks, Queues, and ADTs
- •9.3.1 Stacks
- •9.3.2 Queues
- •9.4 Binary Trees
- •9.4.1 Tree Traversal
- •9.4.2 Binary Sort Trees
- •9.4.3 Expression Trees
- •9.5 A Simple Recursive Descent Parser
- •9.5.1 Backus-Naur Form
- •9.5.2 Recursive Descent Parsing
- •9.5.3 Building an Expression Tree
- •Exercises for Chapter 9
- •Quiz on Chapter 9
- •10.1 Generic Programming
- •10.1.1 Generic Programming in Smalltalk
- •10.1.2 Generic Programming in C++
- •10.1.3 Generic Programming in Java
- •10.1.4 The Java Collection Framework
- •10.1.6 Equality and Comparison
- •10.1.7 Generics and Wrapper Classes
- •10.2 Lists and Sets
- •10.2.1 ArrayList and LinkedList
- •10.2.2 Sorting
- •10.2.3 TreeSet and HashSet
- •10.2.4 EnumSet
- •10.3 Maps
- •10.3.1 The Map Interface
- •10.3.2 Views, SubSets, and SubMaps
- •10.3.3 Hash Tables and Hash Codes
- •10.4 Programming with the Collection Framework
- •10.4.1 Symbol Tables
- •10.4.2 Sets Inside a Map
- •10.4.3 Using a Comparator
- •10.4.4 Word Counting
- •10.5 Writing Generic Classes and Methods
- •10.5.1 Simple Generic Classes
- •10.5.2 Simple Generic Methods
- •10.5.3 Type Wildcards
- •10.5.4 Bounded Types
- •Exercises for Chapter 10
- •Quiz on Chapter 10
- •11 Files and Networking
- •11.1 Streams, Readers, and Writers
- •11.1.1 Character and Byte Streams
- •11.1.2 PrintWriter
- •11.1.3 Data Streams
- •11.1.4 Reading Text
- •11.1.5 The Scanner Class
- •11.1.6 Serialized Object I/O
- •11.2 Files
- •11.2.1 Reading and Writing Files
- •11.2.2 Files and Directories
- •11.2.3 File Dialog Boxes
- •11.3 Programming With Files
- •11.3.1 Copying a File
- •11.3.2 Persistent Data
- •11.3.3 Files in GUI Programs
- •11.3.4 Storing Objects in Files
- •11.4 Networking
- •11.4.1 URLs and URLConnections
- •11.4.2 TCP/IP and Client/Server
- •11.4.3 Sockets
- •11.4.4 A Trivial Client/Server
- •11.4.5 A Simple Network Chat
- •11.5 Network Programming and Threads
- •11.5.1 A Threaded GUI Chat Program.
- •11.5.2 A Multithreaded Server
- •11.5.3 Distributed Computing
- •11.6 A Brief Introduction to XML
- •11.6.1 Basic XML Syntax
- •11.6.2 XMLEncoder and XMLDecoder
- •11.6.3 Working With the DOM
- •Exercises for Chapter 11
- •Quiz on Chapter 11
- •12 Advanced GUI Programming
- •12.1 Images and Resources
- •12.1.2 Working With Pixels
- •12.1.3 Resources
- •12.1.4 Cursors and Icons
- •12.1.5 Image File I/O
- •12.2 Fancier Graphics
- •12.2.1 Measuring Text
- •12.2.2 Transparency
- •12.2.3 Antialiasing
- •12.2.4 Strokes and Paints
- •12.2.5 Transforms
- •12.3 Actions and Buttons
- •12.3.1 Action and AbstractAction
- •12.3.2 Icons on Buttons
- •12.3.3 Radio Buttons
- •12.3.4 Toolbars
- •12.3.5 Keyboard Accelerators
- •12.3.6 HTML on Buttons
- •12.4 Complex Components and MVC
- •12.4.1 Model-View-Controller
- •12.4.2 Lists and ListModels
- •12.4.3 Tables and TableModels
- •12.4.4 Documents and Editors
- •12.4.5 Custom Components
- •12.5 Finishing Touches
- •12.5.1 The Mandelbrot Set
- •12.5.2 Design of the Program
- •12.5.3 Internationalization
- •12.5.4 Events, Events, Events
- •12.5.5 Custom Dialogs
- •12.5.6 Preferences
- •Exercises for Chapter 12
- •Quiz on Chapter 12
- •Appendix: Source Files
Exercises |
600 |
|
Exercises for Chapter 11 |
|
|
1. The sample program DirectoryList.java, given as an example in Subsection 11.2.2, will |
(solution) |
|
print a list of files in a directory specified by the user. But some of the files in that |
|
|
directory might themselves be directories. And the subdirectories can themselves contain |
|
|
directories. And so on. Write a modified version of DirectoryList that will list all the |
|
|
files in a directory and all its subdirectories, to any level of nesting. You will need a |
|
|
recursive subroutine to do the listing. The subroutine should have a parameter of type |
|
|
File. You will need the constructor from the File class that has the form |
|
|
public File( File dir, String fileName ) |
|
|
// Constructs the File object representing a file |
|
|
// named fileName in the directory specified by dir. |
|
|
2. Write a program that will count the number of lines in each file that is specified on the |
(solution) |
|
command line. Assume that the files are text files. Note that multiple files can be specified, |
|
|
as in: |
|
|
java LineCounts file1.txt file2.txt file3.txt |
|
|
Write each file name, along with the number of lines in that file, to standard output. If an |
|
|
error occurs while trying to read from one of the files, you should print an error message |
|
|
for that file, but you should still process all the remaining files. Do not use TextIO to |
|
|
process the files; use a FileReader to access each file. |
|
|
3. For this exercise, you will write a network server program. The program is a simple file |
(solution) |
|
server that makes a collection of files available for transmission to clients. When the server |
|
|
starts up, it needs to know the name of the directory that contains the collection of files. |
|
|
This information can be provided as a command-line argument. You can assume that the |
|
|
directory contains only regular files (that is, it does not contain any sub-directories). You |
|
|
can also assume that all the files are text files. |
|
|
When a client connects to the server, the server first reads a one-line command from |
|
|
the client. The command can be the string “index”. In this case, the server responds by |
|
|
sending a list of names of all the files that are available on the server. Or the command |
|
|
can be of the form “get filename”, where filename is a file name. The server checks |
|
|
whether the requested file actually exists. If so, it first sends the word “ok” as a message |
|
|
to the client. Then it sends the contents of the file and closes the connection. Otherwise, |
|
|
it sends the word “error” to the client and closes the connection. |
|
|
Ideally, your server should start a separate thread to handle each connection request. |
|
|
However, if you don’t want to deal with threads you can just call a subroutine to handle the |
|
|
request. See the DirectoryList example in Subsection 11.2.2 for help with the problem |
|
|
of getting the list of files in the directory. |
|
|
4. Write a client program for the server from Exercise 11.3. Design a user interface that will |
(solution) |
|
let the user do at least two things: (1) Get a list of files that are available on the server |
|
|
and display the list on standard output; and (2) Get a copy of a specified file from the |
|
|
server and save it to a local file (on the computer where the client is running). |
|
|
5. The sample program PhoneDirectoryFileDemo.java, from Subsection 11.3.2, |
stores |
(solution) |
Exercises |
601 |
name/number pairs for a simple phone book in a text file in the user’s home directory. Modify that program so that is uses an XML format for the data. The only significant changes that you will have to make are to the parts of the program that read and write the data file. Use the DOM to read the data, as discussed in Subsection 11.6.3. You can use the XML format illustrated in the following sample phone directory file:
<?xml version="1.0"?> <phone directory>
<entry name=’barney’ number=’890-1203’/> <entry name=’fred’ number=’555-9923’/>
</phone directory>
(This is just an easy exercise in simple XML processing; as before, the program in this exercise is not meant to be a useful phone directory program.)
6.The sample program Checkers.java from Subsection 7.5.3 lets two players play checkers. (solution) It would be nice if, in the middle of a game, the state of the game could be saved to a file.
Later, the file could be read back into the file to restore the game and allow the players to continue. Add the ability to save and load files to the checkers program. Design a simple text-based format for the files. Here is a picture of my solution to this exercise, just after a file has been loaded into the program:
Note: The original checkers program could be run as either an applet or a stand-alone application. Since the new version uses files, however, it can only be run as an application. An applet running in a web browser is not allowed to access files.
It’s a little tricky to completely restore the state of a game. The program has a variable board of type CheckersData that stores the current contents of the board, and it has a variable currentPlayer of type int that indicates whether Red or Black is currently moving. This data must be stored in the file when a file is saved. When a file is read into the program, you should read the data into two local variables newBoard of type CheckersData and newCurrentPlayer of type int. Once you have successfully read all the data from the file, you can use the following code to set up the program state correctly. This code assumes that you have introduced two new variables saveButton and loadButton of type JButton to represent the “Save Game” and “Load Game” buttons:
Exercises |
602 |
board = newBoard; // Set up game with data read from file. currentPlayer = newCurrentPlayer;
legalMoves = board.getLegalMoves(currentPlayer); selectedRow = -1;
gameInProgress = true; newGameButton.setEnabled(false); loadButton.setEnabled(false); saveButton.setEnabled(true); resignButton.setEnabled(true);
if (currentPlayer == CheckersData.RED) message.setText("Game loaded -- it’s RED’s move.");
else
message.setText("Game loaded -- it’s BLACK’s move."); repaint();
(Note, by the way, that I used a TextReader to read the data from the file into my program. TextReader is a non-standard class introduced in Subsection 11.1.4 and defined in the file TextReader.java. How to read the data in a file depends, of course, on the format that you have chosen for the data.)
Quiz |
603 |
Quiz on Chapter 11
(answers)
1.In Java, input/output is done using streams. Streams are an abstraction. Explain what this means and why it is important.
2.Java has two types of streams: character streams and byte streams. Why? What is the di erence between the two types of streams?
3.What is a file? Why are files necessary?
4.What is the point of the following statement?
out = new PrintWriter( new FileWriter("data.dat") );
Why would you need a statement that involves two di erent stream classes, PrintWriter and FileWriter ?
5.The package java.io includes a class named URL. What does an object of type URL represent, and how is it used?
6.Explain what is meant by the client / server model of network communication.
7.What is a socket ?
8.What is a ServerSocket and how is it used?
9.Network server programs are often multithreaded. Explain what this means and why it is true.
10.What is meant by an element in an XML document?
11.What is it about XML that makes it suitable for representing almost any type of data?
12.Write a complete program that will display the first ten lines from a text file. The lines should be written to standard output, System.out. The file name is given as the commandline argument args[0]. You can assume that the file contains at least ten lines. Don’t bother to make the program robust. Do not use TextIO to process the file; use a FileReader to access the file.
