I downloaded HotJava and began to play with it. At first I wasn't sure about this newfangled
language, which looked like a mangled C/C++. I wrote test and demo programs, sticking them a
few at a time into a directory that I called javasrcto keep it separate from my C source (as often
the programs would have the same name). And as I learned more about Java, I began to see its
advantagesfor many kinds of work, such as the automatic memory reclaim and the elimination of
pointer calculations. The javasrcdirectory kept growing. I wrote a Java course for Learning Tree,
and the directory kept growing faster, reaching the point where it needed subdirectories. Even
then, it became increasingly difficult to find things, and it soon became evident that some kind of
documentation was needed.
In a sense, this book is the result of a high-speed collision between my javasrcdirectory and a
documentation framework established for another newcomer language. In O'Reilly'sPerl
Cookbook,Tom Christiansen and Nathan Torkington worked out a very successful design,
presenting the material in small, focused articles called "recipes." The original model for such a
book is, of course, the familiar kitchen cookbook. There is a long history of using the term
"cookbook" to refer to an enumeration of how-to recipes relating to computers. On the software
side, Donald Knuth applied the "cookbook" analogy to his book The Art of Computer
Programming(Addison Wesley), first published in 1968. On the hardware side, Don Lancaster
wrote The TTL Cookbook(Sams). (Transistor-transistor logic, or TTL, was the small-scale
building block of electronic circuits at the time.) Tom and Nathan worked out a successful
variation on this, and I recommend their book for anyone who wishes to, as they put it, "learn
more Perl." Indeed, the work you are now reading intends to be a book for the person who wishes
to "learn more Java."
The code in each recipe is intended to be self-contained; feel free to borrow bits and pieces of
any of it for use in your own projects.
711 trang |
Chia sẻ: ttlbattu | Lượt xem: 2534 | Lượt tải: 4
Bạn đang xem trước 20 trang tài liệu Ebook Java Cookbook, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Copyright
Table of Contents
Index
Full Description
About the Author
Reviews
Reader reviews
Errata
Java Cookbook
Ian Darwin
Publisher: O'Reilly
First Edition June 2001
ISBN: 0-59600-170-3, 882 pages
This book offers Java developers short, focused pieces of code that
are easy to incorporate into other programs. The idea is to focus on
things that are useful, tricky, or both. The book's code segments
cover all of the dominant APIs and should serve as a great "jumping-
off place" for Java developers who want to get started in areas
outside their specialization.
Java Cookbook
Preface
Who This Book Is For
What's in This Book?
Platform Notes
Other Books
Conventions Used in This Book
Comments and Questions
Getting the Source Code
Acknowledgments
1. Getting Started: Compiling, Running, and Debugging
1.1 Introduction
1.2 Compiling and Running Java: JDK
1.3 Editing and Compiling with a Color-Highlighting Editor
1.4 Compiling, Running, and Testing with an IDE
1.5 Using Classes from This Book
1.6 Automating Compilation with jr
1.7 Automating Compilation with make
1.8 Automating Compilation with Ant
1.9 Running Applets
1.10 Dealing with Deprecation Warnings
1.11 Conditional Debugging without #ifdef
1.12 Debugging Printouts
1.13 Using a Debugger
1.14 Unit Testing: Avoid the Need for Debuggers
1.15 Decompiling Java Class Files
1.16 Preventing Others from Decompiling Your Java Files
1.17 Getting Readable Tracebacks
1.18 Finding More Java Source Code
1.19 Program: Debug
2. Interacting with the Environment
2.1 Introduction
2.2 Getting Environment Variables
2.3 System Properties
2.4 Writing JDK Release-Dependent Code
2.5 Writing Operating System-Dependent Code
2.6 Using CLASSPATH Effectively
2.7 Using Extensions or Other Packaged APIs
2.8 Parsing Command-Line Arguments
3. Strings and Things
3.1 Introduction
3.2 Taking Strings Apart with Substrings
3.3 Taking Strings Apart with StringTokenizer
3.4 Putting Strings Together with + and StringBuffer
3.5 Processing a String One Character at a Time
3.6 Aligning Strings
3.7 Converting Between Unicode Characters and Strings
3.8 Reversing a String by Word or Character
3.9 Expanding and Compressing Tabs
3.10 Controlling Case
3.11 Indenting Text Documents
3.12 Entering Non-Printable Characters
3.13 Trimming Blanks from the End of a String
3.14 Parsing Comma-Separated Data
3.15 Program: A Simple Text Formatter
3.16 Program: Soundex Name Comparisons
4. Pattern Matching with Regular Expressions
4.1 Introduction
4.2 Regular Expression Syntax
4.3 How REs Work in Practice
4.4 Using Regular Expressions in Java
4.5 Testing REs Interactively
4.6 Finding the Matching Text
4.7 Replacing the Matching Text
4.8 Printing All Occurrences of a Pattern
4.9 Printing Lines Containing a Pattern
4.10 Controlling Case in match( ) and subst( )
4.11 Precompiling the RE
4.12 Matching Newlines in Text
4.13 Program: Data Mining
4.14 Program: Full Grep
5. Numbers
5.1 Introduction
5.2 Checking Whether a String Is a Valid Number
5.3 Storing a Larger Number in a Smaller
5.4 Taking a Fraction of an Integer Without Using Floating Point
5.5 Ensuring the Accuracy of Floating-Point Numbers
5.6 Comparing Floating-Point Numbers
5.7 Rounding Floating-Point Numbers
5.8 Formatting Numbers
5.9 Converting Between Binary, Octal, Decimal, and Hexadecimal
5.10 Operating on a Series of Integers
5.11 Working with Roman Numerals
5.12 Formatting with Correct Plurals
5.13 Generating Random Numbers
5.14 Generating Better Random Numbers
5.15 Calculating Trigonometric Functions
5.16 Taking Logarithms
5.17 Multiplying Matrixes
5.18 Using Complex Numbers
5.19 Handling Very Large Numbers
5.20 Program: TempConverter
5.21 Program: Number Palindromes
6. Dates and Times
6.1 Introduction
6.2 Finding Today's Date
6.3 Printing Date/Time in a Specified Format
6.4 Representing Dates in Other Epochs
6.5 Converting YMDHMS to a Calendar or Epoch Seconds
6.6 Parsing Strings into Dates
6.7 Converting Epoch Seconds to DMYHMS
6.8 Adding to or Subtracting from a Date or Calendar
6.9 Difference Between Two Dates
6.10 Comparing Dates
6.11 Day of Week/Month/Year or Week Number
6.12 Calendar Page
6.13 High-Resolution Timers
6.14 Sleeping for a While
6.15 Program: Reminder Service
7. Structuring Data with Java
7.1 Introduction
7.2 Data Structuring Using Arrays
7.3 Resizing an Array
7.4 Like an Array, but More Dynamic
7.5 Data-Independent Access with Iterators
7.6 Structuring Data in a Linked List
7.7 Mapping with Hashtable and HashMap
7.8 Storing Strings in Properties and Preferences
7.9 Sorting a Collection
7.10 Sorting in Java 1.1
7.11 Avoiding the Urge to Sort
7.12 Sets
7.13 Finding an Object in a Collection
7.14 Converting a Collection to an Array
7.15 Rolling Your Own Iterator
7.16 Stack
7.17 Multidimensional Structures
7.18 Finally, Collections
7.19 Program: Timing Comparisons
8. Object-Oriented Techniques
8.1 Introduction
8.2 Printing Objects: Formatting with toString( )
8.3 Overriding the Equals Method
8.4 Overriding the Hashcode Method
8.5 The Clone Method
8.6 The Finalize Method
8.7 Using Inner Classes
8.8 Providing Callbacks via Interfaces
8.9 Polymorphism/Abstract Methods
8.10 Passing Values
8.11 Roll Your Own Exceptions
8.12 Program: Plotter
9. Input and Output
9.1 Introduction
9.2 Reading Standard Input
9.3 Writing Standard Output
9.4 Opening a File by Name
9.5 Copying a File
9.6 Reading a File into a String
9.7 Reassigning the Standard Streams
9.8 Duplicating a Stream as It Is Written
9.9 Reading/Writing a Different Character Set
9.10 Those Pesky End-of-Line Characters
9.11 Beware Platform-Dependent File Code
9.12 Reading "Continued" Lines
9.13 Scanning a File
9.14 Binary Data
9.15 Seeking
9.16 Writing Data Streams from C
9.17 Saving and Restoring Serialized Objects
9.18 Preventing ClassCastExceptions with SerialVersionUID
9.19 Reading and Writing JAR or Zip Archives
9.20 Reading and Writing Compressed Files
9.21 Program: Text to PostScript
9.22 Program: TarList (File Converter)
10. Directory and Filesystem Operations
10.1 Introduction
10.2 Getting File Information
10.3 Creating a File
10.4 Renaming a File
10.5 Deleting a File
10.6 Creating a Transient File
10.7 Changing File Attributes
10.8 Listing a Directory
10.9 Getting the Directory Roots
10.10 Making New Directories
10.11 Program: Find
11. Programming Serial and Parallel Ports
11.1 Introduction
11.2 Choosing a Port
11.3 Opening a Serial Port
11.4 Opening a Parallel Port
11.5 Resolving Port Conflicts
11.6 Reading and Writing: Lock Step
11.7 Reading and Writing: Event-Driven
11.8 Reading and Writing: Threads
11.9 Program: Penman Plotter
12. Graphics and Sound
12.1 Introduction
12.2 Painting with a Graphics Object
12.3 Testing Graphical Components
12.4 Drawing Text
12.5 Drawing Centered Text in a Component
12.6 Drawing a Drop Shadow
12.7 Drawing an Image
12.8 Playing a Sound File
12.9 Displaying a Moving Image with Video
12.10 Drawing Text with 2D
12.11 Printing: JDK 1.1
12.12 Printing: Java 2
12.13 Program: PlotterAWT
12.14 Program: Grapher
13. Graphical User Interfaces
13.1 Introduction
13.2 Displaying GUI Components
13.3 Designing a Window Layout
13.4 A Tabbed View of Life
13.5 Action Handling: Making Buttons Work
13.6 Action Handling Using Anonymous Inner Classes
13.7 Terminating a Program with "Window Close"
13.8 Dialogs: When Later Just Won't Do
13.9 Getting Program Output into a Window
13.10 Choosing a File with JFileChooser
13.11 Choosing a Color
13.12 Centering a Main Window
13.13 Changing a Swing Program's Look and Feel
13.14 Program: Custom Font Chooser
13.15 Program: Custom Layout Manager
14. Internationalization and Localization
14.1 Introduction
14.2 Creating a Button with I18N Resources
14.3 Listing Available Locales
14.4 Creating a Menu with I18N Resources
14.5 Writing Internationalization Convenience Routines
14.6 Creating a Dialog with I18N Resources
14.7 Creating a Resource Bundle
14.8 JILTing Your Code
14.9 Using a Particular Locale
14.10 Setting the Default Locale
14.11 Formatting Messages
14.12 Program: MenuIntl
14.13 Program: BusCard
15. Network Clients
15.1 Introduction
15.2 Contacting a Server
15.3 Finding and Reporting Network Addresses
15.4 Handling Network Errors
15.5 Reading and Writing Textual Data
15.6 Reading and Writing Binary Data
15.7 Reading and Writing Serialized Data
15.8 UDP Datagrams
15.9 Program: TFTP UDP Client
15.10 Program: Telnet Client
15.11 Program: Chat Client
16. Server-Side Java: Sockets
16.1 Introduction
16.2 Opening a Server for Business
16.3 Returning a Response (String or Binary)
16.4 Returning Object Information
16.5 Handling Multiple Clients
16.6 Network Logging
16.7 Program: A Java Chat Server
17. Network Clients II: Applets and Web Clients
17.1 Introduction
17.2 Embedding Java in a Web Page
17.3 Applet Techniques
17.4 Contacting a Server on the Applet Host
17.5 Making an Applet Show a Document
17.6 Making an Applet Run a CGI Script
17.7 Reading the Contents of a URL
17.8 Extracting HTML from a URL
17.9 Extracting URLs from a File
17.10 Converting a Filename to a URL
17.11 Program: MkIndex
17.12 Program: LinkChecker
18. Web Server Java: Servlets and JSP
18.1 Introduction
18.2 First Servlet: Generating an HTML Page
18.3 Servlets: Processing Form Parameters
18.4 Cookies
18.5 Session Tracking
18.6 Generating PDF from a Servlet
18.7 HTML Meets Java: JSP
18.8 JSP Include/Forward
18.9 JavaServer Pages Using a Servlet
18.10 Simplifying Your JSP with a JavaBean
18.11 JSP Syntax Summary
18.12 Program: CookieCutter
18.13 Program: JabaDot Web News Portal
19. Java and Electronic Mail
19.1 Introduction
19.2 Sending Email: Browser Version
19.3 Sending Email: For Real
19.4 Mail-Enabling a Server Program
19.5 Sending MIME Mail
19.6 Providing Mail Settings
19.7 Sending Mail Without Using JavaMail
19.8 Reading Email
19.9 Program: MailReaderBean
19.10 Program: MailClient
20. Database Access
20.1 Introduction
20.2 Text-File Databases
20.3 DBM Databases
20.4 JDBC Setup and Connection
20.5 Connecting to a JDBC Database
20.6 Sending a JDBC Query and Getting Results
20.7 Using JDBC Parameterized Statements
20.8 Using Stored Procedures with JDBC
20.9 Changing Data Using a ResultSet
20.10 Changing Data Using SQL
20.11 Finding JDBC Metadata
20.12 Program: JDAdmin
21. XML
21.1 Introduction
21.2 Transforming XML with XSLT
21.3 Parsing XML with SAX
21.4 Parsing XML with DOM
21.5 Verifying Structure with a DTD
21.6 Generating Your Own XML with DOM
21.7 Program: xml2mif
22. Distributed Java: RMI
22.1 Introduction
22.2 Defining the RMI Contract
22.3 RMI Client
22.4 RMI Server
22.5 Deploying RMI Across a Network
22.6 Program: RMI Callbacks
22.7 Program: RMIWatch
23. Packages and Packaging
23.1 Introduction
23.2 Creating a Package
23.3 Documenting Classes with Javadoc
23.4 Archiving with jar
23.5 Running an Applet from a JAR
23.6 Running an Applet with a JDK
23.7 Running a Program from a JAR
23.8 Preparing a Class as a JavaBean
23.9 Pickling Your Bean into a JAR
23.10 Packaging a Servlet into a WAR File
23.11 "Write Once, Install Anywhere"
23.12 Java Web Start
23.13 Signing Your JAR File
24. Threaded Java
24.1 Introduction
24.2 Running Code in a Different Thread
24.3 Displaying a Moving Image with Animation
24.4 Stopping a Thread
24.5 Rendezvous and Timeouts
24.6 Thread Communication: Synchronized Code
24.7 Thread Communication: wait( ) and notifyAll( )
24.8 Background Saving in an Editor
24.9 Threaded Network Server
25. Introspection, or "A Class Named Class"
25.1 Introduction
25.2 Getting a Class Descriptor
25.3 Finding and Using Methods and Fields
25.4 Loading and Instantiating a Class Dynamically
25.5 Constructing a Class from Scratch
25.6 Performance Timing
25.7 Printing Class Information
25.8 Program: CrossRef
25.9 Program: AppletViewer
26. Using Java with Other Languages
26.1 Introduction
26.2 Running a Program
26.3 Running a Program and Capturing Its Output
26.4 Mixing Java and Scripts with BSF
26.5 Blending in Native Code (C/C++)
26.6 Calling Java from Native Code
26.7 Program: DBM
27. Afterword
Colophon
Preface
If you know a little Java™, great. If you know more Java, even better! This book is ideal for
anyone who knows some Java and wants to learn more.
I started programming in C in 1980 while working at the University of Toronto, and C served me
quite well through the 1980s and into the 1990s. In 1995, as the nascent language Oak was
being renamed Java, I had the good fortune to be told about it by my colleague J. Greg Davidson.
I sent an email to the address Greg provided, and got this mail back:
From scndprs n.Eng.Sun.COM!jag Wed Mar 29 19:43:54 1995
Date: Wed, 29 Mar 1995 16:47:51 +0800
From: jag@scndprsn.Eng.Sun.COM (James Gosling)
To: ian@scooter.Canada.Sun.COM, ian@darwinsys.com
Subject: Re: WebRunner
Cc: goltz@sunne.East.Sun.COM
Content - Length: 361
Status : RO
X- Lines: 9
> Hi. A friend told me about WebRunner(?), your extensible network
> browser. It and Oak(?) its extention language, sounded neat. Can
> you please tell me if it's available for play yet, and/or if any
> papers on it are available for FTP?
Check out
(oak got renamed to java and webrunner got renamed to
hotjava to keep the lawyers happy)
I downloaded HotJava and began to play with it. At first I wasn't sure about this newfangled
language, which looked like a mangled C/C++. I wrote test and demo programs, sticking them a
few at a time into a directory that I called j vasrc to keep it separate from my C source (as often
the programs would have the same name). And as I learned more about Java, I began to see its
advantages for many kinds of work, such as the automatic memory reclaim and the elimination of
pointer calculations. The javasrc directory kept growing. I wrote a Java course for Learning Tree,
and the directory kept growing faster, reaching the point where it needed subdirectories. Even
then, it became increasingly difficult to find things, and it soon became evident that some kind of
documentation was needed.
In a sense, this book is the result of a high-speed collision between my javasrc directory and a
documentation framework established for another newcomer language. In O'Reilly's Perl
Cookbook, Tom Christiansen and Nathan Torkington worked out a very successful design,
presenting the material in small, focused articles called "recipes." The original model for such a
book is, of course, the familiar kitchen cookbook. There is a long history of using the term
"cookbook" to refer to an enumeration of how-to recipes relating to computers. On the software
side, Donald Knuth applied the "cookbook" analogy to his book The Art of Computer
Programming (Addison Wesley), first published in 1968. On the hardware side, Don Lancaster
wrote The TTL Cookbook (Sams). (Transistor-t ansistor logic, or TTL, was the small-scale
building block of electronic circuits at the time.) Tom and Nathan worked out a successful
variation on this, and I recommend their book for anyone who wishes to, as they put it, "learn
more Perl." Indeed, the work you are now reading intends to be a book for the person who wishes
to "learn more Java."
The code in each recipe is intended to be self-contained; feel free to borrow bits and pieces of
any of it for use in your own projects.
Who This Book Is For
I'm going to assume that you know the basics of Java. I won't tell you how to println a string
and a number at the same time, or how to write a class that extends Applet and prints your
name in the window. I'll presume you've taken a Java course or studied an introductory book
such as O'Reilly's Learning Java or Java in a Nutshell. However, Chapter 1 covers some
techniques that you might not know very well and that are necessary to understand some of the
later material. Feel free to skip around! Both the printed version of the book and the (eventual)
electronic copy are heavily cross-referenced.
What's in This Book?
Unlike my Perl colleagues Tom and Nathan, I don't have to spend as much time on the oddities
and idioms of the language; Java is refreshingly free of strange quirks. But that doesn't mean it's
trivial to learn well! If it were, there'd be no need for this book. My main approach, then, is to
concentrate on the Java APIs: I'll teach you by example what the APIs are and what they are
good for.
Like Perl, Java is a language that grows on you and with you. And, I confess, I use Java most of
the time nowadays. Things I'd once done in C are now -- except for device drivers and legacy
systems -- done in Java.
But Java is suited to a different range of tasks than Perl. Perl (and other scripting languages such
as awk and Python) are particularly suited to the "one-liner" utility task. As Tom and Nathan
show, Perl excels at things like printing the 42nd line from a file. While it can certainly do these
things, Java, because it is a compiled, object-oriented language, seems more suited to
"development in the large" or enterprise applications development. Indeed, much of the API
material added in Java 2 was aimed at this type of development. However, I will necessarily
illustrate many techniques with shorter examples and even code fragments. Be assured that
every line of code you see here has been compiled and run.
Many of the longer examples in this book are tools that I originally wrote to automate some
mundane task or another. For example, MkIndex (described in Chapter 1) reads the top-level
directory of the place where I keep all my Java example source code and builds a browser-
friendly index.html file for that directory. For another example, the body of the book itself was
partly composed in XML, a recent simplification that builds upon a decade of experience in SGML
(the parent standard that led to the tag-based syntax of HTML). It is not clear at this point if XML
will primarily be useful as a publishing format or as a data manipulation format, or if its prevalence
will further blur that distinction, though it seems that the blurring of distinctions is more likely.
However, I used XML here to type in and mark up the original text of some of the chapters of this
book. The text was then converted to FrameMaker input by the XmlForm program. This program
also handles -- by use of another program, GetMark -- full and partial code insertions from the
source directory. XmlForm is discussed in Chapter 21.
Let's go over the organization of this book. I start off Chapter 1 by describing some methods of
compiling your program on different platforms, running them in different environments (browser,
command line, windowed desktop), and debugging. Chapter 2 moves from compiling and
running your program to getting it to adapt to the surrounding countryside -- the other programs
that live in your computer.
The next few chapters deal with basic APIs. Chapter 3 concentrates on on