-------------------------------------------------

±¾½Ì³ÌÓÉyyc,spiritÕûÀí

-------------------------------------------------


µÚ10Õ Java IOϵͳ

¡°¶ÔÓïÑÔÉè¼ÆÈËÔ±À´Ëµ£¬´´½¨ºÃµÄÊäÈ룯Êä³öϵͳÊÇÒ»ÏîÌØ±ðÀ§ÄѵÄÈÎÎñ¡£¡±

ÓÉÓÚ´æÔÚ´óÁ¿²»Í¬µÄÉè¼Æ·½°¸£¬ËùÒÔ¸ÃÈÎÎñµÄÀ§ÄÑÐÔÊǺÜÈÝÒ×Ö¤Ã÷µÄ¡£ÆäÖÐ×î´óµÄÌôÕ½ËÆºõÊÇÈçºÎ¸²¸ÇËùÓпÉÄܵÄÒòËØ¡£²»½öÓÐÈýÖÖ²»Í¬µÄÖÖÀàµÄIOÐèÒª¿¼ÂÇ£¨Îļþ¡¢¿ØÖÆÌ¨¡¢ÍøÂçÁ¬½Ó£©£¬¶øÇÒÐèҪͨ¹ý´óÁ¿²»Í¬µÄ·½Ê½ÓëËüÃÇͨÐÅ£¨Ë³Ðò¡¢Ëæ»ú·ÃÎÊ¡¢¶þ½øÖÆ¡¢×Ö·û¡¢°´ÐС¢°´×ֵȵȣ©¡£
Java¿âµÄÉè¼ÆÕßͨ¹ý´´½¨´óÁ¿ÀàÀ´¹¥¿ËÕâ¸öÄÑÌâ¡£ÊÂʵÉÏ£¬JavaµÄIOϵͳ²ÉÓÃÁËÈç´Ë¶àµÄÀ࣬ÒÔÖ¸տªÊ¼»á²úÉú²»Öª´ÓºÎ´¦ÈëÊֵĸоõ£¨¾ßÓзí´ÌÒâζµÄÊÇ£¬JavaµÄIOÉè¼Æ³õÖÔʵ¼ÊÒªÇó±ÜÃâ¹ý¶àµÄÀࣩ¡£´ÓJava 1.0Éý¼¶µ½Java 1.1ºó£¬IO¿âµÄÉè¼ÆÒ²·¢ÉúÁËÏÔÖøµÄ±ä»¯¡£´Ëʱ²¢·Ç¼òµ¥µØÓÃпâÌæ»»¾É¿â£¬SunµÄÉè¼ÆÈËÔ±¶ÔÔ­À´µÄ¿â½øÐÐÁË´óÊֱʵÄÀ©Õ¹£¬Ìí¼ÓÁË´óÁ¿ÐµÄÄÚÈÝ¡£Òò´Ë£¬ÎÒÃÇÓÐʱ²»µÃ²»»ìºÏʹÓÃпâÓë¾É¿â£¬²úÉúÁîÈËÎÞÄεĸ´ÔÓ´úÂë¡£
±¾Õ½«°ïÖú´ó¼ÒÀí½â±ê×¼Java¿âÄڵĸ÷ÖÖIOÀ࣬²¢Ñ§Ï°ÈçºÎʹÓÃËüÃÇ¡£±¾ÕµĵÚÒ»²¿·Ö½«½éÉÜ¡°¾É¡±µÄJava 1.0 IOÁ÷¿â£¬ÒòΪÏÖÔÚÓдóÁ¿´úÂëÈÔÔÚʹÓÃÄǸö¿â¡£±¾ÕÂʣϵIJ¿·Ö½«Îª´ó¼ÒÒýÈëJava 1.1 IO¿âµÄһЩÐÂÌØÐÔ¡£×¢ÒâÈôÓÃJava 1.1±àÒëÆ÷À´±àÒë±¾ÕµÚÒ»²¿·Ö½éÉܵIJ¿·Ö´úÂ룬¿ÉÄÜ»áµÃµ½Ò»Ìõ¡°²»½¨ÒéʹÓøÃÌØÐÔ¡±£¨Deprecated feature£©¾¯¸æÏûÏ¢¡£´úÂëÈÔÈ»Äܹ»Ê¹Óã»±àÒëÆ÷Ö»Êǽ¨ÒéÎÒÃÇ»»Óñ¾ÕºóÃæÒª½²ÊöµÄһЩÐÂÌØÐÔ¡£µ«ÎÒÃÇÕâÑù×öÊÇÓмÛÖµµÄ£¬ÒòΪ¿ÉÒÔ¸üÇå³þµØÈÏʶÀÏ·½·¨Óëз½·¨Ö®¼äµÄһЩ²îÒ죬´Ó¶ø¼ÓÉîÎÒÃǵÄÀí½â£¨²¢¿É˳ÀûÔĶÁΪJava 1.0дµÄ´úÂ룩¡£

10.1 ÊäÈëºÍÊä³ö
¿É½«Java¿âµÄIOÀà·Ö¸îΪÊäÈëÓëÊä³öÁ½¸ö²¿·Ö£¬ÕâÒ»µãÔÚÓÃWebä¯ÀÀÆ÷ÔĶÁÁª»úJavaÀàÎĵµÊ±±ã¿ÉÖªµÀ¡£Í¨¹ý¼Ì³Ð£¬´ÓInputStream£¨ÊäÈëÁ÷£©ÑÜÉúµÄËùÓÐÀà¶¼ÓµÓÐÃûΪread()µÄ»ù±¾·½·¨£¬ÓÃÓÚ¶ÁÈ¡µ¥¸ö×Ö½Ú»òÕß×Ö½ÚÊý×é¡£ÀàËÆµØ£¬´ÓOutputStreamÑÜÉúµÄËùÓÐÀà¶¼ÓµÓлù±¾·½·¨write()£¬ÓÃÓÚдÈëµ¥¸ö×Ö½Ú»òÕß×Ö½ÚÊý×顣Ȼ¶ø£¬ÎÒÃÇͨ³£²»»áÓõ½ÕâЩ·½·¨£»ËüÃÇÖ®ËùÒÔ´æÔÚ£¬ÊÇÒòΪ¸ü¸´ÔÓµÄÀà¿ÉÒÔÀûÓÃËüÃÇ£¬ÒÔ±ãÌṩһ¸ö¸üÓÐÓõĽӿڡ£Òò´Ë£¬ÎÒÃǺÜÉÙÓõ¥¸öÀà´´½¨×Ô¼ºµÄϵͳ¶ÔÏó¡£Ò»°ãÇé¿öÏ£¬ÎÒÃǶ¼Êǽ«¶à¸ö¶ÔÏóÖØµþÔÚÒ»Æð£¬Ìṩ×Ô¼ºÆÚÍûµÄ¹¦ÄÜ¡£ÎÒÃÇÖ®ËùÒԸе½JavaµÄÁ÷¿â£¨Stream Library£©Òì³£¸´ÔÓ£¬ÕýÊÇÓÉÓÚΪÁË´´½¨µ¥¶ÀÒ»¸ö½á¹ûÁ÷£¬È´ÐèÒª´´½¨¶à¸ö¶ÔÏóµÄÔµ¹Ê¡£
ºÜÓбØÒª°´ÕÕ¹¦ÄܶÔÀà½øÐзÖÀà¡£¿âµÄÉè¼ÆÕßÊ×ÏȾö¶¨ÓëÊäÈëÓйصÄËùÓÐÀà¶¼´ÓInputStream¼Ì³Ð£¬¶øÓëÊä³öÓйصÄËùÓÐÀà¶¼´ÓOutputStream¼Ì³Ð¡£

10.1.1 InputStreamµÄÀàÐÍ
InputStreamµÄ×÷ÓÃÊDZêÖ¾ÄÇЩ´Ó²»Í¬ÆðÔ´µØ²úÉúÊäÈëµÄÀà¡£ÕâЩÆðÔ´µØ°üÀ¨£¨Ã¿¸ö¶¼ÓÐÒ»¸öÏà¹ØµÄInputStream×ÓÀࣩ£º
(1) ×Ö½ÚÊý×é
(2) String¶ÔÏó
(3) Îļþ
(4) ¡°¹ÜµÀ¡±£¬ËüµÄ¹¤×÷Ô­ÀíÓëÏÖʵÉú»îÖеĹܵÀÀàËÆ£º½«Ò»Ð©¶«Î÷ÖÃÈëÒ»¶Ë£¬ËüÃÇÔÚÁíÒ»¶Ë³öÀ´¡£ (5) һϵÁÐÆäËûÁ÷£¬ÒÔ±ãÎÒÃǽ«ÆäͳһÊÕ¼¯µ½µ¥¶ÀÒ»¸öÁ÷ÄÚ¡£
(6) ÆäËûÆðÔ´µØ£¬ÈçInternetÁ¬½ÓµÈ£¨½«ÔÚ±¾ÊéºóÃæµÄ²¿·Ö½²Êö£©¡£

³ý´ËÒÔÍ⣬FilterInputStreamÒ²ÊôÓÚInputStreamµÄÒ»ÖÖÀàÐÍ£¬ÓÃËü¿ÉΪ¡°ÆÆ»µÆ÷¡±ÀàÌṩһ¸ö»ù´¡À࣬ÒԱ㽫ÊôÐÔ»òÕßÓÐÓõĽӿÚͬÊäÈëÁ÷Á¬½Óµ½Ò»Æð¡£Õ⽫ÔÚÒÔºóÌÖÂÛ¡£

Class

Function

Constructor Arguments

How to use it

ByteArray-InputStream

Allows a buffer in memory to be used as an InputStream.

The buffer from which to extract the bytes.

As a source of data. Connect it to a FilterInputStream object to provide a useful interface.

StringBuffer-InputStream

Converts a String into an InputStream.

A String. The underlying implementation actually uses a StringBuffer.

As a source of data. Connect it to a FilterInputStream object to provide a useful interface.

File-InputStream

For reading information from a file.

A String representing the file name, or a File or FileDescriptor object.

As a source of data. Connect it to a FilterInputStream object to provide a useful interface.


Àà ¹¦ÄÜ ¹¹½¨Æ÷²ÎÊý£¯ÈçºÎʹÓÃ

ByteArrayInputStream ÔÊÐíÄÚ´æÖеÄÒ»¸ö»º³åÇø×÷ΪInputStreamʹÓà ´ÓÖÐÌáÈ¡×ֽڵĻº³åÇø£¯×÷Ϊһ¸öÊý¾ÝԴʹÓá£Í¨¹ý½«Æäͬһ¸öFilterInputStream¶ÔÏóÁ¬½Ó£¬¿ÉÌṩһ¸öÓÐÓõĽӿÚ
StringBufferInputStream ½«Ò»¸öStringת»»³ÉInputStream Ò»¸öString£¨×Ö´®£©¡£»ù´¡µÄʵʩ·½°¸Êµ¼Ê²ÉÓÃÒ»¸öStringBuffer£¨×Ö´®»º³å£©£¯×÷Ϊһ¸öÊý¾ÝԴʹÓá£Í¨¹ý½«Æäͬһ¸öFilterInputStream¶ÔÏóÁ¬½Ó£¬¿ÉÌṩһ¸öÓÐÓõĽӿÚ
FileInputStream ÓÃÓÚ´ÓÎļþ¶ÁÈ¡ÐÅÏ¢ ´ú±íÎļþÃûµÄÒ»¸öString£¬»òÕßÒ»¸öFile»òFileDescriptor¶ÔÏó£¯×÷Ϊһ¸öÊý¾ÝԴʹÓá£Í¨¹ý½«Æäͬһ¸öFilterInputStream¶ÔÏóÁ¬½Ó£¬¿ÉÌṩһ¸öÓÐÓõĽӿÚ

Piped-InputStream

Produces the data that’s being written to the associated PipedOutput-Stream. Implements the “piping” concept.

PipedOutputStream

As a source of data in multithreading. Connect it to a FilterInputStream object to provide a useful interface.

Sequence-InputStream

Coverts two or more InputStream objects into a single InputStream.

Two InputStream objects or an Enumeration for a container of InputStream objects.

As a source of data. Connect it to a FilterInputStream object to provide a useful interface.

Filter-InputStream

Abstract class which is an interface for decorators that provide useful functionality to the other InputStream classes. See Table 10-3.

See Table 10-3.

See Table 10-3.


PipedInputString ²úÉúΪÏà¹ØµÄPipedOutputStreamдµÄÊý¾Ý¡£ÊµÏÖÁË¡°¹ÜµÀ»¯¡±µÄ¸ÅÄî PipedOutputStream£¯×÷Ϊһ¸öÊý¾ÝԴʹÓá£Í¨¹ý½«Æäͬһ¸öFilterInputStream¶ÔÏóÁ¬½Ó£¬¿ÉÌṩһ¸öÓÐÓõĽӿÚ
SequenceInputStream ½«Á½¸ö»ò¸ü¶àµÄInputStream¶ÔÏóת»»³Éµ¥¸öInputStreamʹÓà Á½¸öInputStream¶ÔÏó»òÕßÒ»¸öEnumeration£¬ÓÃÓÚInputStream¶ÔÏóµÄÒ»¸öÈÝÆ÷£¯×÷Ϊһ¸öÊý¾ÝԴʹÓá£Í¨¹ý½«Æäͬһ¸öFilterInputStream¶ÔÏóÁ¬½Ó£¬¿ÉÌṩһ¸öÓÐÓõĽӿÚ
FilterInputStream ¶Ô×÷ÎªÆÆ»µÆ÷½Ó¿ÚʹÓõÄÀà½øÐгéÏó£»ÄǸöÆÆ»µÆ÷ΪÆäËûInputStreamÀàÌṩÁËÓÐÓõŦÄÜ¡£²Î¼û±í10.3 ²Î¼û±í10.3£¯²Î¼û±í10.3

10.1.2 OutputStreamµÄÀàÐÍ
ÕâÒ»Àà±ð°üÀ¨µÄÀà¾ö¶¨ÁËÎÒÃǵÄÊäÈëÍùºÎ´¦È¥£ºÒ»¸ö×Ö½ÚÊý×飨µ«Ã»ÓÐString£»¼Ù¶¨ÎÒÃÇ¿ÉÓÃ×Ö½ÚÊý×é´´½¨Ò»¸ö£©£»Ò»¸öÎļþ£»»òÕßÒ»¸ö¡°¹ÜµÀ¡±¡£
³ý´ËÒÔÍ⣬FilterOutputStreamΪ¡°ÆÆ»µÆ÷¡±ÀàÌṩÁËÒ»¸ö»ù´¡À࣬Ëü½«ÊôÐÔ»òÕßÓÐÓõĽӿÚͬÊä³öÁ÷Á¬½ÓÆðÀ´¡£Õ⽫ÔÚÒÔºóÌÖÂÛ¡£
±í10.2 OutputStreamµÄÀàÐÍ

Class

Function

Constructor Arguments

How to use it

ByteArray-OutputStream

Creates a buffer in memory. All the data that you send to the stream is placed in this buffer.

Optional initial size of the buffer.

To designate the destination of your data. Connect it to a FilterOutputStream object to provide a useful interface.

File-OutputStream

For sending information to a file.

A String representing the file name, or a File or FileDescriptor object.

To designate the destination of your data. Connect it to a FilterOutputStream object to provide a useful interface.

Piped-OutputStream

Any information you write to this automatically ends up as input for the associated PipedInput-Stream. Implements the “piping” concept.

PipedInputStream

To designate the destination of your data for multithreading. Connect it to a FilterOutputStream object to provide a useful interface.

Filter-OutputStream

Abstract class which is an interface for decorators that provide useful functionality to the other OutputStream classes. See Table
10-4.

See Table 10-4.

See Table 10-4.


Àà ¹¦ÄÜ ¹¹½¨Æ÷²ÎÊý£¯ÈçºÎʹÓÃ

ByteArrayOutputStream ÔÚÄÚ´æÖд´½¨Ò»¸ö»º³åÇø¡£ÎÒÃÇ·¢Ë͸øÁ÷µÄËùÓÐÊý¾Ý¶¼»áÖÃÈëÕâ¸ö»º³åÇø¡£ ¿ÉÑ¡»º³åÇøµÄ³õʼ´óС£¯ÓÃÓÚÖ¸³öÊý¾ÝµÄÄ¿µÄµØ¡£Èô½«ÆäͬFilterOutputStream¶ÔÏóÁ¬½Óµ½Ò»Æð£¬¿ÉÌṩһ¸öÓÐÓõĽӿÚ
FileOutputStream ½«ÐÅÏ¢·¢¸øÒ»¸öÎļþ ÓÃÒ»¸öString´ú±íÎļþÃû£¬»òÑ¡ÓÃÒ»¸öFile»òFileDescriptor¶ÔÏó£¯ÓÃÓÚÖ¸³öÊý¾ÝµÄÄ¿µÄµØ¡£Èô½«ÆäͬFilterOutputStream¶ÔÏóÁ¬½Óµ½Ò»Æð£¬¿ÉÌṩһ¸öÓÐÓõĽӿÚ
PipedOutputStream ÎÒÃÇд¸øËüµÄÈκÎÐÅÏ¢¶¼»á×Ô¶¯³ÉΪÏà¹ØµÄPipedInputStreamµÄÊä³ö¡£ÊµÏÖÁË¡°¹ÜµÀ»¯¡±µÄ¸ÅÄî PipedInputStream£¯Îª¶àÏ̴߳¦ÀíÖ¸³ö×Ô¼ºÊý¾ÝµÄÄ¿µÄµØ£¯½«ÆäͬFilterOutputStream¶ÔÏóÁ¬½Óµ½Ò»Æð£¬±ã¿ÉÌṩһ¸öÓÐÓõĽӿÚ
FilterOutputStream ¶Ô×÷ÎªÆÆ»µÆ÷½Ó¿ÚʹÓõÄÀà½øÐгéÏó´¦Àí£»ÄǸöÆÆ»µÆ÷ΪÆäËûOutputStreamÀàÌṩÁËÓÐÓõŦÄÜ¡£²Î¼û±í10.4 ²Î¼û±í10.4£¯²Î¼û±í10.4

10.2 ÔöÌíÊôÐÔºÍÓÐÓõĽӿÚ
ÀûÓòã´Î»¯¶ÔÏó¶¯Ì¬ºÍ͸Ã÷µØÌí¼Óµ¥¸ö¶ÔÏóµÄÄÜÁ¦µÄ×ö·¨½Ð×÷¡°×°ÊÎÆ÷¡±£¨Decorator£©·½°¸¡ª¡ª¡°·½°¸¡±ÊôÓÚ±¾ÊéµÚ16ÕµÄÖ÷Ì⣨עÊÍ¢Ù£©¡£×°ÊÎÆ÷·½°¸¹æ¶¨·â×°ÓÚ³õʼ»¯¶ÔÏóÖеÄËùÓжÔÏó¶¼ÓµÓÐÏàͬµÄ½Ó¿Ú£¬ÒÔ±ãÀûÓÃ×°ÊÎÆ÷µÄ¡°Í¸Ã÷¡±ÐÔÖÊ¡ª¡ªÎÒÃǽ«ÏàͬµÄÏûÏ¢·¢¸øÒ»¸ö¶ÔÏó£¬ÎÞÂÛËüÊÇ·ñÒѱ»¡°×°ÊΡ±¡£ÕâÕýÊÇÔÚJava IO¿âÀï´æÔÚ¡°¹ýÂËÆ÷¡±£¨Filter£©ÀàµÄÔ­Òò£º³éÏóµÄ¡°¹ýÂËÆ÷¡±ÀàÊÇËùÓÐ×°ÊÎÆ÷µÄ»ù´¡ÀࣨװÊÎÆ÷±ØÐëÓµÓÐÓëËü×°ÊεÄÄǸö¶ÔÏóÏàͬµÄ½Ó¿Ú£¬µ«×°ÊÎÆ÷Òà¿É¶Ô½Ó¿Ú×÷³öÀ©Õ¹£¬ÕâÖÖÇé¿ö¼ûÖîÓÚ¼¸¸öÌØÊâµÄ¡°¹ýÂËÆ÷¡±ÀàÖУ©¡£
×ÓÀà´¦ÀíÒªÇó´óÁ¿×ÓÀà¶ÔÿÖÖ¿ÉÄܵÄ×éºÏÌṩ֧³Öʱ£¬±ã¾­³£»áÓõ½×°ÊÎÆ÷¡ª¡ªÓÉÓÚ×éºÏÐÎʽ̫¶à£¬Ôì³É×ÓÀà´¦Àí±äµÃ²»ÇÐʵ¼Ê¡£Java IO¿âÒªÇóÐí¶à²»Í¬µÄÌØÐÔ×éºÏ·½°¸£¬ÕâÕýÊÇ×°ÊÎÆ÷·½°¸ÏÔµÃÌØ±ðÓÐÓõÄÔ­Òò¡£µ«ÊÇ£¬×°ÊÎÆ÷·½°¸Ò²ÓÐ×Ô¼ºµÄÒ»¸öȱµã¡£ÔÚÎÒÃÇдһ¸ö³ÌÐòµÄʱºò£¬×°ÊÎÆ÷ΪÎÒÃÇÌṩÁË´óµÃ¶àµÄÁé»îÐÔ£¨ÒòΪ¿ÉÒÔ·½±ãµØ»ìºÏÓëÆ¥ÅäÊôÐÔ£©£¬µ«ËüÃÇҲʹ×Ô¼ºµÄ´úÂë±äµÃ¸ü¼Ó¸´ÔÓ¡£Ô­ÒòÔÚÓÚJava IO¿â²Ù×÷²»±ã£¬ÎÒÃDZØÐë´´½¨Ðí¶àÀࡪ¡ª¡°ºËÐÄ¡±IOÀàÐͼÓÉÏËùÓÐ×°ÊÎÆ÷¡ª¡ª²ÅÄܵõ½×Ô¼ºÏ£ÍûµÄµ¥¸öIO¶ÔÏó¡£
FilterInputStreamºÍFilterOutputStream£¨ÕâÁ½¸öÃû×Ö²»Ê®·ÖÖ±¹Û£©ÌṩÁËÏàÓ¦µÄ×°ÊÎÆ÷½Ó¿Ú£¬ÓÃÓÚ¿ØÖÆÒ»¸öÌØ¶¨µÄÊäÈëÁ÷£¨InputStream£©»òÕßÊä³öÁ÷£¨OutputStream£©¡£ËüÃÇ·Ö±ðÊÇ´ÓInputStreamºÍOutputStreamÑÜÉú³öÀ´µÄ¡£´ËÍ⣬ËüÃǶ¼ÊôÓÚ³éÏóÀ࣬ÔÚÀíÂÛÉÏΪÎÒÃÇÓëÒ»¸öÁ÷µÄ²»Í¬Í¨ÐÅÊֶζ¼ÌṩÁËÒ»¸öͨÓõĽӿڡ£ÊÂʵÉÏ£¬FilterInputStreamºÍFilterOutputStreamÖ»ÊǼòµ¥µØÄ£·ÂÁË×Ô¼ºµÄ»ù´¡À࣬ËüÃÇÊÇÒ»¸ö×°ÊÎÆ÷µÄ»ù±¾ÒªÇó¡£

10.2.1 ͨ¹ýFilterInputStream´ÓInputStreamÀï¶ÁÈëÊý¾Ý
FilterInputStreamÀàÒªÍê³ÉÁ½¼þȫȻ²»Í¬µÄÊÂÇé¡£ÆäÖУ¬DataInputStreamÔÊÐíÎÒÃǶÁÈ¡²»Í¬µÄ»ù±¾ÀàÐÍÊý¾ÝÒÔ¼°String¶ÔÏó£¨ËùÓз½·¨¶¼ÒÔ¡°read¡±¿ªÍ·£¬±ÈÈçreadByte()£¬readFloat()µÈµÈ£©¡£°éËæ¶ÔÓ¦µÄDataOutputStream£¬ÎÒÃÇ¿Éͨ¹ýÊý¾Ý¡°Á÷¡±½«»ù±¾ÀàÐ͵ÄÊý¾Ý´ÓÒ»¸öµØ·½°áµ½ÁíÒ»¸öµØ·½¡£ÕâЩ¡°µØ·½¡±ÊÇÓɱí10.1×ܽáµÄÄÇЩÀà¾ö¶¨µÄ¡£Èô¶ÁÈ¡¿éÄÚµÄÊý¾Ý£¬²¢×Ô¼º½øÐнâÎö£¬¾Í²»ÐèÒªÓõ½DataInputStream¡£µ«ÔÚÆäËûÐí¶àÇé¿öÏ£¬ÎÒÃÇÒ»°ã¶¼ÏëÓÃËü¶Ô×Ô¼º¶ÁÈëµÄÊý¾Ý½øÐÐ×Ô¶¯¸ñʽ»¯¡£
ʣϵÄÀàÓÃÓÚÐÞ¸ÄInputStreamµÄÄÚ²¿ÐÐΪ·½Ê½£ºÊÇ·ñ½øÐлº³å£¬ÊÇ·ñ¸ú×Ù×Ô¼º¶ÁÈëµÄÊý¾ÝÐУ¬ÒÔ¼°ÊÇ·ñÄܹ»ÍÆ»ØÒ»¸ö×Ö·ûµÈµÈ¡£ºóÁ½ÖÖÀà¿´ÆðÀ´ÌرðÏóÌṩ¶Ô¹¹½¨Ò»¸ö±àÒëÆ÷µÄÖ§³Ö£¨»»ÑÔÖ®£¬Ìí¼ÓËüÃÇΪÁËÖ§³ÖJava±àÒëÆ÷µÄ¹¹½¨£©£¬ËùÒÔÔÚ³£¹æ±à³ÌÖÐÒ»°ã¶¼Óò»×ÅËüÃÇ¡£
Ò²Ðí¼¸ºõÿ´Î¶¼Òª»º³å×Ô¼ºµÄÊäÈ룬ÎÞÂÛÁ¬½ÓµÄÊÇÄĸöIOÉ豸¡£ËùÒÔIO¿â×îÃ÷ÖǵÄ×ö·¨¾ÍÊǽ«Î´»º³åÊäÈë×÷ΪһÖÖÌØÊâÇé¿ö´¦Àí£¬Í¬Ê±½«»º³åÊäÈë½ÓÄÉΪ±ê×¼×ö·¨¡£
±í10.3 FilterInputStreamµÄÀàÐÍ

Class

Function

Constructor Arguments

How to use it

Data-InputStream

Used in concert with DataOutputStream, so you can read primitives (int, char, long, etc.) from a stream in a portable fashion.

InputStream

Contains a full interface to allow you to read primitive types.

Buffered-InputStream

Use this to prevent a physical read every time you want more data. You’re saying “Use a buffer.”

InputStream, with optional buffer size.

This doesn’t provide an interface per se, just a requirement that a buffer be used. Attach an interface object.

LineNumber-InputStream

Keeps track of line numbers in the input stream; you can call getLineNumber( ) and setLineNumber(int).

InputStream

This just adds line numbering, so you’ll probably attach an interface object.

Pushback-InputStream

Has a one byte push-back buffer so that you can push back the last character read.

InputStream

Generally used in the scanner for a compiler and probably included because the Java compiler needed it. You probably won’t use this.


Àà ¹¦ÄÜ ¹¹½¨Æ÷²ÎÊý£¯ÈçºÎʹÓÃ

DataInputStream ÓëDataOutputStreamÁªºÏʹÓã¬Ê¹×Ô¼ºÄÜÒÔ»ú¶¯·½Ê½¶Áȡһ¸öÁ÷ÖеĻù±¾Êý¾ÝÀàÐÍ£¨int£¬char£¬longµÈµÈ£© InputStream/°üº¬ÁËÒ»¸öÍêÕûµÄ½Ó¿Ú£¬ÒÔ±ã¶ÁÈ¡»ù±¾Êý¾ÝÀàÐÍ
BufferedInputStream ±ÜÃâÿ´ÎÏëÒª¸ü¶àÊý¾Ýʱ¶¼½øÐÐÎïÀíÐԵĶÁÈ¡£¬¸æËßËü¡°ÇëÏÈÔÚ»º³åÇøÀïÕÒ¡± InputStream£¬Ã»ÓпÉÑ¡µÄ»º³åÇø´óС£¯±¾Éí²¢²»ÄÜÌṩһ¸ö½Ó¿Ú£¬Ö»ÊÇ·¢³öʹÓûº³åÇøµÄÒªÇó¡£ÒªÇóͬһ¸ö½Ó¿Ú¶ÔÏóÁ¬½Óµ½Ò»Æð
LineNumberInputStream ¸ú×ÙÊäÈëÁ÷ÖеÄÐкţ»¿Éµ÷ÓÃgetLineNumber()ÒÔ¼°setLineNumber(int) Ö»ÊÇÌí¼Ó¶ÔÊý¾ÝÐбàºÅµÄÄÜÁ¦£¬ËùÒÔ¿ÉÄÜÐèҪͬһ¸öÕæÕýµÄ½Ó¿Ú¶ÔÏóÁ¬½Ó
PushbackInputStream ÓÐÒ»¸ö×ֽڵĺóÍÆ»º³åÇø£¬ÒÔ±ãºóÍÆ¶ÁÈëµÄÉÏÒ»¸ö×Ö·û InputStream£¯Í¨³£ÓɱàÒëÆ÷ÔÚɨÃèÆ÷ÖÐʹÓã¬ÒòΪJava±àÒëÆ÷ÐèÒªËü¡£Ò»°ã²»ÔÚ×Ô¼ºµÄ´úÂëÖÐʹÓÃ

10.2.2 ͨ¹ýFilterOutputStreamÏòOutputStreamÀïдÈëÊý¾Ý
ÓëDataInputStream¶ÔÓ¦µÄÊÇDataOutputStream£¬ºóÕß¶Ô¸÷¸ö»ù±¾Êý¾ÝÀàÐÍÒÔ¼°String¶ÔÏó½øÐиñʽ»¯£¬²¢½«ÆäÖÃÈëÒ»¸öÊý¾Ý¡°Á÷¡±ÖУ¬ÒÔ±ãÈκλúÆ÷ÉϵÄDataInputStream¶¼ÄÜÕý³£µØ¶ÁÈ¡ËüÃÇ¡£ËùÓз½·¨¶¼ÒÔ¡°wirte¡±¿ªÍ·£¬ÀýÈçwriteByte()£¬writeFloat()µÈµÈ¡£
ÈôÏë½øÐÐÒ»Ð©ÕæÕýµÄ¸ñʽ»¯Êä³ö£¬±ÈÈçÊä³öµ½¿ØÖÆÌ¨£¬ÇëʹÓÃPrintStream¡£ÀûÓÃËü¿ÉÒÔ´òÓ¡³öËùÓлù±¾Êý¾ÝÀàÐÍÒÔ¼°String¶ÔÏ󣬲¢¿É²ÉÓÃÒ»ÖÖÒ×Óڲ鿴µÄ¸ñʽ¡£ÕâÓëDataOutputStreamÕýºÃÏà·´£¬ºóÕßµÄÄ¿±êÊǽ«ÄÇЩÊý¾ÝÖÃÈëÒ»¸öÊý¾ÝÁ÷ÖУ¬ÒÔ±ãDataInputStreamÄܹ»·½±ãµØÖØÐ¹¹ÔìËüÃÇ¡£System.out¾²Ì¬¶ÔÏóÊÇÒ»¸öPrintStream¡£
PrintStreamÄÚÁ½¸öÖØÒªµÄ·½·¨ÊÇprint()ºÍprintln()¡£ËüÃÇÒѽøÐÐÁ˸²¸Ç´¦Àí£¬¿É´òÓ¡³öËùÓÐÊý¾ÝÀàÐÍ¡£print()ºÍprintln()Ö®¼äµÄ²îÒìÊǺóÕßÔÚ²Ù×÷Íê±Ïºó»á×Ô¶¯Ìí¼ÓÒ»¸öÐÂÐС£
BufferedOutputStreamÊôÓÚÒ»ÖÖ¡°ÐÞ¸ÄÆ÷¡±£¬ÓÃÓÚָʾÊý¾ÝÁ÷ʹÓûº³å¼¼Êõ£¬Ê¹×Ô¼º²»±ØÃ¿´Î¶¼ÏòÁ÷ÄÚÎïÀíÐÔµØÐ´ÈëÊý¾Ý¡£Í¨³£¶¼Ó¦½«ËüÓ¦ÓÃÓÚÎļþ´¦ÀíºÍ¿ØÖÆÆ÷IO¡£
±í10.4 FilterOutputStreamµÄÀàÐÍ

Class

Function

Constructor Arguments

How to use it

Data-OutputStream

Used in concert with DataInputStream so you can write primitives (int, char, long, etc.) to a stream in a portable fashion.

OutputStream

Contains full interface to allow you to write primitive types.

PrintStream

For producing formatted output. While DataOutputStream handles the storage of data, PrintStream handles display.

OutputStream, with optional boolean indicating that the buffer is flushed with every newline.

Should be the “final” wrapping for your OutputStream object. You’ll probably use this a lot.

Buffered-OutputStream

Use this to prevent a physical write every time you send a piece of data. You’re saying “Use a buffer.” You can call flush( ) to flush the buffer.

OutputStream, with optional buffer size.

This doesn’t provide an interface per se, just a requirement that a buffer is used. Attach an interface object.


Àà ¹¦ÄÜ ¹¹½¨Æ÷²ÎÊý£¯ÈçºÎʹÓÃ

DataOutputStream ÓëDataInputStreamÅäºÏʹÓã¬ÒÔ±ã²ÉÓ÷½±ãµÄÐÎʽ½«»ù±¾Êý¾ÝÀàÐÍ£¨int£¬char£¬longµÈ£©Ð´ÈëÒ»¸öÊý¾ÝÁ÷ OutputStream£¯°üº¬ÁËÍêÕû½Ó¿Ú£¬ÒÔ±ãÎÒÃÇдÈë»ù±¾Êý¾ÝÀàÐÍ
PrintStream ÓÃÓÚ²úÉú¸ñʽ»¯Êä³ö¡£DataOutputStream¿ØÖƵÄÊÇÊý¾ÝµÄ¡°´æ´¢¡±£¬¶øPrintStream¿ØÖƵÄÊÇ¡°ÏÔʾ¡± OutputStream£¬¿Éѡһ¸ö²¼¶û²ÎÊý£¬Ö¸Ê¾»º³åÇøÊÇ·ñÓëÿ¸öÐÂÐÐһͬˢУ¯¶ÔÓÚ×Ô¼ºµÄOutputStream¶ÔÏó£¬Ó¦¸ÃÓá°final¡±½«Æä·â±ÕÔÚÄÚ¡£¿ÉÄܾ­³£¶¼ÒªÓõ½Ëü
BufferedOutputStream ÓÃËü±ÜÃâÿ´Î·¢³öÊý¾ÝµÄʱºò¶¼Òª½øÐÐÎïÀíÐÔµÄдÈ룬ҪÇóËü¡°ÇëÏÈÔÚ»º³åÇøÀïÕÒ¡±¡£¿Éµ÷ÓÃflush()£¬¶Ô»º³åÇø½øÐÐˢРOutputStream£¬¿ÉÑ¡»º³åÇø´óС£¯±¾Éí²¢²»ÄÜÌṩһ¸ö½Ó¿Ú£¬Ö»ÊÇ·¢³öʹÓûº³åÇøµÄÒªÇó¡£ÐèҪͬһ¸ö½Ó¿Ú¶ÔÏóÁ¬½Óµ½Ò»Æð

10.3 ±¾ÉíµÄȱÏÝ£ºRandomAccessFile
RandomAccessFileÓÃÓÚ°üº¬ÁËÒÑÖª³¤¶È¼Ç¼µÄÎļþ£¬ÒÔ±ãÎÒÃÇÄÜÓÃseek()´ÓÒ»Ìõ¼ÇÂ¼ÒÆÖÁÁíÒ»Ìõ£»È»ºó¶ÁÈ¡»òÐÞ¸ÄÄÇЩ¼Ç¼¡£¸÷¼Ç¼µÄ³¤¶È²¢²»Ò»¶¨Ïàͬ£»Ö»ÒªÖªµÀËüÃÇÓжà´óÒÔ¼°ÖÃÓÚÎļþºÎ´¦¼´¿É¡£
Ê×ÏÈ£¬ÎÒÃÇÓеãÄÑÒÔÏàÐÅRandomAccessFile²»ÊôÓÚInputStream»òÕßOutputStream·Ö²ã½á¹¹µÄÒ»²¿·Ö¡£³ýÁËÇ¡ÇÉʵÏÖÁËDataInputÒÔ¼°DataOutput£¨ÕâÁ½ÕßÒàÓÉDataInputStreamºÍDataOutputStreamʵÏÖ£©½Ó¿ÚÖ®Í⣬ËüÃÇÓëÄÇЩ·Ö²ã½á¹¹²¢ÎÞʲô¹ØÏµ¡£ËüÉõÖÁûÓÐÓõ½ÏÖÓÐInputStream»òOutputStreamÀàµÄ¹¦ÄÜ¡ª¡ª²ÉÓõÄÊÇÒ»¸öÍêÈ«²»Ïà¸ÉµÄÀà¡£¸ÃÀàÊôÓÚȫеÄÉè¼Æ£¬º¬ÓÐ×Ô¼ºµÄÈ«²¿£¨´ó¶àÊýΪ¹ÌÓУ©·½·¨¡£Ö®ËùÒÔÒªÕâÑù×ö£¬ÊÇÒòΪRandomAccessFileÓµÓÐÓëÆäËûIOÀàÐÍÍêÈ«²»Í¬µÄÐÐΪ£¬ÒòΪÎÒÃÇ¿ÉÔÚÒ»¸öÎļþÀïÏòǰ»òÏòºóÒÆ¶¯¡£²»¹ÜÔÚÄÄÖÖÇé¿öÏ£¬Ëü¶¼ÊǶÀÁ¢ÔË×÷µÄ£¬×÷ΪObjectµÄÒ»¸ö¡°Ö±½Ó¼Ì³ÐÈË¡±Ê¹Óá£
´Ó¸ù±¾ÉÏ˵£¬RandomAccessFileÀàËÆDataInputStreamºÍDataOutputStreamµÄÁªºÏʹÓá£ÆäÖУ¬getFilePointer()ÓÃÓÚÁ˽⵱ǰÔÚÎļþµÄʲôµØ·½£¬seek()ÓÃÓÚÒÆÖÁÎļþÄÚµÄÒ»¸öеص㣬¶ølength()ÓÃÓÚÅжÏÎļþµÄ×î´ó³¤¶È¡£´ËÍ⣬¹¹½¨Æ÷ÒªÇóʹÓÃÁíÒ»¸ö×Ô±äÁ¿£¨ÓëCµÄfopen()ÍêȫһÑù£©£¬Ö¸³ö×Ô¼ºÖ»ÊÇËæ»ú¶Á£¨"r"£©£¬»¹ÊǶÁд¼æÊ©£¨"rw"£©¡£ÕâÀïûÓÐÌṩ¶Ô¡°Ö»Ð´Îļþ¡±µÄÖ§³Ö¡£Ò²¾ÍÊÇ˵£¬¼ÙÈçÊÇ´ÓDataInputStream¼Ì³ÐµÄ£¬ÄÇôRandomAccessFileÒ²ÓпÉÄÜÄܺܺõع¤×÷¡£
»¹ÓиüÄѶԸ¶µÄ¡£ºÜÈÝÒ×ÏëÏóÎÒÃÇÓÐʱҪÔÚÆäËûÀàÐ͵ÄÊý¾ÝÁ÷ÖÐËÑË÷£¬±ÈÈçÒ»¸öByteArrayInputStream£¬µ«ËÑË÷·½·¨Ö»ÓÐRandomAccessFile²Å»áÌṩ¡£¶øºóÕßÖ»ÄÜÕë¶ÔÎļþ²ÅÄܲÙ×÷£¬²»ÄÜÕë¶ÔÊý¾ÝÁ÷²Ù×÷¡£´Ëʱ£¬BufferedInputStreamȷʵÔÊÐíÎÒÃDZê¼ÇÒ»¸öλÖã¨Ê¹ÓÃmark()£¬ËüµÄÖµÈÝÄÉÓÚµ¥¸öÄÚ²¿±äÁ¿ÖУ©£¬²¢ÓÃreset()ÖØÉèÄǸöλÖᣵ«ÕâЩ×ö·¨¶¼´æÔÚÏÞÖÆ£¬²¢²»ÊÇÌØ±ðÓÐÓá£

10.4 FileÀà
FileÀàÓÐÒ»¸öÆÛÆ­ÐÔµÄÃû×Ö¡ª¡ªÍ¨³£»áÈÏΪËü¶Ô¸¶µÄÊÇÒ»¸öÎļþ£¬µ«ÊµÇé²¢·ÇÈç´Ë¡£Ëü¼È´ú±íÒ»¸öÌØ¶¨ÎļþµÄÃû×Ö£¬Ò²´ú±íĿ¼ÄÚһϵÁÐÎļþµÄÃû×Ö¡£Èô´ú±íÒ»¸öÎļþ¼¯£¬±ã¿ÉÓÃlist()·½·¨²éѯÕâ¸ö¼¯£¬·µ»ØµÄÊÇÒ»¸ö×Ö´®Êý×é¡£Ö®ËùÒÔÒª·µ»ØÒ»¸öÊý×飬¶ø·Çij¸öÁé»îµÄ¼¯ºÏÀ࣬ÊÇÒòÎªÔªËØµÄÊýÁ¿Êǹ̶¨µÄ¡£¶øÇÒÈôÏëµÃµ½Ò»¸ö²»Í¬µÄĿ¼ÁÐ±í£¬Ö»Ðè´´½¨Ò»¸ö²»Í¬µÄFile¶ÔÏó¼´¿É¡£ÊÂʵÉÏ£¬¡°FilePath¡±£¨Îļþ·¾¶£©ËƺõÊÇÒ»¸ö¸üºÃµÄÃû×Ö¡£±¾½Ú½«Ïò´ó¼ÒÍêÕûµØÀýʾÈçºÎʹÓÃÕâ¸öÀ࣬ÆäÖаüÀ¨Ïà¹ØµÄFilenameFilter£¨ÎļþÃû¹ýÂËÆ÷£©½Ó¿Ú¡£

10.4.1 Ŀ¼ÁбíÆ÷
ÏÖÔÚ¼ÙÉèÎÒÃÇÏë¹Û¿´Ò»¸öĿ¼ÁÐ±í¡£¿ÉÓÃÁ½ÖÖ·½Ê½ÁгöFile¶ÔÏó¡£ÈôÔÚ²»º¬×Ô±äÁ¿£¨²ÎÊý£©µÄÇé¿öϵ÷ÓÃlist()£¬»á»ñµÃFile¶ÔÏó°üº¬µÄÒ»¸öÍêÕûÁÐ±í¡£È»¶ø£¬ÈôÏë¶ÔÕâ¸öÁÐ±í½øÐÐijЩÏÞÖÆ£¬¾ÍÐèҪʹÓÃÒ»¸ö¡°Ä¿Â¼¹ýÂËÆ÷¡±£¬¸ÃÀàµÄ×÷ÓÃÊÇÖ¸³öÓ¦ÈçºÎÑ¡ÔñFile¶ÔÏóÀ´Íê³ÉÏÔʾ¡£
ÏÂÃæÊÇÓÃÓÚÕâ¸öÀý×ӵĴúÂ루»òÔÚÖ´ÐиóÌÐòʱÓöµ½À§ÄÑ£¬Çë²Î¿¼µÚ3ÕÂ3.1.2С½Ú¡°¸³Öµ¡±£©£º

//: DirList.java
// Displays directory listing
package c10;
import java.io.*;

public class DirList {
  public static void main(String[] args) {
    try {
      File path = new File(".");
      String[] list;
      if(args.length == 0)
        list = path.list();
      else 
        list = path.list(new DirFilter(args[0]));
      for(int i = 0; i < list.length; i++)
        System.out.println(list[i]);
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
}

class DirFilter implements FilenameFilter {
  String afn;
  DirFilter(String afn) { this.afn = afn; }
  public boolean accept(File dir, String name) {
    // Strip path information:
    String f = new File(name).getName();
    return f.indexOf(afn) != -1;
  }
} ///:~

DirFilterÀࡰʵÏÖ¡±ÁËinterface FilenameFilter£¨¹ØÓÚ½Ó¿ÚµÄÎÊÌ⣬ÒÑÔÚµÚ7Õ½øÐÐÁËÏêÊö£©¡£ÏÂÃæÈÃÎÒÃÇ¿´¿´FilenameFilter½Ó¿ÚÓжàô¼òµ¥£º

public interface FilenameFilter {
boolean accept(ÎļþĿ¼, ×Ö´®Ãû);
}

ËüÖ¸³öÕâÖÖÀàÐ͵ÄËùÓжÔÏó¶¼ÌṩÁËÒ»¸öÃûΪaccept()µÄ·½·¨¡£Ö®ËùÒÔÒª´´½¨ÕâÑùµÄÒ»¸öÀ࣬±³ºóµÄÈ«²¿Ô­Òò¾ÍÊǰÑaccept()·½·¨Ìṩ¸ølist()·½·¨£¬Ê¹list()Äܹ»¡°»Øµ÷¡±accept()£¬´Ó¶øÅжÏÓ¦½«ÄÄЩÎļþÃû°üÀ¨µ½ÁбíÖС£Òò´Ë£¬Í¨³£½«ÕâÖÖ¼¼Êõ³ÆÎª¡°»Øµ÷¡±£¬ÓÐʱҲ³ÆÎª¡°Ëã×Ó¡±£¨Ò²¾ÍÊÇ˵£¬DirFilterÊÇÒ»¸öËã×Ó£¬ÒòΪËüΨһµÄ×÷ÓþÍÊÇÈÝÄÉÒ»¸ö·½·¨£©¡£ÓÉÓÚlist()²ÉÓÃÒ»¸öFilenameFilter¶ÔÏó×÷Ϊ×Ô¼ºµÄ×Ô±äÁ¿Ê¹Óã¬ËùÒÔÎÒÃÇÄÜ´«µÝʵÏÖÁËFilenameFilterµÄÈκÎÀàµÄÒ»¸ö¶ÔÏó£¬ÓÃËü¾ö¶¨£¨ÉõÖÁÔÚÔËÐÐÆÚ£©list()·½·¨µÄÐÐΪ·½Ê½¡£»Øµ÷µÄÄ¿µÄÊÇÔÚ´úÂëµÄÐÐΪÉÏÌṩ¸ü´óµÄÁé»îÐÔ¡£
ͨ¹ýDirFilter£¬ÎÒÃÇ¿´³ö¾¡¹ÜÒ»¸ö¡°½Ó¿Ú¡±Ö»°üº¬ÁËһϵÁз½·¨£¬µ«²¢²»¾ÖÏÞÓÚÖ»ÄÜдÄÇЩ·½·¨£¨µ«ÊÇ£¬ÖÁÉÙ±ØÐëÌṩһ¸ö½Ó¿ÚÄÚËùÓз½·¨µÄ¶¨Òå¡£ÔÚÕâÖÖÇé¿öÏ£¬DirFilter¹¹½¨Æ÷Ò²»á´´½¨£©¡£
accept()·½·¨±ØÐë½ÓÄÉÒ»¸öFile¶ÔÏó£¬ÓÃËüָʾÓÃÓÚѰÕÒÒ»¸öÌØ¶¨ÎļþµÄĿ¼£»²¢½ÓÄÉÒ»¸öString£¬ÆäÖаüº¬ÁËҪѰÕÒÖ®ÎļþµÄÃû×Ö¡£¿É¾ö¶¨Ê¹ÓûòºöÂÔÕâÁ½¸ö²ÎÊýÖ®Ò»£¬µ«ÓÐʱÖÁÉÙҪʹÓÃÎļþÃû¡£¼Çסlist()·½·¨×¼±¸ÎªÄ¿Â¼¶ÔÏóÖеÄÿ¸öÎļþÃûµ÷ÓÃaccept()£¬ºËʵÄĸöÓ¦°üº¬ÔÚÄÚ¡ª¡ª¾ßÌåÓÉaccept()·µ»ØµÄ¡°²¼¶û¡±½á¹û¾ö¶¨¡£
Ϊȷ¶¨ÎÒÃDzÙ×÷µÄÖ»ÊÇÎļþÃû£¬ÆäÖÐûÓаüº¬Â·¾¶ÐÅÏ¢£¬±ØÐë²ÉÓÃString¶ÔÏ󣬲¢ÔÚËüµÄÍⲿ´´½¨Ò»¸öFile¶ÔÏó¡£È»ºóµ÷ÓÃgetName()£¬ËüµÄ×÷ÓÃÊÇÈ¥³ýËùÓз¾¶ÐÅÏ¢£¨²ÉÓÃÓëÆ½Ì¨Î޹صķ½Ê½£©¡£Ëæºó£¬accept()ÓÃStringÀàµÄindexOf()·½·¨¼ì²éÎļþÃûÄÚ²¿ÊÇ·ñ´æÔÚËÑË÷×Ö´®"afn"¡£ÈôÔÚ×Ö´®ÄÚÕÒµ½afn£¬ÄÇô·µ»ØÖµ¾ÍÊÇafnµÄÆðµãË÷Òý£»µ«¼ÙÈçûÓÐÕÒµ½£¬·µ»ØÖµ¾ÍÊÇ-1¡£×¢ÒâÕâÖ»ÊÇÒ»¸ö¼òµ¥µÄ×Ö´®ËÑË÷Àý×Ó£¬Î´Ê¹Óó£¼ûµÄ±í´ïʽ¡°Í¨Åä·û¡±·½°¸£¬±ÈÈç"fo?.b?r*"£»ÕâÖÖ·½°¸¸üÄÑʵÏÖ¡£
list()·½·¨·µ»ØµÄÊÇÒ»¸öÊý×é¡£¿É²éѯÕâ¸öÊý×éµÄ³¤¶È£¬È»ºóÔÚÆäÖбéÀú£¬Ñ¡¶¨Êý×éÔªËØ¡£ÓëCºÍC++µÄÀàËÆÐÐΪÏà±È£¬ÕâÖÖÓÚ·½·¨ÄÚÍâ·½±ãÓÎÀúÊý×éµÄÐÐΪÎÞÒÉÊÇÒ»¸öÏÔÖøµÄ½ø²½¡£

1. ÄäÃûÄÚ²¿Àà
ÏÂÀýÓÃÒ»¸öÄäÃûÄÚ²¿ÀࣨÒÑÔÚµÚ7Õ½²Êö£©À´ÖØÐ´ÏԵ÷dz£ÀíÏë¡£Ê×ÏÈ´´½¨ÁËÒ»¸öfilter()·½·¨£¬Ëü·µ»ØÖ¸ÏòFilenameFilterµÄÒ»¸ö¾ä±ú£º
//: DirList2.java
// Uses Java 1.1 anonymous inner classes
import java.io.*;

public class DirList2 {
  public static FilenameFilter 
  filter(final String afn) {
    // Creation of anonymous inner class:
    return new FilenameFilter() {
      String fn = afn;
      public boolean accept(File dir, String n) {
        // Strip path information:
        String f = new File(n).getName();
        return f.indexOf(fn) != -1;
      }
    }; // End of anonymous inner class
  }
  public static void main(String[] args) {
    try {
      File path = new File(".");
      String[] list;
      if(args.length == 0)
        list = path.list();
      else 
        list = path.list(filter(args[0]));
      for(int i = 0; i < list.length; i++)
        System.out.println(list[i]);
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
} ///:~

×¢Òâfilter()µÄ×Ô±äÁ¿±ØÐëÊÇfinal¡£ÕâÒ»µãÊÇÄäÃûÄÚ²¿ÀàÒªÇóµÄ£¬Ê¹ÆäÄÜʹÓÃÀ´×Ô±¾Éí×÷ÓÃÓòÒÔÍâµÄÒ»¸ö¶ÔÏó¡£
Ö®ËùÒÔÈÏΪÕâÑù×ö¸üºÃ£¬ÊÇÓÉÓÚFilenameFilterÀàÏÖÔÚͬDirList2½ôÃܵؽáºÏÔÚÒ»Æð¡£È»¶ø£¬ÎÒÃǿɲÉÈ¡½øÒ»²½µÄ²Ù×÷£¬½«ÄäÃûÄÚ²¿ÀඨÒå³Élist()µÄÒ»¸ö²ÎÊý£¬Ê¹ÆäÏԵøü¼Ó¾«¼ò¡£ÈçÏÂËùʾ£º
//: DirList3.java
// Building the anonymous inner class "in-place"
import java.io.*;

public class DirList3 {
  public static void main(final String[] args) {
    try {
      File path = new File(".");
      String[] list;
      if(args.length == 0)
        list = path.list();
      else 
        list = path.list(
          new FilenameFilter() {
            public boolean 
            accept(File dir, String n) {
              String f = new File(n).getName();
              return f.indexOf(args[0]) != -1;
            }
          });
      for(int i = 0; i < list.length; i++)
        System.out.println(list[i]);
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
} ///:~

main()ÏÖÔÚµÄ×Ô±äÁ¿ÊÇfinal£¬ÒòΪÄäÃûÄÚ²¿ÀàÖ±½ÓʹÓÃargs[0]¡£
ÕâչʾÁËÈçºÎÀûÓÃÄäÃûÄÚ²¿Àà¿ìËÙ´´½¨¾«¼òµÄÀ࣬ÒÔ±ã½â¾öһЩ¸´ÔÓµÄÎÊÌâ¡£ÓÉÓÚJavaÖеÄËùÓж«Î÷¶¼ÓëÀàÓйأ¬ËùÒÔËüÎÞÒÉÊÇÒ»ÖÖÏ൱ÓÐÓõıàÂë¼¼Êõ¡£ËüµÄÒ»¸öºÃ´¦Êǽ«Ìض¨µÄÎÊÌâ¸ôÀëÔÚÒ»¸öµØ·½Í³Ò»½â¾ö¡£µ«ÔÚÁíÒ»·½Ã棬ÕâÑùÉú³ÉµÄ´úÂë²»ÊÇÊ®·ÖÈÝÒ×ÔĶÁ£¬ËùÒÔʹÓÃʱ±ØÐëÉ÷ÖØ¡£

2. ˳ÐòĿ¼Áбí
¾­³£¶¼ÐèÒªÎļþÃûÒÔÅźÃÐòµÄ·½Ê½Ìṩ¡£ÓÉÓÚJava 1.0ºÍJava 1.1¶¼Ã»ÓÐÌṩ¶ÔÅÅÐòµÄÖ§³Ö£¨´ÓJava 1.2¿ªÊ¼Ìṩ£©£¬ËùÒÔ±ØÐëÓõÚ8Õ´´½¨µÄSortVector½«ÕâÒ»ÄÜÁ¦Ö±½Ó¼ÓÈë×Ô¼ºµÄ³ÌÐò¡£¾ÍÏóÏÂÃæÕâÑù£º
//: SortedDirList.java
// Displays sorted directory listing
import java.io.*;
import c08.*;

public class SortedDirList {
  private File path;
  private String[] list;
  public SortedDirList(final String afn) {
    path = new File(".");
    if(afn == null)
      list = path.list();
    else
      list = path.list(
          new FilenameFilter() {
            public boolean 
            accept(File dir, String n) {
              String f = new File(n).getName();
              return f.indexOf(afn) != -1;
            }
          });
    sort();
  }
  void print() {
    for(int i = 0; i < list.length; i++)
      System.out.println(list[i]);
  }
  private void sort() {
    StrSortVector sv = new StrSortVector();
    for(int i = 0; i < list.length; i++)
      sv.addElement(list[i]);
    // The first time an element is pulled from
    // the StrSortVector the list is sorted:
    for(int i = 0; i < list.length; i++)
      list[i] = sv.elementAt(i);
  }
  // Test it:
  public static void main(String[] args) {
    SortedDirList sd;
    if(args.length == 0)
      sd = new SortedDirList(null);
    else
      sd = new SortedDirList(args[0]);
    sd.print();
  }
} ///:~

ÕâÀï½øÐÐÁËÁíÍâÉÙÐí¸Ä½ø¡£²»ÔÙÊǽ«path£¨Â·¾¶£©ºÍlist£¨ÁÐ±í£©´´½¨Îªmain()µÄ±¾µØ±äÁ¿£¬ËüÃDZä³ÉÁËÀàµÄ³ÉÔ±£¬Ê¹ËüÃǵÄÖµÄÜÔÚ¶ÔÏó¡°Éú´æ¡±ÆÚ¼ä·½±ãµØ·ÃÎÊ¡£ÊÂʵÉÏ£¬main()ÏÖÔÚÖ»ÊǶÔÀà½øÐвâÊÔµÄÒ»ÖÖ·½Ê½¡£´ó¼Ò¿ÉÒÔ¿´µ½£¬Ò»µ©ÁÐ±í´´½¨Íê±Ï£¬ÀàµÄ¹¹½¨Æ÷¾Í»á×Ô¶¯¿ªÊ¼¶ÔÁÐ±í½øÐÐÅÅÐò¡£
ÕâÖÖÅÅÐò²»ÒªÇóÇø·Ö´óСд£¬ËùÒÔ×îÖÕ²»»áµÃµ½Ò»×éÈ«²¿µ¥´Ê¶¼ÒÔ´óд×Öĸ¿ªÍ·µÄÁÐ±í£¬¸ú×ÅÊÇÈ«²¿ÒÔСд×Öĸ¿ªÍ·µÄÁÐ±í¡£È»¶ø£¬ÎÒÃÇ×¢Òâµ½ÔÚÒÔÏàͬ×Öĸ¿ªÍ·µÄÒ»×éÎļþÃûÖУ¬´óд×ÖĸÊÇÅÅÔÚÇ°ÃæµÄ¡ª¡ªÕâ¶Ô±ê×¼µÄÅÅÐòÀ´ËµÈÔÊÇÒ»ÖÖ²»ºÏ¸ñµÄÐÐΪ¡£Java 1.2Òѳɹ¦½â¾öÁËÕâ¸öÎÊÌâ¡£

10.4.2 ¼ì²éÓë´´½¨Ä¿Â¼
FileÀಢ²»½ö½öÊǶÔÏÖÓÐĿ¼·¾¶¡¢Îļþ»òÕßÎļþ×éµÄÒ»¸ö±íʾ¡£Òà¿ÉÓÃÒ»¸öFile¶ÔÏóн¨Ò»¸öĿ¼£¬ÉõÖÁ´´½¨Ò»¸öÍêÕûµÄĿ¼·¾¶¡ª¡ª¼ÙÈçËüÉв»´æÔڵϰ¡£Òà¿ÉÓÃËüÁ˽âÎļþµÄÊôÐÔ£¨³¤¶È¡¢ÉÏÒ»´ÎÐÞ¸ÄÈÕÆÚ¡¢¶Á£¯Ð´ÊôÐԵȣ©£¬¼ì²éÒ»¸öFile¶ÔÏóµ½µ×´ú±íÒ»¸öÎļþ»¹ÊÇÒ»¸öĿ¼£¬ÒÔ¼°É¾³ýÒ»¸öÎļþµÈµÈ¡£ÏÂÁгÌÐòÍêÕûչʾÁËÈçºÎÔËÓÃFileÀàʣϵÄÕâЩ·½·¨£º
//: MakeDirectories.java
// Demonstrates the use of the File class to
// create directories and manipulate files.
import java.io.*;

public class MakeDirectories {
  private final static String usage =
    "Usage:MakeDirectories path1 ...\n" +
    "Creates each path\n" +
    "Usage:MakeDirectories -d path1 ...\n" +
    "Deletes each path\n" +
    "Usage:MakeDirectories -r path1 path2\n" +
    "Renames from path1 to path2\n";
  private static void usage() {
    System.err.println(usage);
    System.exit(1);
  }
  private static void fileData(File f) {
    System.out.println(
      "Absolute path: " + f.getAbsolutePath() +
      "\n Can read: " + f.canRead() +
      "\n Can write: " + f.canWrite() +
      "\n getName: " + f.getName() +
      "\n getParent: " + f.getParent() +
      "\n getPath: " + f.getPath() +
      "\n length: " + f.length() +
      "\n lastModified: " + f.lastModified());
    if(f.isFile())
      System.out.println("it's a file");
    else if(f.isDirectory())
      System.out.println("it's a directory");
  }
  public static void main(String[] args) {
    if(args.length < 1) usage();
    if(args[0].equals("-r")) {
      if(args.length != 3) usage();
      File 
        old = new File(args[1]),
        rname = new File(args[2]);
      old.renameTo(rname);
      fileData(old);
      fileData(rname);
      return; // Exit main
    }
    int count = 0;
    boolean del = false;
    if(args[0].equals("-d")) {
      count++;
      del = true;
    }
    for( ; count < args.length; count++) {
      File f = new File(args[count]);
      if(f.exists()) {
        System.out.println(f + " exists");
        if(del) {
          System.out.println("deleting..." + f);
          f.delete();
        }
      } 
      else { // Doesn't exist
        if(!del) {
          f.mkdirs();
          System.out.println("created " + f);
        }
      }
      fileData(f);
    }  
  }
} ///:~

ÔÚfileData()ÖУ¬¿É¿´µ½Ó¦ÓÃÁ˸÷ÖÖÎļþµ÷²é·½·¨À´ÏÔʾÓëÎļþ»òĿ¼·¾¶ÓйصÄÐÅÏ¢¡£
main()Ó¦ÓõĵÚÒ»¸ö·½·¨ÊÇrenameTo()£¬ÀûÓÃËü¿ÉÒÔÖØÃüÃû£¨»òÒÆ¶¯£©Ò»¸öÎļþÖÁÒ»¸öȫеķ¾¶£¨¸Ã·¾¶ÓɲÎÊý¾ö¶¨£©£¬ËüÊôÓÚÁíÒ»¸öFile¶ÔÏó¡£ÕâÒ²ÊÊÓÃÓÚÈκγ¤¶ÈµÄĿ¼¡£
ÈôÊÔÑéÉÏÊö³ÌÐò£¬¾Í¿É·¢ÏÖ×Ô¼ºÄÜÖÆ×÷ÈÎÒ⸴Ôӳ̶ȵÄÒ»¸öĿ¼·¾¶£¬ÒòΪmkdirs()»á°ïÎÒÃÇÍê³ÉËùÓй¤×÷¡£ÔÚJava 1.0ÖУ¬-d±êÖ¾±¨¸æÄ¿Â¼ËäÈ»Òѱ»É¾³ý£¬µ«ËüÒÀÈ»´æÔÚ£»µ«ÔÚJava 1.1ÖУ¬Ä¿Â¼»á±»Êµ¼Êɾ³ý¡£

10.5 IOÁ÷µÄµäÐÍÓ¦ÓÃ
¾¡¹Ü¿âÄÚ´æÔÚ´óÁ¿IOÁ÷À࣬¿Éͨ¹ý¶àÖÖ²»Í¬µÄ·½Ê½×éºÏµ½Ò»Æð£¬µ«Êµ¼ÊÉÏÖ»Óм¸ÖÖ·½Ê½²Å»á¾­³£Óõ½¡£È»¶ø£¬±ØÐëСÐÄÔÚÒâ²ÅÄܵõ½ÕýÈ·µÄ×éºÏ¡£ÏÂÃæÕâ¸öÏ൱³¤µÄÀý×ÓչʾÁ˵äÐÍIOÅäÖõĴ´½¨ÓëʹÓ㬿ÉÔÚд×Ô¼ºµÄ´úÂëʱ½«Æä×÷Ϊһ¸ö²Î¿¼Ê¹Óá£×¢Òâÿ¸öÅäÖö¼ÒÔÒ»¸ö×¢ÊÍÐÎʽµÄ±àºÅÆðÍ·£¬²¢ÌṩÁËÊʵ±µÄ½âÊÍÐÅÏ¢¡£
//: IOStreamDemo.java
// Typical IO Stream Configurations
import java.io.*;
import com.bruceeckel.tools.*;

public class IOStreamDemo {
  public static void main(String[] args) {
    try {
      // 1. Buffered input file
      DataInputStream in =
        new DataInputStream(
          new BufferedInputStream(
            new FileInputStream(args[0])));
      String s, s2 = new String();
      while((s = in.readLine())!= null)
        s2 += s + "\n";
      in.close();

      // 2. Input from memory
      StringBufferInputStream in2 =
          new StringBufferInputStream(s2);
      int c;
      while((c = in2.read()) != -1)
        System.out.print((char)c);

      // 3. Formatted memory input
      try {
        DataInputStream in3 =
          new DataInputStream(
            new StringBufferInputStream(s2));
        while(true)
          System.out.print((char)in3.readByte());
      } catch(EOFException e) {
        System.out.println(
          "End of stream encountered");
      }

      // 4. Line numbering & file output
      try {
        LineNumberInputStream li =
          new LineNumberInputStream(
            new StringBufferInputStream(s2));
        DataInputStream in4 =
          new DataInputStream(li);
        PrintStream out1 =
          new PrintStream(
            new BufferedOutputStream(
              new FileOutputStream(
                "IODemo.out")));
        while((s = in4.readLine()) != null )
          out1.println(
            "Line " + li.getLineNumber() + s);
        out1.close(); // finalize() not reliable!
      } catch(EOFException e) {
        System.out.println(
          "End of stream encountered");
      }

      // 5. Storing & recovering data
      try {
        DataOutputStream out2 =
          new DataOutputStream(
            new BufferedOutputStream(
              new FileOutputStream("Data.txt")));
        out2.writeBytes(
          "Here's the value of pi: \n");
        out2.writeDouble(3.14159);
        out2.close();
        DataInputStream in5 =
          new DataInputStream(
            new BufferedInputStream(
              new FileInputStream("Data.txt")));
        System.out.println(in5.readLine());
        System.out.println(in5.readDouble());
      } catch(EOFException e) {
        System.out.println(
          "End of stream encountered");
      }

      // 6. Reading/writing random access files
      RandomAccessFile rf =
        new RandomAccessFile("rtest.dat", "rw");
      for(int i = 0; i < 10; i++)
        rf.writeDouble(i*1.414);
      rf.close();

      rf =
        new RandomAccessFile("rtest.dat", "rw");
      rf.seek(5*8);
      rf.writeDouble(47.0001);
      rf.close();

      rf =
        new RandomAccessFile("rtest.dat", "r");
      for(int i = 0; i < 10; i++)
        System.out.println(
          "Value " + i + ": " +
          rf.readDouble());
      rf.close();

      // 7. File input shorthand
      InFile in6 = new InFile(args[0]);
      String s3 = new String();
      System.out.println(
        "First line in file: " +
        in6.readLine());
        in6.close();

      // 8. Formatted file output shorthand
      PrintFile out3 = new PrintFile("Data2.txt");
      out3.print("Test of PrintFile");
      out3.close();

      // 9. Data file output shorthand
      OutFile out4 = new OutFile("Data3.txt");
      out4.writeBytes("Test of outDataFile\n\r");
      out4.writeChars("Test of outDataFile\n\r");
      out4.close();

    } catch(FileNotFoundException e) {
      System.out.println(
        "File Not Found:" + args[0]);
    } catch(IOException e) {
      System.out.println("IO Exception");
    }
  }
} ///:~

10.5.1 ÊäÈëÁ÷
µ±È»£¬ÎÒÃǾ­³£Ïë×öµÄÒ»¼þÊÂÇéÊǽ«¸ñʽ»¯µÄÊä³ö´òÓ¡µ½¿ØÖÆÌ¨£¬µ«ÄÇÒÑÔÚµÚ5Õ´´½¨µÄcom.bruceeckel.toolsÖеõ½Á˼ò»¯¡£
µÚ1µ½µÚ4²¿·ÖÑÝʾÁËÊäÈëÁ÷µÄ´´½¨ÓëʹÓ㨾¡¹ÜµÚ4²¿·ÖչʾÁ˽«Êä³öÁ÷×÷Ϊһ¸ö²âÊÔ¹¤¾ßµÄ¼òµ¥Ó¦Óã©¡£

1. »º³åµÄÊäÈëÎļþ
Ϊ´ò¿ªÒ»¸öÎļþÒÔ±ãÊäÈ룬ÐèҪʹÓÃÒ»¸öFileInputStream£¬Í¬Ê±½«Ò»¸öString»òFile¶ÔÏó×÷ΪÎļþÃûʹÓá£ÎªÌá¸ßËÙ¶È£¬×îºÃÏȶÔÎļþ½øÐлº³å´¦Àí£¬´Ó¶ø»ñµÃÓÃÓÚÒ»¸öBufferedInputStreamµÄ¹¹½¨Æ÷µÄ½á¹û¾ä±ú¡£ÎªÁËÒÔ¸ñʽ»¯µÄÐÎʽ¶ÁÈ¡ÊäÈëÊý¾Ý£¬ÎÒÃǽ«ÄǸö½á¹û¾ä±ú¸³¸øÓÃÓÚÒ»¸öDataInputStreamµÄ¹¹½¨Æ÷¡£DataInputStreamÊÇÎÒÃǵÄ×îÖÕ£¨final£©¶ÔÏ󣬲¢ÊÇÎÒÃǽøÐжÁÈ¡²Ù×÷µÄ½Ó¿Ú¡£
ÔÚÕâ¸öÀý×ÓÖУ¬Ö»Óõ½ÁËreadLine()·½·¨£¬µ«ÀíËùµ±È»ÈκÎDataInputStream·½·¨¶¼¿ÉÒÔ²ÉÓá£Ò»µ©µÖ´ïÎļþĩ⣬readLine()¾Í»á·µ»ØÒ»¸önull£¨¿Õ£©£¬ÒÔ±ãÖÐÖ¹²¢Í˳öwhileÑ­»·¡£
¡°String s2¡±ÓÃÓÚ¾Û¼¯ÍêÕûµÄÎļþÄÚÈÝ£¨°üÀ¨±ØÐëÌí¼ÓµÄÐÂÐУ¬ÒòΪreadLine()È¥³ýÁËÄÇЩÐУ©¡£Ëæºó£¬ÔÚ±¾³ÌÐòµÄºóÃæ²¿·ÖÖÐʹÓÃs2¡£×îºó£¬ÎÒÃǵ÷ÓÃclose()£¬ÓÃËü¹Ø±ÕÎļþ¡£´Ó¼¼ÊõÉÏ˵£¬»áÔÚÔËÐÐfinalize()ʱµ÷ÓÃclose()¡£¶øÇÒÎÒÃÇÏ£ÍûÒ»µ©³ÌÐòÍ˳ö£¬¾Í·¢ÉúÕâÖÖÇé¿ö£¨ÎÞÂÛÊÇ·ñ½øÐÐÀ¬»øÊÕ¼¯£©¡£È»¶ø£¬Java 1.0ÓÐÒ»¸ö·Ç³£Í»³öµÄ´íÎó£¨Bug£©£¬Ôì³ÉÕâÖÖÇé¿ö²»»á·¢Éú¡£ÔÚJava 1.1ÖУ¬±ØÐëÃ÷È·µ÷ÓÃSystem.runFinalizersOnExit(true)£¬ÓÃËü±£Ö¤»áΪϵͳÖеÄÿ¸ö¶ÔÏóµ÷ÓÃfinalize()¡£È»¶ø£¬×ȫµÄ·½·¨»¹ÊÇΪÎļþÃ÷È·µ÷ÓÃclose()¡£

2. ´ÓÄÚ´æÊäÈë
ÕâÒ»²¿·Ö²ÉÓÃÒѾ­°üº¬ÁËÍêÕûÎļþÄÚÈݵÄString s2£¬²¢ÓÃËü´´½¨Ò»¸öStringBufferInputStream£¨×Ö´®»º³åÊäÈëÁ÷£©¡ª¡ª×÷Ϊ¹¹½¨Æ÷µÄ²ÎÊý£¬ÒªÇóʹÓÃÒ»¸öString£¬¶ø·ÇÒ»¸öStringBuffer£©¡£Ëæºó£¬ÎÒÃÇÓÃread()ÒÀ´Î¶Áȡÿ¸ö×Ö·û£¬²¢½«Æä·¢ËÍÖÁ¿ØÖÆÌ¨¡£×¢Òâread()½«ÏÂÒ»¸ö×Ö½Ú·µ»ØÎªint£¬ËùÒÔ±ØÐ뽫ÆäÔìÐÍΪһ¸öchar£¬ÒÔ±ãÕýÈ·µØ´òÓ¡¡£

3. ¸ñʽ»¯ÄÚ´æÊäÈë
StringBufferInputStreamµÄ½Ó¿ÚÊÇÓÐÏ޵ģ¬ËùÒÔͨ³£ÐèÒª½«Æä·â×°µ½Ò»¸öDataInputStreamÄÚ£¬´Ó¶øÔöÇ¿ËüµÄÄÜÁ¦¡£È»¶ø£¬ÈôÑ¡ÔñÓÃreadByte()ÿ´Î¶Á³öÒ»¸ö×Ö·û£¬ÄÇôËùÓÐÖµ¶¼ÊÇÓÐЧµÄ£¬ËùÒÔ²»¿ÉÔÙÓ÷µ»ØÖµÀ´Õì²âºÎʱ½áÊøÊäÈë¡£Ïà·´£¬¿ÉÓÃavailable()·½·¨ÅжÏÓжàÉÙ×Ö·û¿ÉÓá£ÏÂÃæÕâ¸öÀý×ÓչʾÁËÈçºÎ´ÓÎļþÖÐÒ»´Î¶Á³öÒ»¸ö×Ö·û£º
//: TestEOF.java
// Testing for the end of file while reading
// a byte at a time.
import java.io.*;

public class TestEOF {
  public static void main(String[] args) {
    try {
      DataInputStream in = 
        new DataInputStream(
         new BufferedInputStream(
          new FileInputStream("TestEof.java")));
      while(in.available() != 0)
        System.out.print((char)in.readByte());
    } catch (IOException e) {
      System.err.println("IOException");
    }
  }
} ///:~

×¢ÒâÈ¡¾öÓÚµ±Ç°´ÓʲôýÌå¶ÁÈ룬avaiable()µÄ¹¤×÷·½Ê½Ò²ÊÇÓÐËùÇø±ðµÄ¡£ËüÔÚ×ÖÃæÉÏÒâζ×Å¡°¿ÉÒÔ²»ÊÜ×èÈû¶ÁÈ¡µÄ×Ö½ÚÊýÁ¿¡±¡£¶ÔÒ»¸öÎļþÀ´Ëµ£¬ËüÒâζ×ÅÕû¸öÎļþ¡£µ«¶ÔÒ»¸ö²»Í¬ÖÖÀàµÄÊý¾ÝÁ÷À´Ëµ£¬ËüÈ´¿ÉÄÜÓв»Í¬µÄº¬Òå¡£Òò´ËÔÚʹÓÃʱӦ¿¼ÂÇÖÜÈ«¡£
ΪÁËÔÚÕâÑùµÄÇé¿öÏÂÕì²âÊäÈëµÄ½áÊø£¬Ò²¿ÉÒÔͨ¹ý²¶»ñÒ»¸öÎ¥ÀýÀ´ÊµÏÖ¡£È»¶ø£¬ÈôÕæµÄÓÃÎ¥ÀýÀ´¿ØÖÆÊý¾ÝÁ÷£¬È´ÏÔµÃÓÐЩ´ó²ÄСÓá£

4. ÐеıàºÅÓëÎļþÊä³ö
Õâ¸öÀý×ÓչʾÁËÈçºÎLineNumberInputStreamÀ´¸ú×ÙÊäÈëÐеıàºÅ¡£ÔÚÕâÀ²»¿É¼òµ¥µØ½«ËùÓй¹½¨Æ÷¶¼×éºÏÆðÀ´£¬ÒòΪ±ØÐë±£³ÖLineNumberInputStreamµÄÒ»¸ö¾ä±ú£¨×¢ÒâÕâ²¢·ÇÒ»Öּ̳л·¾³£¬ËùÒÔ²»Äܼòµ¥µØ½«in4ÔìÐ͵½Ò»¸öLineNumberInputStream£©¡£Òò´Ë£¬liÈÝÄÉÁËÖ¸ÏòLineNumberInputStreamµÄ¾ä±ú£¬È»ºóÔÚËüµÄ»ù´¡ÉÏ´´½¨Ò»¸öDataInputStream£¬ÒÔ±ã¶ÁÈëÊý¾Ý¡£
Õâ¸öÀý×ÓҲչʾÁËÈçºÎ½«¸ñʽ»¯Êý¾ÝдÈëÒ»¸öÎļþ¡£Ê×ÏÈ´´½¨ÁËÒ»¸öFileOutputStream£¬ÓÃËüͬһ¸öÎļþÁ¬½Ó¡£¿¼Âǵ½Ð§ÂÊ·½ÃæµÄÔ­Òò£¬ËüÉú³ÉÁËÒ»¸öBufferedOutputStream¡£Õ⼸ºõ¿Ï¶¨ÊÇÎÒÃÇÒ»°ãµÄ×ö·¨£¬µ«È´±ØÐëÃ÷È·µØÕâÑù×ö¡£ËæºóΪÁ˽øÐиñʽ»¯£¬Ëüת»»³ÉÒ»¸öPrintStream¡£ÓÃÕâÖÖ·½Ê½´´½¨µÄÊý¾ÝÎļþ¿É×÷Ϊһ¸öԭʼµÄÎı¾Îļþ¶ÁÈ¡¡£
±êÖ¾DataInputStreamºÎʱ½áÊøµÄÒ»¸ö·½·¨ÊÇreadLine()¡£Ò»µ©Ã»Óиü¶àµÄ×Ö´®¿ÉÒÔ¶ÁÈ¡£¬Ëü¾Í»á·µ»Ønull¡£Ã¿¸öÐж¼»á°éËæ×Ô¼ºµÄÐкŴòÓ¡µ½ÎļþÀï¡£¸ÃÐкſÉͨ¹ýli²éѯ¡£
¿É¿´µ½ÓÃÓÚout1µÄ¡¢Ò»¸öÃ÷È·Ö¸¶¨µÄclose()¡£Èô³ÌÐò×¼±¸µôתͷÀ´£¬²¢ÔٴζÁÈ¡ÏàͬµÄÎļþ£¬ÕâÖÖ×ö·¨¾ÍÏÔµÃÏ൱ÓÐÓá£È»¶ø£¬¸Ã³ÌÐòÖ±µ½½áÊøÒ²Ã»Óмì²éÎļþIODemo.txt¡£ÕýÈçÒÔǰָ³öµÄÄÇÑù£¬Èç¹û²»Îª×Ô¼ºµÄËùÓÐÊä³öÎļþµ÷ÓÃclose()£¬¾Í¿ÉÄÜ·¢ÏÖ»º³åÇø²»»áµÃµ½Ë¢Ð£¬Ôì³ÉËüÃDz»ÍêÕû¡£¡£

10.5.2 Êä³öÁ÷
Á½ÀàÖ÷ÒªµÄÊä³öÁ÷Êǰ´ËüÃÇдÈëÊý¾ÝµÄ·½Ê½»®·ÖµÄ£ºÒ»ÖÖ°´È˵Äϰ¹ßдÈ룬ÁíÒ»ÖÖΪÁËÒÔºóÓÉÒ»¸öDataInputStream¶øÐ´Èë¡£RandomAccessFileÊǶÀÁ¢µÄ£¬¾¡¹ÜËüµÄÊý¾Ý¸ñʽ¼æÈÝÓÚDataInputStreamºÍDataOutputStream¡£

5. ±£´æÓë»Ö¸´Êý¾Ý
PrintStreamÄܸñʽ»¯Êý¾Ý£¬Ê¹ÆäÄܰ´ÎÒÃǵÄϰ¹ßÔĶÁ¡£µ«ÎªÁËÊä³öÊý¾Ý£¬ÒÔ±ãÓÉÁíÒ»¸öÊý¾ÝÁ÷»Ö¸´£¬ÔòÐèÓÃÒ»¸öDataOutputStreamдÈëÊý¾Ý£¬²¢ÓÃÒ»¸öDataInputStream»Ö¸´£¨»ñÈ¡£©Êý¾Ý¡£µ±È»£¬ÕâЩÊý¾ÝÁ÷¿ÉÒÔÊÇÈκζ«Î÷£¬µ«ÕâÀï²ÉÓõÄÊÇÒ»¸öÎļþ£¬²¢½øÐÐÁË»º³å´¦Àí£¬ÒÔ¼Ó¿ì¶ÁдËÙ¶È¡£
×¢Òâ×Ö´®ÊÇÓÃwriteBytes()дÈëµÄ£¬¶ø·ÇwriteChars()¡£ÈôʹÓúóÕߣ¬Ð´ÈëµÄ¾ÍÊÇ16λUnicode×Ö·û¡£ÓÉÓÚDataInputStreamÖÐûÓв¹³äµÄ¡°readChars¡±·½·¨£¬ËùÒÔ²»µÃ²»ÓÃreadChar()ÿ´ÎÈ¡³öÒ»¸ö×Ö·û¡£ËùÒÔ¶ÔASCIIÀ´Ëµ£¬¸ü·½±ãµÄ×ö·¨Êǽ«×Ö·û×÷Ϊ×Ö½ÚдÈ룬ÔÚºóÃæ¸úËæÒ»¸öÐÂÐУ»È»ºóÔÙÓÃreadLine()½«×Ö·ûµ±×÷ÆÕͨµÄASCIIÐжÁ»Ø¡£
writeDouble()½«doubleÊý×Ö±£´æµ½Êý¾ÝÁ÷ÖУ¬²¢Óò¹³äµÄreadDouble()»Ö¸´Ëü¡£µ«ÎªÁ˱£Ö¤ÈκζÁ·½·¨Äܹ»Õý³£¹¤×÷£¬±ØÐëÖªµÀÊý¾ÝÏîÔÚÁ÷ÖеÄ׼ȷλÖã¬ÒòΪ¼ÈÓпÉÄܽ«±£´æµÄdoubleÊý¾Ý×÷Ϊһ¸ö¼òµ¥µÄ×Ö½ÚÐòÁжÁÈ룬ҲÓпÉÄÜ×÷Ϊchar»òÆäËû¸ñʽ¶ÁÈë¡£ËùÒÔ±ØÐëҪôΪÎļþÖеÄÊý¾Ý²ÉÓù̶¨µÄ¸ñʽ£¬ÒªÃ´½«¶îÍâµÄÐÅÏ¢±£´æµ½ÎļþÖУ¬ÒÔ±ãÕýÈ·ÅжÏÊý¾ÝµÄ´æ·ÅλÖá£

6. ¶ÁÐ´Ëæ»ú·ÃÎÊÎļþ
ÕýÈçÔçÏÈÖ¸³öµÄÄÇÑù£¬RandomAccessFileÓëIO²ã´Î½á¹¹µÄÊ£Óಿ·Ö¼¸ºõÊÇÍêÈ«¸ôÀëµÄ£¬¾¡¹ÜËüҲʵÏÖÁËDataInputºÍDataOutput½Ó¿Ú¡£ËùÒÔ²»¿É½«ÆäÓëInputStream¼°OutputStream×ÓÀàµÄÈκβ¿·Ö¹ØÁªÆðÀ´¡£¾¡¹ÜÒ²ÐíÄܽ«Ò»¸öByteArrayInputStreamµ±×÷Ò»¸öËæ»ú·ÃÎÊÔªËØ¶Ô´ý£¬µ«Ö»ÄÜÓÃRandomAccessFile´ò¿ªÒ»¸öÎļþ¡£±ØÐë¼Ù¶¨RandomAccessFileÒѵõ½ÁËÕýÈ·µÄ»º³å£¬ÒòΪÎÒÃDz»ÄÜ×ÔÐÐÑ¡Ôñ¡£
¿ÉÒÔ×ÔÐÐÑ¡ÔñµÄÊǵڶþ¸ö¹¹½¨Æ÷²ÎÊý£º¿É¾ö¶¨ÒÔ¡°Ö»¶Á¡±£¨r£©·½Ê½»ò¡°¶Áд¡±£¨rw£©·½Ê½´ò¿ªÒ»¸öRandomAccessFileÎļþ¡£
ʹÓÃRandomAccessFileµÄʱºò£¬ÀàËÆÓÚ×éºÏʹÓÃDataInputStreamºÍDataOutputStream£¨ÒòΪËüʵÏÖÁ˵ÈͬµÄ½Ó¿Ú£©¡£³ý´ËÒÔÍ⣬»¹¿É¿´µ½³ÌÐòÖÐʹÓÃÁËseek()£¬ÒÔ±ãÔÚÎļþÖе½´¦Òƶ¯£¬¶Ôij¸öÖµ×÷³öÐ޸ġ£

10.5.3 ¿ì½ÝÎļþ´¦Àí
ÓÉÓÚÒÔǰ²ÉÓõÄһЩµäÐÍÐÎʽ¶¼Éæ¼°µ½Îļþ´¦Àí£¬ËùÒÔ´ó¼ÒÒ²Ðí»á»³ÒÉΪʲôҪ½øÐÐÄÇô¶àµÄ´úÂëÊäÈ롪¡ªÕâÕýÊÇ×°ÊÎÆ÷·½°¸Ò»¸öȱµã¡£±¾²¿·Ö½«Ïò´ó¼ÒչʾÈçºÎ´´½¨ºÍʹÓõäÐÍÎļþ¶ÁÈ¡ºÍдÈëÅäÖõĿì½Ý°æ±¾¡£ÕâЩ¿ì½Ý°æ±¾¾ùÖÃÈëpackagecom.bruceeckel.toolsÖУ¨×ÔµÚ5Õ¿ªÊ¼´´½¨£©¡£ÎªÁ˽«Ã¿¸öÀà¶¼Ìí¼Óµ½¿âÄÚ£¬Ö»Ð轫ÆäÖÃÈëÊʵ±µÄĿ¼£¬²¢Ìí¼Ó¶ÔÓ¦µÄpackageÓï¾ä¼´¿É¡£

7. ¿ìËÙÎļþÊäÈë
ÈôÏë´´½¨Ò»¸ö¶ÔÏó£¬ÓÃËü´ÓÒ»¸ö»º³åµÄDataInputStreamÖжÁȡһ¸öÎļþ£¬¿É½«Õâ¸ö¹ý³Ì·â×°µ½Ò»¸öÃûΪInFileµÄÀàÄÚ¡£ÈçÏÂËùʾ£º
//: InFile.java
// Shorthand class for opening an input file
package com.bruceeckel.tools;
import java.io.*;

public class InFile extends DataInputStream {
  public InFile(String filename)
    throws FileNotFoundException {
    super(
      new BufferedInputStream(
        new FileInputStream(filename)));
  }
  public InFile(File file)
    throws FileNotFoundException {
    this(file.getPath());
  }
} ///:~

ÎÞÂÛ¹¹½¨Æ÷µÄString°æ±¾»¹ÊÇFile°æ±¾¶¼°üÀ¨ÔÚÄÚ£¬ÓÃÓÚ¹²Í¬´´½¨Ò»¸öFileInputStream¡£
¾ÍÏóÕâ¸öÀý×ÓչʾµÄÄÇÑù£¬ÏÖÔÚ¿ÉÒÔÓÐЧ¼õÉÙ´´½¨ÎļþʱÓÉÓÚÖØ¸´Ç¿µ÷Ôì³ÉµÄÎÊÌâ¡£

8. ¿ìËÙÊä³ö¸ñʽ»¯Îļþ
Òà¿ÉÓÃͬÀàÐ͵ķ½·¨´´½¨Ò»¸öPrintStream£¬ÁîÆäдÈëÒ»¸ö»º³åÎļþ¡£ÏÂÃæÊǶÔcom.bruceeckel.toolsµÄÀ©Õ¹£º
//: PrintFile.java
// Shorthand class for opening an output file
// for human-readable output.
package com.bruceeckel.tools;
import java.io.*;

public class PrintFile extends PrintStream {
  public PrintFile(String filename)
    throws IOException {
    super(
      new BufferedOutputStream(
        new FileOutputStream(filename)));
  }
  public PrintFile(File file)
    throws IOException {
    this(file.getPath());
  }
} ///:~

×¢Òâ¹¹½¨Æ÷²»¿ÉÄܲ¶»ñÒ»¸öÓÉ»ù´¡À๹½¨Æ÷¡°ÖÀ¡±³öµÄÎ¥Àý¡£

9. ¿ìËÙÊä³öÊý¾ÝÎļþ
×îºó£¬ÀûÓÃÀàËÆµÄ¿ì½Ý·½Ê½¿É´´½¨Ò»¸ö»º³åÊä³öÎļþ£¬ÓÃËü±£´æÊý¾Ý£¨ÓëÓÉÈ˹ۿ´µÄÊý¾Ý¸ñʽÏà·´£©£º
//: OutFile.java
// Shorthand class for opening an output file
// for data storage.
package com.bruceeckel.tools;
import java.io.*;

public class OutFile extends DataOutputStream {
  public OutFile(String filename)
    throws IOException {
    super(
      new BufferedOutputStream(
        new FileOutputStream(filename)));
  }
  public OutFile(File file)
    throws IOException {
    this(file.getPath());
  }
} ///:~

·Ç³£Ææ¹ÖµÄÊÇ£¨Ò²·Ç³£²»ÐÒ£©£¬Java¿âµÄÉè¼ÆÕß¾ÓȻûÏëµ½½«ÕâЩ±ãÀû´ëʩֱ½Ó×÷ΪËûÃǵÄÒ»²¿·Ö±ê×¼Ìṩ¡£

10.5.4 ´Ó±ê×¼ÊäÈëÖжÁÈ¡Êý¾Ý
ÒÔUnixÊ×Ïȳ«µ¼µÄ¡°±ê×¼ÊäÈ롱¡¢¡°±ê×¼Êä³ö¡±ÒÔ¼°¡°±ê×¼´íÎóÊä³ö¡±¸ÅÄîΪ»ù´¡£¬JavaÌṩÁËÏàÓ¦µÄSystem.in£¬System.outÒÔ¼°System.err¡£¹áÕâÒ»Õû±¾Ê飬´ó¼Ò¶¼»á½Ó´¥µ½ÈçºÎÓÃSystem.out½øÐбê×¼Êä³ö£¬ËüÒÑÔ¤·â×°³ÉÒ»¸öPrintStream¶ÔÏó¡£System.errͬÑùÊÇÒ»¸öPrintStream£¬µ«System.inÊÇÒ»¸öԭʼµÄInputStream£¬Î´½øÐÐÈκηâ×°´¦Àí¡£ÕâÒâζמ¡¹ÜÄÜÖ±½ÓʹÓÃSystem.outºÍSystem.err£¬µ«±ØÐëÊÂÏÈ·â×°System.in£¬·ñÔò²»ÄÜ´ÓÖжÁÈ¡Êý¾Ý¡£
µäÐÍÇé¿öÏ£¬ÎÒÃÇÏ£ÍûÓÃreadLine()ÿ´Î¶ÁȡһÐÐÊäÈëÐÅÏ¢£¬ËùÒÔÐèÒª½«System.in·â×°µ½Ò»¸öDataInputStreamÖС£ÕâÊÇJava 1.0½øÐÐÐÐÊäÈëʱ²ÉÈ¡µÄ¡°ÀÏ¡±°ì·¨¡£ÔÚ±¾ÕÂÉԺ󣬴ó¼Ò»¹»á¿´µ½Java 1.1µÄ½â¾ö·½°¸¡£ÏÂÃæÊǸö¼òµ¥µÄÀý×Ó£¬×÷ÓÃÊÇ»ØÓ¦ÎÒÃǼüÈëµÄÿһÐÐÄÚÈÝ£º
//: Echo.java
// How to read from standard input
import java.io.*;

public class Echo {
  public static void main(String[] args) {
    DataInputStream in =
      new DataInputStream(
        new BufferedInputStream(System.in));
    String s;
    try {
      while((s = in.readLine()).length() != 0)
        System.out.println(s);
      // An empty line terminates the program
    } catch(IOException e) {
      e.printStackTrace();
    }
  }
} ///:~

Ö®ËùÒÔҪʹÓÃtry¿é£¬ÊÇÓÉÓÚreadLine()¿ÉÄÜ¡°ÖÀ¡±³öÒ»¸öIOException¡£×¢ÒâͬÆäËû´ó¶àÊýÁ÷Ò»Ñù£¬Ò²Ó¦¶ÔSystem.in½øÐлº³å¡£
ÓÉÓÚÔÚÿ¸ö³ÌÐòÖж¼Òª½«System.in·â×°µ½Ò»¸öDataInputStreamÄÚ£¬ËùÒÔÏÔµÃÓе㲻·½±ã¡£µ«²ÉÓÃÕâÖÖÉè¼Æ·½°¸£¬¿ÉÒÔ»ñµÃ×î´óµÄÁé»îÐÔ¡£

10.5.5 ¹ÜµÀÊý¾ÝÁ÷
±¾ÕÂÒѼòÒª½éÉÜÁËPipedInputStream£¨¹ÜµÀÊäÈëÁ÷£©ºÍPipedOutputStream£¨¹ÜµÀÊä³öÁ÷£©¡£¾¡¹ÜÃèÊö²»Ê®·ÖÏêϸ£¬µ«²¢²»ÊÇ˵ËüÃÇ×÷Óò»´ó¡£È»¶ø£¬Ö»ÓÐÔÚÕÆÎÕÁ˶àÏ̴߳¦ÀíµÄ¸ÅÄîºó£¬²Å¿ÉÕæÕýÌå»áËüÃǵļÛÖµËùÔÚ¡£Ô­ÒòºÜ¼òµ¥£¬ÒòΪ¹ÜµÀ»¯µÄÊý¾ÝÁ÷¾ÍÊÇÓÃÓÚÏß³ÌÖ®¼äµÄͨÐÅ¡£Õâ·½ÃæµÄÎÊÌ⽫ÔÚµÚ14ÕÂÓÃÒ»¸öʾÀý˵Ã÷¡£

10.6 StreamTokenizer
¾¡¹ÜStreamTokenizer²¢²»ÊÇ´ÓInputStream»òOutputStreamÑÜÉúµÄ£¬µ«ËüÖ»ËæÍ¬InputStream¹¤×÷£¬ËùÒÔÊ®·ÖÇ¡µ±µØ°üÀ¨ÔÚ¿âµÄIO²¿·ÖÖС£
StreamTokenizerÀàÓÃÓÚ½«ÈκÎInputStream·Ö¸îΪһϵÁС°¼ÇºÅ¡±£¨Token£©¡£ÕâЩ¼ÇºÅʵ¼ÊÊÇһЩ¶ÏÐøµÄÎı¾¿é£¬ÖмäÓÃÎÒÃÇÑ¡ÔñµÄÈκζ«Î÷·Ö¸ô¡£ÀýÈ磬ÎÒÃǵļǺſÉÒÔÊǵ¥´Ê£¬ÖмäÓÿհף¨¿Õ¸ñ£©ÒÔ¼°±êµã·ûºÅ·Ö¸ô¡£
ÏÂÃæÊÇÒ»¸ö¼òµ¥µÄ³ÌÐò£¬ÓÃÓÚ¼ÆËã¸÷¸öµ¥´ÊÔÚÎı¾ÎļþÖÐÖØ¸´³öÏֵĴÎÊý£º
//: SortedWordCount.java
// Counts words in a file, outputs
// results in sorted form.
import java.io.*;
import java.util.*;
import c08.*; // Contains StrSortVector

class Counter {
  private int i = 1;
  int read() { return i; }
  void increment() { i++; }
}

public class SortedWordCount {
  private FileInputStream file;
  private StreamTokenizer st;
  private Hashtable counts = new Hashtable();
  SortedWordCount(String filename)
    throws FileNotFoundException {
    try {
      file = new FileInputStream(filename);
      st = new StreamTokenizer(file);
      st.ordinaryChar('.');
      st.ordinaryChar('-');
    } catch(FileNotFoundException e) {
      System.out.println(
        "Could not open " + filename);
      throw e;
    }
  }
  void cleanup() {
    try {
      file.close();
    } catch(IOException e) {
      System.out.println(
        "file.close() unsuccessful");
    }
  }
  void countWords() {
    try {
      while(st.nextToken() !=
        StreamTokenizer.TT_EOF) {
        String s;
        switch(st.ttype) {
          case StreamTokenizer.TT_EOL:
            s = new String("EOL");
            break;
          case StreamTokenizer.TT_NUMBER:
            s = Double.toString(st.nval);
            break;
          case StreamTokenizer.TT_WORD:
            s = st.sval; // Already a String
            break;
          default: // single character in ttype
            s = String.valueOf((char)st.ttype);
        }
        if(counts.containsKey(s))
          ((Counter)counts.get(s)).increment();
        else
          counts.put(s, new Counter());
      }
    } catch(IOException e) {
      System.out.println(
        "st.nextToken() unsuccessful");
    }
  }
  Enumeration values() {
    return counts.elements();
  }
  Enumeration keys() { return counts.keys(); }
  Counter getCounter(String s) {
    return (Counter)counts.get(s);
  }
  Enumeration sortedKeys() {
    Enumeration e = counts.keys();
    StrSortVector sv = new StrSortVector();
    while(e.hasMoreElements())
      sv.addElement((String)e.nextElement());
    // This call forces a sort:
    return sv.elements();
  }
  public static void main(String[] args) {
    try {
      SortedWordCount wc =
        new SortedWordCount(args[0]);
      wc.countWords();
      Enumeration keys = wc.sortedKeys();
      while(keys.hasMoreElements()) {
        String key = (String)keys.nextElement();
        System.out.println(key + ": "
                 + wc.getCounter(key).read());
      }
      wc.cleanup();
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
} ///:~

×îºÃ½«½á¹û°´ÅÅÐò¸ñʽÊä³ö£¬µ«ÓÉÓÚJava 1.0ºÍJava 1.1¶¼Ã»ÓÐÌṩÈκÎÅÅÐò·½·¨£¬ËùÒÔ±ØÐëÓÉ×Ô¼º¶¯ÊÖ¡£Õâ¸öÄ¿±ê¿ÉÓÃÒ»¸öStrSortVector·½±ãµØ´ï³É£¨´´½¨ÓÚµÚ8Õ£¬ÊôÓÚÄÇÒ»Õ´´½¨µÄÈí¼þ°üµÄÒ»²¿·Ö¡£¼Çס±¾ÊéËùÓÐ×ÓĿ¼µÄÆðʼĿ¼¶¼±ØÐëλÓÚÀà·¾¶ÖУ¬·ñÔò³ÌÐò½«²»ÄÜÕýÈ·µØ±àÒ룩¡£
Ϊ´ò¿ªÎļþ£¬Ê¹ÓÃÁËÒ»¸öFileInputStream¡£¶øÇÒΪÁ˽«Îļþת»»³Éµ¥´Ê£¬´ÓFileInputStreamÖд´½¨ÁËÒ»¸öStreamTokenizer¡£ÔÚStreamTokenizerÖУ¬´æÔÚÒ»¸öĬÈϵķָô·ûÁÐ±í£¬ÎÒÃÇ¿ÉÓÃһϵÁз½·¨¼ÓÈë¸ü¶àµÄ·Ö¸ô·û¡£ÔÚÕâÀÎÒÃÇÓÃordinaryChar()Ö¸³ö¡°¸Ã×Ö·ûûÓÐÌØ±ðÖØÒªµÄÒâÒ塱£¬ËùÒÔ½âÎöÆ÷²»»á°ÑËüµ±×÷×Ô¼º´´½¨µÄÈκε¥´ÊµÄÒ»²¿·Ö¡£ÀýÈ磬st.ordinaryChar('.')±íʾСÊýµã²»»á³ÉΪ½âÎö³öÀ´µÄµ¥´ÊµÄÒ»²¿·Ö¡£ÔÚÓëJavaÅäÌ×ÌṩµÄÁª»úÎĵµÖУ¬¿ÉÒÔÕÒµ½¸ü¶àµÄÏà¹ØÐÅÏ¢¡£
ÔÚcountWords()ÖУ¬Ã¿´Î´ÓÊý¾ÝÁ÷ÖÐÈ¡³öÒ»¸ö¼ÇºÅ£¬¶øttypeÐÅÏ¢µÄ×÷ÓÃÊÇÅж϶Ôÿ¸ö¼ÇºÅ²Éȡʲô²Ù×÷¡ª¡ªÒòΪ¼ÇºÅ¿ÉÄÜ´ú±íÒ»¸öÐÐβ¡¢Ò»¸öÊý×Ö¡¢Ò»¸ö×Ö´®»òÕßÒ»¸ö×Ö·û¡£
ÕÒµ½Ò»¸ö¼ÇºÅºó£¬»á²éѯHashtable counts£¬ºËʵÆäÖÐÊÇ·ñÒѾ­ÒÔ¡°¼ü¡±£¨Key£©µÄÐÎʽ°üº¬ÁËÒ»¸ö¼ÇºÅ¡£Èô´ð°¸Êǿ϶¨µÄ£¬¶ÔÓ¦µÄCounter£¨¼ÆÊýÆ÷£©¶ÔÏó¾Í»áÔöÖµ£¬Ö¸³öÒÑÕÒµ½¸Ãµ¥´ÊµÄÁíÒ»¸öʵÀý¡£Èô´ð°¸Îª·ñ£¬Ôòн¨Ò»¸öCounter¡ª¡ªÒòΪCounter¹¹½¨Æ÷»á½«ËüµÄÖµ³õʼ»¯Îª1£¬ÕýÊÇÎÒÃǼÆËãµ¥´ÊÊýÁ¿Ê±µÄÒªÇó¡£
SortedWordCount²¢²»ÊôÓÚHashtable£¨É¢ÁÐ±í£©µÄÒ»ÖÖÀàÐÍ£¬ËùÒÔËü²»»á¼Ì³Ð¡£ËüÖ´ÐеÄÒ»ÖÖÌØ¶¨ÀàÐ͵IJÙ×÷£¬ËùÒÔ¾¡¹Ükeys()ºÍvalues()·½·¨¶¼±ØÐëÖØÐ½Òʾ³öÀ´£¬µ«ÈÔ²»±íʾӦʹÓÃÄǸö¼Ì³Ð£¬ÒòΪ´óÁ¿Hashtable·½·¨ÔÚÕâÀï¶¼ÊDz»Êʵ±µÄ¡£³ý´ËÒÔÍ⣬¶ÔÓÚÁíһЩ·½·¨À´Ëµ£¨±ÈÈçgetCounter()¡ª¡ªÓÃÓÚ»ñµÃÒ»¸öÌØ¶¨×Ö´®µÄ¼ÆÊýÆ÷£»ÓÖÈçsortedKeys()¡ª¡ªÓÃÓÚ²úÉúÒ»¸öö¾Ù£©£¬ËüÃÇ×îÖÕ¶¼¸Ä±äÁËSortedWordCount½Ó¿ÚµÄÐÎʽ¡£
ÔÚmain()ÄÚ£¬ÎÒÃÇÓÃSortedWordCount´ò¿ªºÍ¼ÆËãÎļþÖеĵ¥´ÊÊýÁ¿¡ª¡ª×ܹ²Ö»ÓÃÁËÁ½ÐдúÂë¡£Ëæºó£¬ÎÒÃÇΪһ¸öÅźÃÐòµÄ¼ü£¨µ¥´Ê£©ÁбíÌáÈ¡³öÒ»¸öö¾Ù¡£²¢ÓÃËü»ñµÃÿ¸ö¼üÒÔ¼°Ïà¹ØµÄCount£¨¼ÆÊý£©¡£×¢Òâ±ØÐëµ÷ÓÃcleanup()£¬·ñÔòÎļþ²»ÄÜÕý³£¹Ø±Õ¡£
²ÉÓÃÁËStreamTokenizerµÄµÚ¶þ¸öÀý×Ó½«ÔÚµÚ17ÕÂÌṩ¡£

10.6.1 StringTokenizer
¾¡¹Ü²¢²»±ØÒªIO¿âµÄÒ»²¿·Ö£¬µ«StringTokenizerÌṩÁËÓëStreamTokenizer¼«ÏàËÆµÄ¹¦ÄÜ£¬ËùÒÔÔÚÕâÀïÒ»²¢½²Êö¡£
StringTokenizerµÄ×÷ÓÃÊÇÿ´Î·µ»Ø×Ö´®ÄÚµÄÒ»¸ö¼ÇºÅ¡£ÕâЩ¼ÇºÅÊÇһЩÓÉÖÆ±íÕ¾¡¢¿Õ¸ñÒÔ¼°ÐÂÐзָôµÄÁ¬Ðø×Ö·û¡£Òò´Ë£¬×Ö´®¡°Where is my cat?¡±µÄ¼ÇºÅ·Ö±ðÊÇ¡°Where¡±¡¢¡°is¡±¡¢¡°my¡±ºÍ¡°cat?¡±¡£ÓëStreamTokenizerÀàËÆ£¬ÎÒÃÇ¿ÉÒÔָʾStringTokenizer°´ÕÕÎÒÃǵÄÔ¸Íû·Ö¸îÊäÈë¡£µ«¶ÔÓÚStringTokenizer£¬È´ÐèÒªÏò¹¹½¨Æ÷´«µÝÁíÒ»¸ö²ÎÊý£¬¼´ÎÒÃÇÏëʹÓõķָô×Ö´®¡£Í¨³££¬Èç¹ûÏë½øÐиü¸´ÔӵIJÙ×÷£¬Ó¦Ê¹ÓÃStreamTokenizer¡£
¿ÉÓÃnextToken()ÏòStringTokenizer¶ÔÏóÇëÇó×Ö´®ÄÚµÄÏÂÒ»¸ö¼ÇºÅ¡£¸Ã·½·¨ÒªÃ´·µ»ØÒ»¸ö¼ÇºÅ£¬ÒªÃ´·µ»ØÒ»¸ö¿Õ×Ö´®£¨±íʾûÓмǺÅʣϣ©¡£
×÷Ϊһ¸öÀý×Ó£¬ÏÂÊö³ÌÐò½«Ö´ÐÐÒ»¸öÓÐÏ޵ľ䷨·ÖÎö£¬²éѯ¼ü¶ÌÓïÐòÁУ¬Á˽â¾ä×Ó°µÊ¾µÄÊÇ¿ìÀÖÒà»ò±¯É˵ĺ¬Òå¡£
//: AnalyzeSentence.java
// Look for particular sequences
// within sentences.
import java.util.*;

public class AnalyzeSentence {
  public static void main(String[] args) {
    analyze("I am happy about this");
    analyze("I am not happy about this");
    analyze("I am not! I am happy");
    analyze("I am sad about this");
    analyze("I am not sad about this");
    analyze("I am not! I am sad");
    analyze("Are you happy about this?");
    analyze("Are you sad about this?");
    analyze("It's you! I am happy");
    analyze("It's you! I am sad");
  }
  static StringTokenizer st;
  static void analyze(String s) {
    prt("\nnew sentence >> " + s);
    boolean sad = false;
    st = new StringTokenizer(s);
    while (st.hasMoreTokens()) {
      String token = next();
      // Look until you find one of the
      // two starting tokens:
      if(!token.equals("I") &&
         !token.equals("Are"))
        continue; // Top of while loop
      if(token.equals("I")) {
        String tk2 = next();
        if(!tk2.equals("am")) // Must be after I
          break; // Out of while loop
        else {
          String tk3 = next();
          if(tk3.equals("sad")) {
            sad = true;
            break; // Out of while loop
          }
          if (tk3.equals("not")) {
            String tk4 = next();
            if(tk4.equals("sad"))
              break; // Leave sad false
            if(tk4.equals("happy")) {
              sad = true;
              break;
            }
          }
        }
      }
      if(token.equals("Are")) {
        String tk2 = next();
        if(!tk2.equals("you"))
          break; // Must be after Are
        String tk3 = next();
        if(tk3.equals("sad"))
          sad = true;
        break; // Out of while loop
      }
    }
    if(sad) prt("Sad detected");
  }
  static String next() {
    if(st.hasMoreTokens()) {
      String s = st.nextToken();
      prt(s);
      return s;
    } 
    else
      return "";
  }
  static void prt(String s) {
    System.out.println(s);
  }
} ///:~

¶ÔÓÚ×¼±¸·ÖÎöµÄÿ¸ö×Ö´®£¬ÎÒÃǽøÈëÒ»¸öwhileÑ­»·£¬²¢½«¼ÇºÅ´ÓÄǸö×Ö´®ÖÐÈ¡³ö¡£Çë×¢ÒâµÚÒ»¸öifÓï¾ä£¬¼ÙÈç¼ÇºÅ¼È²»ÊÇ¡°I¡±£¬Ò²²»ÊÇ¡°Are¡±£¬¾Í»áÖ´ÐÐcontinue£¨·µ»ØÑ­»·Æðµã£¬ÔÙÒ»´Î¿ªÊ¼£©¡£ÕâÒâζ×ųý·Ç·¢ÏÖÒ»¸ö¡°I¡±»òÕß¡°Are¡±£¬²Å»áÕæÕýµÃµ½¼ÇºÅ¡£´ó¼Ò¿ÉÄÜÏëÓÃ==´úÌæequals()·½·¨£¬µ«ÄÇÑù×ö»á³öÏÖ²»Õý³£µÄ±íÏÖ£¬ÒòΪ==±È½ÏµÄÊǾä±úÖµ£¬¶øequals()±È½ÏµÄÊÇÄÚÈÝ¡£
analyze()·½·¨Ê£Óಿ·ÖµÄÂß¼­ÊÇËÑË÷¡°I am sad¡±£¨ÎÒºÜÓÇÉË¡¢¡°I am nothappy¡±£¨ÎÒ²»¿ìÀÖ£©»òÕß¡°Are you sad?¡±£¨Ä㱯ÉËÂ𣿣©ÕâÑùµÄ¾ä·¨¸ñʽ¡£ÈôûÓÐbreakÓï¾ä£¬Õâ·½ÃæµÄ´úÂëÉõÖÁ¿ÉÄܸü¼ÓÉ¢ÂÒ¡£´ó¼ÒӦעÒâ¶ÔÒ»¸öµäÐ͵ĽâÎöÆ÷À´Ëµ£¬Í¨³£¶¼ÓÐÕâЩ¼ÇºÅµÄÒ»¸ö±í¸ñ£¬²¢ÄÜÔÚ¶ÁȡмǺŵÄʱºòÓÃһС¶Î´úÂëÔÚ±í¸ñÄÚÒÆ¶¯¡£
ÎÞÂÛÈçºÎ£¬Ö»Ó¦½«StringTokenizer¿´×÷StreamTokenizerÒ»ÖÖ¼òµ¥¶øÇÒÌØÊâµÄ¼ò»¯ÐÎʽ¡£È»¶ø£¬Èç¹ûÓÐÒ»¸ö×Ö´®ÐèÒª½øÐмǺŴ¦Àí£¬¶øÇÒStringTokenizerµÄ¹¦ÄÜʵÔÚÓÐÏÞ£¬ÄÇôӦ¸Ã×öµÄÈ«²¿ÊÂÇé¾ÍÊÇÓÃStringBufferInputStream½«Æäת»»µ½Ò»¸öÊý¾ÝÁ÷ÀÔÙÓÃËü´´½¨Ò»¸ö¹¦ÄܸüÇ¿´óµÄStreamTokenizer¡£

10.7 Java 1.1µÄIOÁ÷
µ½Õâ¸öʱºò£¬´ó¼Ò»òÐí»áÏÝÈëÒ»ÖÖÀ§¾³Ö®ÖУ¬»³ÒÉÊÇ·ñ´æÔÚIOÁ÷µÄÁíÒ»ÖÖÉè¼Æ·½°¸£¬²¢¿ÉÄÜÒªÇó¸ü´óµÄ´úÂëÁ¿¡£»¹ÓÐÈËÄÜÌá³öÒ»ÖÖ¸ü¹Å¹ÖµÄÉè¼ÆÂð£¿ÊÂʵÉÏ£¬Java 1.1¶ÔIOÁ÷¿â½øÐÐÁËÒ»Ð©ÖØ´óµÄ¸Ä½ø¡£¿´µ½ReaderºÍWriterÀàʱ£¬´ó¶àÊýÈ˵ĵÚÒ»¸öÓ¡Ï󣨾ÍÏóÎÒÒ»Ñù£©¾ÍÊÇËüÃÇÓÃÀ´Ìæ»»Ô­À´µÄInputStreamºÍOutputStreamÀà¡£µ«ÊµÇé²¢·ÇÈç´Ë¡£¾¡¹Ü²»½¨ÒéʹÓÃԭʼÊý¾ÝÁ÷¿âµÄijЩ¹¦ÄÜ£¨ÈçʹÓÃËüÃÇ£¬»á´Ó±àÒëÆ÷ÊÕµ½Ò»Ìõ¾¯¸æÏûÏ¢£©£¬µ«Ô­À´µÄÊý¾ÝÁ÷ÒÀÈ»µÃµ½Á˱£Áô£¬ÒÔ±ãά³ÖÏòºó¼æÈÝ£¬¶øÇÒ£º
(1) ÔÚÀÏʽ²ã´Î½á¹¹Àï¼ÓÈëÁËÐÂÀ࣬ËùÒÔSun¹«Ë¾Ã÷ÏÔ²»»á·ÅÆúÀÏʽÊý¾ÝÁ÷¡£
(2) ÔÚÐí¶àÇé¿öÏ£¬ÎÒÃÇÐèÒªÓëнṹÖеÄÀàÁªºÏʹÓÃÀϽṹÖеÄÀࡣΪ´ïµ½Õâ¸öÄ¿µÄ£¬ÐèҪʹÓÃһЩ¡°ÇÅ¡±ÀࣺInputStreamReader½«Ò»¸öInputStreamת»»³ÉReader£¬OutputStreamWriter½«Ò»¸öOutputStreamת»»³ÉWriter¡£
ËùÒÔÓëÔ­À´µÄIOÁ÷¿âÏà±È£¬¾­³£¶¼Òª¶ÔÐÂIOÁ÷½øÐвã´Î¸ü¶àµÄ·â×°¡£Í¬ÑùµØ£¬ÕâÒ²ÊôÓÚ×°ÊÎÆ÷·½°¸µÄÒ»¸öȱµã¡ª¡ªÐèҪΪ¶îÍâµÄÁé»îÐÔ¸¶³ö´ú¼Û¡£
Ö®ËùÒÔÔÚJava 1.1ÀïÌí¼ÓÁËReaderºÍWriter²ã´Î£¬×îÖØÒªµÄÔ­Òò±ãÊǹú¼Ê»¯µÄÐèÇó¡£ÀÏʽIOÁ÷²ã´Î½á¹¹Ö»Ö§³Ö8λ×Ö½ÚÁ÷£¬²»ÄܺܺõؿØÖÆ16λUnicode×Ö·û¡£ÓÉÓÚUnicodeÖ÷ÒªÃæÏòµÄÊǹú¼Ê»¯Ö§³Ö£¨JavaÄÚº¬µÄcharÊÇ16λµÄUnicode£©£¬ËùÒÔÌí¼ÓÁËReaderºÍWriter²ã´Î£¬ÒÔÌṩ¶ÔËùÓÐIO²Ù×÷ÖеÄUnicodeµÄÖ§³Ö¡£³ý´ËÖ®Í⣬пâÒ²¶ÔËٶȽøÐÐÁËÓÅ»¯£¬¿É±È¾É¿â¸ü¿ìµØÔËÐС£
Óë±¾ÊéÆäËûµØ·½Ò»Ñù£¬ÎÒ»áÊÔ×ÅÌṩ¶ÔÀàµÄÒ»¸ö¸ÅÊö£¬µ«¼Ù¶¨Äã»áÀûÓÃÁª»úÎĵµ¸ã¶¨ËùÓеÄϸ½Ú£¬±ÈÈç·½·¨µÄÏ꾡ÁбíµÈ¡£

10.7.1 Êý¾ÝµÄ·¢ÆðÓë½ÓÊÕ
Java 1.0µÄ¼¸ºõËùÓÐIOÁ÷Àà¶¼ÓжÔÓ¦µÄJava 1.1À࣬ÓÃÓÚÌṩÄÚ½¨µÄUnicode¹ÜÀí¡£ËÆºõ×îÈÝÒ×µÄÊÂÇé¾ÍÊÇ¡°È«²¿Ê¹ÓÃÐÂÀ࣬ÔÙÒ²²»ÒªÓþɵġ±£¬µ«Êµ¼ÊÇé¿ö²¢Ã»ÓÐÕâô¼òµ¥¡£ÓÐЩʱºò£¬ÓÉÓÚÊܵ½¿âÉè¼ÆµÄһЩÏÞÖÆ£¬ÎÒÃDz»µÃ²»Ê¹ÓÃJava 1.0µÄIOÁ÷Àà¡£ÌØ±ðÒªÖ¸³öµÄÊÇ£¬ÔÚ¾ÉÁ÷¿âµÄ»ù´¡ÉÏмÓÁËjava.util.zip¿â£¬ËüÃÇÒÀÀµ¾ÉµÄÁ÷×é¼þ¡£ËùÒÔ×îÃ÷ÖǵÄ×ö·¨ÊÇ¡°³¢ÊÔÐÔ¡±µØÊ¹ÓÃReaderºÍWriterÀà¡£Èô´úÂë²»ÄÜͨ¹ý±àÒ룬±ãÖªµÀ±ØÐë»»»ØÀÏʽ¿â¡£
ÏÂÃæÕâÕűí¸ñ·Ö¾É¿âÓëпâ·Ö±ð×ܽáÁËÐÅÏ¢·¢ÆðÓë½ÓÊÕÖ®¼äµÄ¶ÔÓ¦¹ØÏµ¡£

Sources & Sinks:
Java 1.0 class

Corresponding Java 1.1 class

InputStream

Reader
converter: InputStreamReader

OutputStream

Writer
converter: OutputStreamWriter

FileInputStream

FileReader

FileOutputStream

FileWriter

StringBufferInputStream

StringReader

(no corresponding class)

StringWriter

ByteArrayInputStream

CharArrayReader

ByteArrayOutputStream

CharArrayWriter

PipedInputStream

PipedReader

PipedOutputStream

PipedWriter


ÎÒÃÇ·¢ÏÖ¼´Ê¹²»ÍêȫһÖ£¬µ«¾É¿â×é¼þÖеĽӿÚÓëнӿÚͨ³£Ò²ÊÇÀàËÆµÄ¡£

10.7.2 ÐÞ¸ÄÊý¾ÝÁ÷µÄÐÐΪ
ÔÚJava 1.0ÖУ¬Êý¾ÝÁ÷ͨ¹ýFilterInputStreamºÍFilterOutputStreamµÄ¡°×°ÊÎÆ÷¡±£¨Decorator£©×ÓÀàÊÊÓ¦ÌØ¶¨µÄÐèÇó¡£Java 1.1µÄIOÁ÷ÑØÓÃÁËÕâһ˼Ï룬µ«Ã»ÓмÌÐø²ÉÓÃËùÓÐ×°ÊÎÆ÷¶¼´ÓÏàͬ¡°filter¡±£¨¹ýÂËÆ÷£©»ù´¡ÀàÖÐÑÜÉúÕâÒ»×ö·¨¡£Èôͨ¹ý¹Û²ìÀàµÄ²ã´Î½á¹¹À´Àí½âËü£¬Õâ¿ÉÄÜÁîÈ˳öÏÖÉÙÐíµÄÀ§»ó¡£
ÔÚÏÂÃæÕâÕűí¸ñÖУ¬¶ÔÓ¦¹ØÏµ±ÈÉÏÒ»ÕűíÒª´Ö²ÚһЩ¡£Ö®ËùÒÔ»á³öÏÖÕâ¸ö²î±ð£¬ÊÇÓÉÀàµÄ×éÖ¯Ôì³ÉµÄ£º¾¡¹ÜBufferedOutputStreamÊÇFilterOutputStreamµÄÒ»¸ö×ÓÀ࣬µ«ÊÇBufferedWriter²¢²»ÊÇFilterWriterµÄ×ÓÀࣨ¶ÔºóÕßÀ´Ëµ£¬¾¡¹ÜËüÊÇÒ»¸ö³éÏóÀ࣬µ«Ã»ÓÐ×Ô¼ºµÄ×ÓÀà»òÕß½üËÆ×ÓÀàµÄ¶«Î÷£¬Ò²Ã»ÓÐÒ»¸ö¡°Õ¼Î»·û¡±¿ÉÓã¬ËùÒÔ²»±Ø·ÑÐĵØÑ°ÕÒ£©¡£È»¶ø£¬Á½¸öÀàµÄ½Ó¿ÚÊǷdz£ÏàËÆµÄ£¬¶øÇÒ²»¹ÜÔÚʲôÇé¿öÏ£¬ÏÔȻӦ¸Ã¾¡¿ÉÄܵØÊ¹ÓÃа汾£¬¶ø²»Ó¦¿¼ÂǾɰ汾£¨Ò²¾ÍÊÇ˵£¬³ý·ÇÔÚһЩÀàÖбØÐëÉú³ÉÒ»¸öStream£¬²»¿ÉÉú³ÉReader»òÕßWriter£©¡£

Filters:
Java 1.0 class

Corresponding Java 1.1 class

FilterInputStream

FilterReader

FilterOutputStream

FilterWriter (abstract class with no subclasses)

BufferedInputStream

BufferedReader
(also has readLine( ))

BufferedOutputStream

BufferedWriter

DataInputStream

use DataInputStream
(Except when you need to use readLine( ), when you should use a BufferedReader)

PrintStream

PrintWriter

LineNumberInputStream

LineNumberReader

StreamTokenizer

StreamTokenizer
(use constructor that takes a Reader instead)

PushBackInputStream

PushBackReader


¹ýÂËÆ÷£ºJava 1.0Àà ¶ÔÓ¦µÄJava 1.1Àà

FilterInputStream FilterReader
FilterOutputStream FilterWriter£¨Ã»ÓÐ×ÓÀàµÄ³éÏóÀࣩ
BufferedInputStream BufferedReader£¨Ò²ÓÐreadLine()£©
BufferedOutputStream BufferedWriter
DataInputStream ʹÓÃDataInputStream£¨³ý·ÇҪʹÓÃreadLine()£¬ÄÇʱÐèҪʹÓÃÒ»¸öBufferedReader£©
PrintStream PrintWriter
LineNumberInputStream LineNumberReader
StreamTokenizer StreamTokenizer£¨Óù¹½¨Æ÷È¡´úReader£©
PushBackInputStream PushBackReader

ÓÐÒ»Ìõ¹æÂÉÊÇÏÔÈ»µÄ£ºÈôÏëʹÓÃreadLine()£¬¾Í²»ÒªÔÙÓÃÒ»¸öDataInputStreamÀ´ÊµÏÖ£¨·ñÔò»áÔÚ±àÒëÆÚµÃµ½Ò»Ìõ³ö´íÏûÏ¢£©£¬¶øÓ¦Ê¹ÓÃÒ»¸öBufferedReader¡£µ«³ýÕâÖÖÇé¿öÒÔÍ⣬DataInputStreamÈÔÊÇJava 1.1 IO¿âµÄ¡°Ê×Ñ¡¡±³ÉÔ±¡£
ΪÁ˽«ÏòPrintWriterµÄ¹ý¶É±äµÃ¸ü¼Ó×ÔÈ»£¬ËüÌṩÁËÄܲÉÓÃÈκÎOutputStream¶ÔÏóµÄ¹¹½¨Æ÷¡£PrintWriterÌṩµÄ¸ñʽ»¯Ö§³ÖûÓÐPrintStreamÄÇô¶à£»µ«½Ó¿Ú¼¸ºõÊÇÏàͬµÄ¡£

10.7.3 δ¸Ä±äµÄÀà
ÏÔÈ»£¬Java¿âµÄÉè¼ÆÈËÔ±¾õµÃÒÔǰµÄһЩÀàºÁÎÞÎÊÌ⣬ËùÒÔûÓжÔËüÃÇ×÷ÈκÎÐ޸ģ¬¿ÉÏóÒÔǰÄÇÑù¼ÌÐøÊ¹ÓÃËüÃÇ£º

ûÓжÔÓ¦Java 1.1ÀàµÄJava 1.0Àà

DataOutputStream
File
RandomAccessFile
SequenceInputStream

ÌØ±ðδ¼Ó¸Ä¶¯µÄÊÇDataOutputStream£¬ËùÒÔΪÁËÓÃÒ»ÖÖ¿É×ªÒÆµÄ¸ñʽ±£´æºÍ»ñÈ¡Êý¾Ý£¬±ØÐëÑØÓÃInputStreamºÍOutputStream²ã´Î½á¹¹¡£

10.7.4 Ò»¸öÀý×Ó
ΪÌåÑéÐÂÀàµÄЧ¹û£¬ÏÂÃæÈÃÎÒÃÇ¿´¿´ÈçºÎÐÞ¸ÄIOStreamDemo.javaʾÀýµÄÏàÓ¦ÇøÓò£¬ÒÔ±ãʹÓÃReaderºÍWriterÀࣺ
//: NewIODemo.java
// Java 1.1 IO typical usage
import java.io.*;

public class NewIODemo {
  public static void main(String[] args) {
    try {
      // 1. Reading input by lines:
      BufferedReader in =
        new BufferedReader(
          new FileReader(args[0]));
      String s, s2 = new String();
      while((s = in.readLine())!= null)
        s2 += s + "\n";
      in.close();

      // 1b. Reading standard input:
      BufferedReader stdin =
        new BufferedReader(
          new InputStreamReader(System.in));      
      System.out.print("Enter a line:");
      System.out.println(stdin.readLine());

      // 2. Input from memory
      StringReader in2 = new StringReader(s2);
      int c;
      while((c = in2.read()) != -1)
        System.out.print((char)c);

      // 3. Formatted memory input
      try {
        DataInputStream in3 =
          new DataInputStream(
            // Oops: must use deprecated class:
            new StringBufferInputStream(s2));
        while(true)
          System.out.print((char)in3.readByte());
      } catch(EOFException e) {
        System.out.println("End of stream");
      }

      // 4. Line numbering & file output
      try {
        LineNumberReader li =
          new LineNumberReader(
            new StringReader(s2));
        BufferedReader in4 =
          new BufferedReader(li);
        PrintWriter out1 =
          new PrintWriter(
            new BufferedWriter(
              new FileWriter("IODemo.out")));
        while((s = in4.readLine()) != null )
          out1.println(
            "Line " + li.getLineNumber() + s);
        out1.close();
      } catch(EOFException e) {
        System.out.println("End of stream");
      }

      // 5. Storing & recovering data
      try {
        DataOutputStream out2 =
          new DataOutputStream(
            new BufferedOutputStream(
              new FileOutputStream("Data.txt")));
        out2.writeDouble(3.14159);
        out2.writeBytes("That was pi");
        out2.close();
        DataInputStream in5 =
          new DataInputStream(
            new BufferedInputStream(
              new FileInputStream("Data.txt")));
        BufferedReader in5br =
          new BufferedReader(
            new InputStreamReader(in5));
        // Must use DataInputStream for data:
        System.out.println(in5.readDouble());
        // Can now use the "proper" readLine():
        System.out.println(in5br.readLine());
      } catch(EOFException e) {
        System.out.println("End of stream");
      }

      // 6. Reading and writing random access
      // files is the same as before.
      // (not repeated here)

    } catch(FileNotFoundException e) {
      System.out.println(
        "File Not Found:" + args[1]);
    } catch(IOException e) {
      System.out.println("IO Exception");
    }
  }
} ///:~

´ó¼ÒÒ»°ã¿´¼ûµÄÊÇת»»¹ý³Ì·Ç³£Ö±¹Û£¬´úÂë¿´ÆðÀ´Ò²ÆÄÏàËÆ¡£µ«ÕâЩ¶¼²»ÊÇÖØÒªµÄÇø±ð¡£×îÖØÒªµÄÊÇ£¬ÓÉÓÚËæ»ú·ÃÎÊÎļþÒѾ­¸Ä±ä£¬ËùÒÔµÚ6½ÚδÔÙÖØ¸´¡£
µÚ1½ÚÊÕËõÁËÒ»µã¶ù£¬ÒòΪ¼ÙÈçÒª×öµÄÈ«²¿ÊÂÇé¾ÍÊǶÁÈ¡ÐÐÊäÈ룬ÄÇôֻÐèÒª½«Ò»¸öFileReader·â×°µ½BufferedReaderÖ®ÄÚ¼´¿É¡£µÚ1b½ÚչʾÁË·â×°System.in£¬ÒÔ±ã¶ÁÈ¡¿ØÖÆÌ¨ÊäÈëµÄз½·¨¡£ÕâÀïµÄ´úÂëÁ¿Ôö¶àÁËһЩ£¬ÒòΪSystem.inÊÇÒ»¸öDataInputStream£¬¶øÇÒBufferedReaderÐèÒªÒ»¸öReader²ÎÊý£¬ËùÒÔÒªÓÃInputStreamReaderÀ´½øÐÐת»»¡£
ÔÚ2½Ú£¬¿ÉÒÔ¿´µ½Èç¹ûÓÐÒ»¸ö×Ö´®£¬¶øÇÒÏë´ÓÖжÁÈ¡Êý¾Ý£¬Ö»ÐèÓÃÒ»¸öStringReaderÌæ»»StringBufferInputStream£¬Ê£ÏµĴúÂëÊÇÍêÈ«ÏàͬµÄ¡£
µÚ3½Ú½ÒʾÁËÐÂIOÁ÷¿âÉè¼ÆÖеÄÒ»¸ö´íÎó¡£Èç¹ûÓÐÒ»¸ö×Ö´®£¬¶øÇÒÏë´ÓÖжÁÈ¡Êý¾Ý£¬ÄÇô²»ÄÜÔÙÒÔÈκÎÐÎʽʹÓÃStringBufferInputStream¡£Èô±àÒëÒ»¸öÉæ¼°StringBufferInputStreamµÄ´úÂ룬»áµÃµ½Ò»Ìõ¡°·´¶Ô¡±ÏûÏ¢£¬¸æËßÎÒÃDz»ÒªÓÃËü¡£´Ëʱ×îºÃ»»ÓÃÒ»¸öStringReader¡£µ«ÊÇ£¬¼ÙÈçÒªÏóµÚ3½ÚÕâÑù½øÐиñʽ»¯µÄÄÚ´æÊäÈ룬¾Í±ØÐëʹÓÃDataInputStream¡ª¡ªÃ»ÓÐʲô¡°DataReader¡±¿ÉÒÔ´úÌæËü¡ª¡ª¶øDataInputStreamºÜ²»ÐÒµØÒªÇóÓõ½Ò»¸öInputStream²ÎÊý¡£ËùÒÔÎÒÃÇûÓÐÑ¡ÔñµÄÓàµØ£¬Ö»ºÃʹÓñàÒëÆ÷²»Ô޳ɵÄStringBufferInputStreamÀà¡£±àÒëÆ÷ͬÑù»á·¢³ö·´¶ÔÐÅÏ¢£¬µ«ÎÒÃǶԴËÊøÊÖÎ޲ߣ¨×¢ÊÍ¢Ú£©¡£
StringReaderÌæ»»StringBufferInputStream£¬Ê£ÏµĴúÂëÊÇÍêÈ«ÏàͬµÄ¡£

¢Ú£ºµ½ÄãÏÖÔÚÕýʽʹÓõÄʱºò£¬Õâ¸ö´íÎó¿ÉÄÜÒѾ­ÐÞÕý¡£

µÚ4½ÚÃ÷ÏÔÊÇ´ÓÀÏʽÊý¾ÝÁ÷µ½ÐÂÊý¾ÝÁ÷µÄÒ»¸öÖ±½Óת»»£¬Ã»ÓÐÐèÒªÌØ±ðÖ¸³öµÄ¡£ÔÚµÚ5½ÚÖУ¬ÎÒÃDZ»Ç¿ÆÈʹÓÃËùÓеÄÀÏʽÊý¾ÝÁ÷£¬ÒòΪDataOutputStreamºÍDataInputStreamÒªÇóÓõ½ËüÃÇ£¬¶øÇÒûÓпɹ©Ìæ»»µÄ¶«Î÷¡£È»¶ø£¬±àÒëÆÚ¼ä²»»á²úÉúÈκΡ°·´¶Ô¡±ÐÅÏ¢¡£Èô²»ÔÞ³ÉÒ»ÖÖÊý¾ÝÁ÷£¬Í¨³£ÊÇÓÉÓÚËüµÄ¹¹½¨Æ÷²úÉúÁËÒ»Ìõ·´¶ÔÏûÏ¢£¬½ûÖ¹ÎÒÃÇʹÓÃÕû¸öÀà¡£µ«ÔÚDataInputStreamµÄÇé¿öÏ£¬Ö»ÓÐreadLine()ÊDz»ÔÞ³ÉʹÓõģ¬ÒòΪÎÒÃÇ×îºÃΪreadLine()ʹÓÃÒ»¸öBufferedReader£¨µ«ÎªÆäËûËùÓиñʽ»¯ÊäÈ붼ʹÓÃÒ»¸öDataInputStream£©¡£
Èô±È½ÏµÚ5½ÚºÍIOStreamDemo.javaÖеÄÄÇһС½Ú£¬»á×¢Òâµ½ÔÚÕâ¸ö°æ±¾ÖУ¬Êý¾ÝÊÇÔÚÎı¾Ö®Ç°Ð´ÈëµÄ¡£ÄÇÊÇÓÉÓÚJava 1.1±¾Éí´æÔÚÒ»¸ö´íÎó£¬ÈçÏÂÊö´úÂëËùʾ£º
//: IOBug.java
// Java 1.1 (and higher?) IO Bug
import java.io.*;

public class IOBug {
  public static void main(String[] args) 
  throws Exception {
    DataOutputStream out =
      new DataOutputStream(
        new BufferedOutputStream(
          new FileOutputStream("Data.txt")));
    out.writeDouble(3.14159);
    out.writeBytes("That was the value of pi\n");
    out.writeBytes("This is pi/2:\n");
    out.writeDouble(3.14159/2);
    out.close();

    DataInputStream in =
      new DataInputStream(
        new BufferedInputStream(
          new FileInputStream("Data.txt")));
    BufferedReader inbr =
      new BufferedReader(
        new InputStreamReader(in));
    // The doubles written BEFORE the line of text
    // read back correctly:
    System.out.println(in.readDouble());
    // Read the lines of text:
    System.out.println(inbr.readLine());
    System.out.println(inbr.readLine());
    // Trying to read the doubles after the line
    // produces an end-of-file exception:
    System.out.println(in.readDouble());
  }
} ///:~

¿´ÆðÀ´£¬ÎÒÃÇÔÚ¶ÔÒ»¸öwriteBytes()µÄµ÷ÓÃÖ®ºóдÈëµÄÈκζ«Î÷¶¼²»ÊÇÄܹ»»Ö¸´µÄ¡£ÕâÊÇÒ»¸öÊ®·ÖÓÐÏ޵ĴíÎó£¬Ï£ÍûÔÚÄã¶Áµ½±¾ÊéµÄʱºòÒÑ»ñµÃ¸ÄÕý¡£Îª¼ì²âÊÇ·ñ¸ÄÕý£¬ÇëÔËÐÐÉÏÊö³ÌÐò¡£ÈôûÓеõ½Ò»¸öÎ¥Àý£¬¶øÇÒÖµ¶¼ÄÜÕýÈ·´òÓ¡³öÀ´£¬¾Í±íÃ÷ÒѾ­¸ÄÕý¡£

10.7.5 ÖØµ¼Ïò±ê×¼IO
Java 1.1ÔÚSystemÀàÖÐÌí¼ÓÁËÌØÊâµÄ·½·¨£¬ÔÊÐíÎÒÃÇÖØÐ¶¨Ïò±ê×¼ÊäÈë¡¢Êä³öÒÔ¼°´íÎóIOÁ÷¡£´ËʱҪÓõ½ÏÂÊö¼òµ¥µÄ¾²Ì¬·½·¨µ÷Óãº
setIn(InputStream)
setOut(PrintStream)
setErr(PrintStream)
Èç¹ûͻȻҪÔÚÆÁÄ»ÉÏÉú³É´óÁ¿Êä³ö£¬¶øÇÒ¹ö¶¯µÄËÙ¶È¿ìÓÚÈËÃǵÄÔĶÁËÙ¶È£¬Êä³öµÄÖØ¶¨Ïò¾ÍÏÔµÃÌØ±ðÓÐÓá£ÔÚÒ»¸öÃüÁîÐгÌÐòÖУ¬Èç¹ûÏëÖØ¸´²âÊÔÒ»¸öÌØ¶¨µÄÓû§ÊäÈëÐòÁУ¬ÊäÈëµÄÖØ¶¨ÏòÒ²ÏÔµÃÌØ±ðÓмÛÖµ¡£ÏÂÃæÕâ¸ö¼òµ¥µÄÀý×ÓչʾÁËÕâЩ·½·¨µÄʹÓãº
//: Redirecting.java
// Demonstrates the use of redirection for 
// standard IO in Java 1.1
import java.io.*;

class Redirecting {
  public static void main(String[] args) {
    try {
      BufferedInputStream in = 
        new BufferedInputStream(
          new FileInputStream(
            "Redirecting.java"));
      // Produces deprecation message:
      PrintStream out =
        new PrintStream(
          new BufferedOutputStream(
            new FileOutputStream("test.out")));
      System.setIn(in);
      System.setOut(out);
      System.setErr(out);

      BufferedReader br = 
        new BufferedReader(
          new InputStreamReader(System.in));
      String s;
      while((s = br.readLine()) != null)
        System.out.println(s);
      out.close(); // Remember this!
    } catch(IOException e) {
      e.printStackTrace();
    }
  }
} ///:~

Õâ¸ö³ÌÐòµÄ×÷ÓÃÊǽ«±ê×¼ÊäÈëͬһ¸öÎļþÁ¬½ÓÆðÀ´£¬²¢½«±ê×¼Êä³öºÍ´íÎóÖØ¶¨ÏòÖÁÁíÒ»¸öÎļþ¡£
ÕâÊDz»¿É±ÜÃâ»áÓöµ½¡°·´¶Ô¡±ÏûÏ¢µÄÁíÒ»¸öÀý×Ó¡£ÓÃ-deprecation±êÖ¾±àÒëʱµÃµ½µÄÏûÏ¢ÈçÏ£º

Note:The constructor java.io.PrintStream(java.io.OutputStream) has been deprecated.
×¢Ò⣺²»ÍƼöʹÓù¹½¨Æ÷java.io.PrintStream£¨java.io.OutputStream£©¡£

È»¶ø£¬ÎÞÂÛSystem.setOut()»¹ÊÇSystem.setErr()¶¼ÒªÇóÓÃÒ»¸öPrintStream×÷Ϊ²ÎÊýʹÓã¬ËùÒÔ±ØÐëµ÷ÓÃPrintStream¹¹½¨Æ÷¡£ËùÒÔ´ó¼Ò¿ÉÄÜ»á¾õµÃÆæ¹Ö£¬¼ÈÈ»Java 1.1ͨ¹ý·´¶Ô¹¹½¨Æ÷¶ø·´¶ÔÁËÕû¸öPrintStream£¬ÎªÊ²Ã´¿âµÄÉè¼ÆÈËÔ±ÔÚÌí¼ÓÕâ¸ö·´¶ÔµÄͬʱ£¬ÒÀȻΪSystemÌí¼ÓÁËз½·¨£¬ÇÒÖ¸Ã÷ÒªÇóÓÃPrintStream£¬¶ø²»ÊÇÓÃPrintWriterÄØ£¿±Ï¾¹£¬ºóÕßÊÇÒ»¸öոкÍÊ×Ñ¡µÄÌæ»»´ëʩѽ£¿ÕâÕæÁîÈ˷ѽ⡣

10.8 ѹËõ
Java 1.1Ò²Ìí¼ÓÒ»¸öÀ࣬ÓÃÒÔÖ§³Ö¶ÔѹËõ¸ñʽµÄÊý¾ÝÁ÷µÄ¶Áд¡£ËüÃÇ·â×°µ½ÏֳɵÄIOÀàÖУ¬ÒÔÌṩѹËõ¹¦ÄÜ¡£
´ËʱJava 1.1µÄÒ»¸öÎÊÌâÏԵ÷dz£Í»³ö£ºËüÃDz»ÊÇ´ÓеÄReaderºÍWriterÀàÑÜÉú³öÀ´µÄ£¬¶øÊÇÊôÓÚInputStreamºÍOutputStream²ã´Î½á¹¹µÄÒ»²¿·Ö¡£ËùÒÔÓÐʱ²»µÃ²»»ìºÏʹÓÃÁ½ÖÖÀàÐ͵ÄÊý¾ÝÁ÷£¨×¢Òâ¿ÉÓÃInputStreamReaderºÍOutputStreamWriterÔÚ²»Í¬µÄÀàÐͼ䷽±ãµØ½øÐÐת»»£©¡£

Java 1.1ѹËõÀà ¹¦ÄÜ

CheckedInputStream GetCheckSum()ΪÈκÎInputStream²úÉúУÑéºÍ£¨²»½öÊǽâѹ£©
CheckedOutputStream GetCheckSum()ΪÈκÎOutputStream²úÉúУÑéºÍ£¨²»½öÊǽâѹ£©
DeflaterOutputStream ÓÃÓÚѹËõÀàµÄ»ù´¡Àà
ZipOutputStream Ò»¸öDeflaterOutputStream£¬½«Êý¾ÝѹËõ³ÉZipÎļþ¸ñʽ
GZIPOutputStream Ò»¸öDeflaterOutputStream£¬½«Êý¾ÝѹËõ³ÉGZIPÎļþ¸ñʽ
InflaterInputStream ÓÃÓÚ½âѹÀàµÄ»ù´¡Àà
ZipInputStream Ò»¸öDeflaterInputStream£¬½âѹÓÃZipÎļþ¸ñʽ±£´æµÄÊý¾Ý
GZIPInputStream Ò»¸öDeflaterInputStream£¬½âѹÓÃGZIPÎļþ¸ñʽ±£´æµÄÊý¾Ý

¾¡¹Ü´æÔÚÐí¶àÖÖѹËõËã·¨£¬µ«ÊÇZipºÍGZIP¿ÉÄÜ×î³£Óõġ£ËùÒÔÄܹ»ºÜ·½±ãµØÓöàÖÖÏֳɵŤ¾ßÀ´¶ÁдÕâЩ¸ñʽµÄѹËõÊý¾Ý¡£

10.8.1 ÓÃGZIP½øÐмòµ¥Ñ¹Ëõ
GZIP½Ó¿Ú·Ç³£¼òµ¥£¬ËùÒÔÈç¹ûÖ»Óе¥¸öÊý¾ÝÁ÷ÐèҪѹËõ£¨¶ø²»ÊÇһϵÁв»Í¬µÄÊý¾Ý£©£¬ÄÇôËü¾Í¿ÉÄÜÊÇ×îÊʵ±Ñ¡Ôñ¡£ÏÂÃæÊǶԵ¥¸öÎļþ½øÐÐѹËõµÄÀý×Ó£º
//: GZIPcompress.java
// Uses Java 1.1 GZIP compression to compress
// a file whose name is passed on the command
// line.
import java.io.*;
import java.util.zip.*;

public class GZIPcompress {
  public static void main(String[] args) {
    try {
      BufferedReader in =
        new BufferedReader(
          new FileReader(args[0]));
      BufferedOutputStream out =
        new BufferedOutputStream(
          new GZIPOutputStream(
            new FileOutputStream("test.gz")));
      System.out.println("Writing file");
      int c;
      while((c = in.read()) != -1)
        out.write(c);
      in.close();
      out.close();
      System.out.println("Reading file");
      BufferedReader in2 =
        new BufferedReader(
          new InputStreamReader(
            new GZIPInputStream(
              new FileInputStream("test.gz"))));
      String s;
      while((s = in2.readLine()) != null)
        System.out.println(s);
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
} ///:~

ѹËõÀàµÄÓ÷¨·Ç³£Ö±¹Û¡ª¡ªÖ»Ð轫Êä³öÁ÷·â×°µ½Ò»¸öGZIPOutputStream»òÕßZipOutputStreamÄÚ£¬²¢½«ÊäÈëÁ÷·â×°µ½GZIPInputStream»òÕßZipInputStreamÄÚ¼´¿É¡£Ê£ÓàµÄÈ«²¿²Ù×÷¾ÍÊDZê×¼µÄIO¶Áд¡£È»¶ø£¬ÕâÊÇÒ»¸öºÜµäÐ͵ÄÀý×Ó£¬ÎÒÃDz»µÃ²»»ìºÏʹÓÃоÉIOÁ÷£ºÊý¾ÝµÄÊäÈëʹÓÃReaderÀ࣬¶øGZIPOutputStreamµÄ¹¹½¨Æ÷Ö»ÄܽÓÊÕÒ»¸öOutputStream¶ÔÏ󣬲»ÄܽÓÊÕWriter¶ÔÏó¡£

10.8.2 ÓÃZip½øÐжàÎļþ±£´æ
ÌṩÁËZipÖ§³ÖµÄJava 1.1¿âÏԵøü¼ÓÈ«Ãæ¡£ÀûÓÃËü¿ÉÒÔ·½±ãµØ±£´æ¶à¸öÎļþ¡£ÉõÖÁÓÐÒ»¸ö¶ÀÁ¢µÄÀàÀ´¼ò»¯¶ÔZipÎļþµÄ¶Á²Ù×÷¡£Õâ¸ö¿â²É²ÉÓõÄÊDZê×¼Zip¸ñʽ£¬ËùÒÔÄÜÓ뵱ǰÒòÌØÍøÉÏʹÓõĴóÁ¿Ñ¹Ëõ¡¢½âѹ¹¤¾ßºÜºÃµØÐ­×÷¡£ÏÂÃæÕâ¸öÀý×Ó²ÉÈ¡ÁËÓëǰÀýÏàͬµÄÐÎʽ£¬µ«Äܸù¾ÝÎÒÃÇÐèÒª¿ØÖÆÈÎÒâÊýÁ¿µÄÃüÁîÐвÎÊý¡£³ý´ËÖ®Í⣬ËüչʾÁËÈçºÎÓÃChecksumÀàÀ´¼ÆËãºÍУÑéÎļþµÄ¡°Ð£ÑéºÍ¡±£¨Checksum£©¡£¿ÉÑ¡ÓÃÁ½ÖÖÀàÐ͵ÄChecksum£ºAdler32£¨ËÙ¶ÈÒª¿ìһЩ£©ºÍCRC32£¨ÂýһЩ£¬µ«¸ü׼ȷ£©¡£
//: ZipCompress.java
// Uses Java 1.1 Zip compression to compress
// any number of files whose names are passed
// on the command line.
import java.io.*;
import java.util.*;
import java.util.zip.*;

public class ZipCompress {
  public static void main(String[] args) {
    try {
      FileOutputStream f =
        new FileOutputStream("test.zip");
      CheckedOutputStream csum =
        new CheckedOutputStream(
          f, new Adler32());
      ZipOutputStream out =
        new ZipOutputStream(
          new BufferedOutputStream(csum));
      out.setComment("A test of Java Zipping");
      // Can't read the above comment, though
      for(int i = 0; i < args.length; i++) {
        System.out.println(
          "Writing file " + args[i]);
        BufferedReader in =
          new BufferedReader(
            new FileReader(args[i]));
        out.putNextEntry(new ZipEntry(args[i]));
        int c;
        while((c = in.read()) != -1)
          out.write(c);
        in.close();
      }
      out.close();
      // Checksum valid only after the file
      // has been closed!
      System.out.println("Checksum: " +
        csum.getChecksum().getValue());
      // Now extract the files:
      System.out.println("Reading file");
      FileInputStream fi =
         new FileInputStream("test.zip");
      CheckedInputStream csumi =
        new CheckedInputStream(
          fi, new Adler32());
      ZipInputStream in2 =
        new ZipInputStream(
          new BufferedInputStream(csumi));
      ZipEntry ze;
      System.out.println("Checksum: " +
        csumi.getChecksum().getValue());
      while((ze = in2.getNextEntry()) != null) {
        System.out.println("Reading file " + ze);
        int x;
        while((x = in2.read()) != -1)
          System.out.write(x);
      }
      in2.close();
      // Alternative way to open and read
      // zip files:
      ZipFile zf = new ZipFile("test.zip");
      Enumeration e = zf.entries();
      while(e.hasMoreElements()) {
        ZipEntry ze2 = (ZipEntry)e.nextElement();
        System.out.println("File: " + ze2);
        // ... and extract the data as before
      }
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
} ///:~

¶ÔÓÚÒª¼ÓÈëѹËõµµµÄÿһ¸öÎļþ£¬¶¼±ØÐëµ÷ÓÃputNextEntry()£¬²¢½«Æä´«µÝ¸øÒ»¸öZipEntry¶ÔÏó¡£ZipEntry¶ÔÏó°üº¬ÁËÒ»¸ö¹¦ÄÜÈ«ÃæµÄ½Ó¿Ú£¬ÀûÓÃËü¿ÉÒÔ»ñÈ¡ºÍÉèÖÃZipÎļþÄÚÄǸöÌØ¶¨µÄEntry£¨Èë¿Ú£©ÉÏÄܹ»½ÓÊܵÄËùÓÐÊý¾Ý£ºÃû×Ö¡¢Ñ¹ËõºóºÍѹËõǰµÄ³¤¶È¡¢ÈÕÆÚ¡¢CRCУÑéºÍ¡¢¶îÍâ×ֶεÄÊý¾Ý¡¢×¢ÊÍ¡¢Ñ¹Ëõ·½·¨ÒÔ¼°ËüÊÇ·ñÒ»¸öĿ¼Èë¿ÚµÈµÈ¡£È»¶ø£¬ËäÈ»Zip¸ñʽÌṩÁËÉèÖÃÃÜÂëµÄ·½·¨£¬µ«JavaµÄZip¿âûÓÐÌṩÕâ·½ÃæµÄÖ§³Ö¡£¶øÇÒ¾¡¹ÜCheckedInputStreamºÍCheckedOutputStreamͬʱÌṩÁ˶ÔAdler32ºÍCRC32УÑéºÍµÄÖ§³Ö£¬µ«ÊÇZipEntryÖ»Ö§³ÖCRCµÄ½Ó¿Ú¡£ÕâËäÈ»ÊôÓÚ»ù²ãZip¸ñʽµÄÏÞÖÆ£¬µ«È´ÏÞÖÆÁËÎÒÃÇʹÓÃËٶȸü¿ìµÄAdler32¡£
Ϊ½âѹÎļþ£¬ZipInputStreamÌṩÁËÒ»¸ögetNextEntry()·½·¨£¬ÄÜÔÚÓеÄǰÌáÏ·µ»ØÏÂÒ»¸öZipEntry¡£×÷Ϊһ¸ö¸ü¼ò½àµÄ·½·¨£¬¿ÉÒÔÓÃZipFile¶ÔÏó¶ÁÈ¡Îļþ¡£¸Ã¶ÔÏóÓÐÒ»¸öentries()·½·¨£¬¿ÉÒÔΪZipEntry·µ»ØÒ»¸öEnumeration£¨Ã¶¾Ù£©¡£
Ϊ¶ÁȡУÑéºÍ£¬±ØÐë¶àÉÙÓµÓжԹØÁªµÄChecksum¶ÔÏóµÄ·ÃÎÊȨÏÞ¡£ÔÚÕâÀï±£ÁôÁËÖ¸ÏòCheckedOutputStreamºÍCheckedInputStream¶ÔÏóµÄÒ»¸ö¾ä±ú¡£µ«ÊÇ£¬Ò²¿ÉÒÔÖ»Õ¼ÓÐÖ¸ÏòChecksum¶ÔÏóµÄÒ»¸ö¾ä±ú¡£
ZipÁ÷ÖÐÒ»¸öÁîÈËÀ§»óµÄ·½·¨ÊÇsetComment()¡£ÕýÈçÇ°ÃæÕ¹Ê¾µÄÄÇÑù£¬ÎÒÃÇ¿ÉÔÚдһ¸öÎļþʱÉèÖÃ×¢ÊÍÄÚÈÝ£¬µ«È´Ã»Óа취ȡ³öZipInputStreamÄÚµÄ×¢ÊÍ¡£¿´ÆðÀ´£¬ËƺõÖ»ÄÜͨ¹ýZipEntryÖð¸öÈë¿ÚµØÌṩ¶Ô×¢Ê͵ÄÍêȫ֧³Ö¡£
µ±È»£¬Ê¹ÓÃGZIP»òZip¿âʱ²¢²»½ö½öÏÞÓÚÎļþ¡ª¡ª¿ÉÒÔѹËõÈκζ«Î÷£¬°üÀ¨ÒªÍ¨¹ýÍøÂçÁ¬½Ó·¢Ë͵ÄÊý¾Ý¡£

10.8.3 Java¹éµµ£¨jar£©ÊµÓóÌÐò
Zip¸ñʽÒàÔÚJava 1.1µÄJAR£¨Java ARchive£©Îļþ¸ñʽÖеõ½Á˲ÉÓá£ÕâÖÖÎļþ¸ñʽµÄ×÷ÓÃÊǽ«Ò»ÏµÁÐÎļþºÏ²¢µ½µ¥¸öѹËõÎļþÀ¾ÍÏóZipÄÇÑù¡£È»¶ø£¬Í¬JavaÖÐÆäËûÈκζ«Î÷Ò»Ñù£¬JARÎļþÊÇ¿çÆ½Ì¨µÄ£¬ËùÒÔ²»±Ø¹ØÐÄÉæ¼°¾ßÌåÆ½Ì¨µÄÎÊÌâ¡£³ýÁË¿ÉÒÔ°üÀ¨ÉùÒôºÍͼÏñÎļþÒÔÍ⣬Ҳ¿ÉÒÔÔÚÆäÖаüÀ¨ÀàÎļþ¡£
Éæ¼°ÒòÌØÍøÓ¦ÓÃʱ£¬JARÎļþÏÔµÃÌØ±ðÓÐÓá£ÔÚJARÎļþ֮ǰ£¬Webä¯ÀÀÆ÷±ØÐëÖØ¸´¶à´ÎÇëÇóWeb·þÎñÆ÷£¬ÒÔ±ãÏÂÔØÍê¹¹³ÉÒ»¸ö¡°³ÌÐòƬ¡±£¨Applet£©µÄËùÓÐÎļþ¡£³ý´ËÒÔÍ⣬ÿ¸öÎļþ¶¼ÊÇδ¾­Ñ¹ËõµÄ¡£µ«ÔÚ½«ËùÓÐÕâЩÎļþºÏ²¢µ½Ò»¸öJARÎļþÀïÒÔºó£¬Ö»ÐèÏòÔ¶³Ì·þÎñÆ÷·¢³öÒ»´ÎÇëÇó¼´¿É¡£Í¬Ê±£¬ÓÉÓÚ²ÉÓÃÁËѹËõ¼¼Êõ£¬ËùÒÔ¿ÉÔÚ¸ü¶ÌµÄʱ¼äÀï»ñµÃÈ«²¿Êý¾Ý¡£ÁíÍ⣬JARÎļþÀïµÄÿ¸öÈë¿Ú£¨ÌõÄ¿£©¶¼¿ÉÒÔ¼ÓÉÏÊý×Ö»¯Ç©Ãû£¨ÏêÇé²Î¿¼JavaÓû§Îĵµ£©¡£
Ò»¸öJARÎļþÓÉһϵÁвÉÓÃZipѹËõ¸ñʽµÄÎļþ¹¹³É£¬Í¬Ê±»¹ÓÐÒ»ÕÅ¡°ÏêÇéµ¥¡±£¬¶ÔËùÓÐÕâЩÎļþ½øÐÐÁËÃèÊö£¨¿É´´½¨×Ô¼ºµÄÏêÇéµ¥Îļþ£»·ñÔò£¬jar³ÌÐò»áΪÎÒÃÇ´úÀÍ£©¡£ÔÚÁª»úÓû§ÎĵµÖУ¬¿ÉÒÔÕÒµ½ÓëJARÏêÇéµ¥¸ü¶àµÄ×ÊÁÏ£¨ÏêÇéµ¥µÄÓ¢ÓïÊÇ¡°Manifest¡±£©¡£
jarʵÓóÌÐòÒÑÓëSunµÄJDKÅäÌ×Ìṩ£¬¿ÉÒÔ°´ÎÒÃǵÄÑ¡Ôñ×Ô¶¯Ñ¹ËõÎļþ¡£ÇëÔÚÃüÁîÐе÷ÓÃËü£º

jar [Ñ¡Ïî] ˵Ã÷ [ÏêÇéµ¥] ÊäÈëÎļþ

ÆäÖУ¬¡°Ñ¡ÏÓÃһϵÁÐ×Öĸ±íʾ£¨²»±ØÊäÈëÁ¬×ֺŻòÆäËûÈκÎָʾ·û£©¡£ÈçÏÂËùʾ£º

c ´´½¨ÐµĻò¿ÕµÄѹËõµµ
t ÁгöĿ¼±í
x ½âѹËùÓÐÎļþ
x file ½âѹָ¶¨Îļþ
f Ö¸³ö¡°ÎÒ×¼±¸ÏòÄãÌṩÎļþÃû¡±¡£ÈôÊ¡ÂԴ˲ÎÊý£¬jar»á¼Ù¶¨ËüµÄÊäÈëÀ´×Ô±ê×¼ÊäÈ룻»òÕßÔÚËü´´½¨Îļþʱ£¬Êä³ö»á½øÈë±ê×¼Êä³öÄÚ
m Ö¸³öµÚÒ»¸ö²ÎÊý½«ÊÇÓû§×Ô½¨µÄÏêÇé±íÎļþµÄÃû×Ö
v ²úÉúÏêϸÊä³ö£¬¶Ôjar×öµÄ¹¤×÷½øÐоÞϸÎÞÒŵÄÃèÊö
O Ö»±£´æÎļþ£»²»Ñ¹ËõÎļþ£¨ÓÃÓÚ´´½¨Ò»¸öJARÎļþ£¬ÒÔ±ãÎÒÃǽ«ÆäÖÃÈë×Ô¼ºµÄÀà·¾¶ÖУ©
M ²»×Ô¶¯Éú³ÉÏêÇé±íÎļþ

ÔÚ×¼±¸½øÈëJARÎļþµÄÎļþÖУ¬Èô°üÀ¨ÁËÒ»¸ö×ÓĿ¼£¬ÄǸö×ÓĿ¼»á×Ô¶¯Ìí¼Ó£¬ÆäÖаüÀ¨Ëü×Ô¼ºµÄËùÓÐ×ÓĿ¼£¬ÒÔ´ËÀàÍÆ¡£Â·¾¶ÐÅÏ¢Ò²»áµÃµ½±£Áô¡£
ÏÂÃæÊǵ÷ÓÃjarµÄһЩµäÐÍ·½·¨£º

jar cf myJarFile.jar *.class
ÓÃÓÚ´´½¨Ò»¸öÃûΪmyJarFile.jarµÄJARÎļþ£¬ÆäÖаüº¬Á˵±Ç°Ä¿Â¼ÖеÄËùÓÐÀàÎļþ£¬Í¬Ê±»¹ÓÐ×Ô¶¯²úÉúµÄÏêÇé±íÎļþ¡£

jar cmf myJarFile.jar myManifestFile.mf *.class
ÓëǰÀýÀàËÆ£¬µ«Ìí¼ÓÁËÒ»¸öÃûΪmyManifestFile.mfµÄÓû§×Ô½¨ÏêÇé±íÎļþ¡£

jar tf myJarFile.jar
Éú³ÉmyJarFile.jarÄÚËùÓÐÎļþµÄÒ»¸öĿ¼±í¡£

jar tvf myJarFile.jar
Ìí¼Ó¡°verbose¡±£¨Ï꾡£©±êÖ¾£¬ÌṩÓëmyJarFile.jarÖеÄÎļþÓйصġ¢¸üÏêϸµÄ×ÊÁÏ¡£

jar cvf myApp.jar audio classes image
¼Ù¶¨audio£¬classesºÍimageÊÇ×ÓĿ¼£¬ÕâÑù±ã½«ËùÓÐ×ÓĿ¼ºÏ²¢µ½ÎļþmyApp.jarÖС£ÆäÖÐÒ²°üÀ¨ÁË¡°verbose¡±±êÖ¾£¬¿ÉÔÚjar³ÌÐò¹¤×÷ʱ·´À¡¸üÏ꾡µÄÐÅÏ¢¡£

Èç¹ûÓÃOÑ¡Ïî´´½¨ÁËÒ»¸öJARÎļþ£¬ÄǸöÎļþ¾Í¿ÉÖÃÈë×Ô¼ºµÄÀà·¾¶£¨CLASSPATH£©ÖУº
CLASSPATH="lib1.jar;lib2.jar;"
JavaÄÜÔÚlib1.jarºÍlib2.jarÖÐËÑË÷Ä¿±êÀàÎļþ¡£

jar¹¤¾ßµÄ¹¦ÄÜûÓÐzip¹¤¾ßÄÇô·á¸»¡£ÀýÈ磬²»Äܹ»Ìí¼Ó»ò¸üÐÂÒ»¸öÏÖ³ÉJARÎļþÖеÄÎļþ£¬Ö»ÄÜ´ÓÍ·¿ªÊ¼Ð½¨Ò»¸öJARÎļþ¡£´ËÍ⣬²»Äܽ«ÎļþÒÆÈëÒ»¸öJARÎļþ£¬²¢ÔÚÒÆ¶¯ºó½«ËüÃÇɾ³ý¡£È»¶ø£¬ÔÚÒ»ÖÖÆ½Ì¨ÉÏ´´½¨µÄJARÎļþ¿ÉÔÚÆäËûÈÎºÎÆ½Ì¨ÉÏÓÉjar¹¤¾ßºÁÎÞ×è°­µØ¶Á³ö£¨Õâ¸öÎÊÌâÓÐʱ»áÀ§ÈÅzip¹¤¾ß£©¡£
ÕýÈç´ó¼ÒÔÚµÚ13Õ»ῴµ½µÄÄÇÑù£¬ÎÒÃÇÒ²ÓÃJARΪJava Beans´ò°ü¡£

10.9 ¶ÔÏóÐòÁл¯
Java 1.1ÔöÌíÁËÒ»ÖÖÓÐȤµÄÌØÐÔ£¬ÃûΪ¡°¶ÔÏóÐòÁл¯¡±£¨Object Serialization£©¡£ËüÃæÏòÄÇЩʵÏÖÁËSerializable½Ó¿ÚµÄ¶ÔÏ󣬿ɽ«ËüÃÇת»»³ÉһϵÁÐ×Ö½Ú£¬²¢¿ÉÔÚÒÔºóÍêÈ«»Ö¸´»ØÔ­À´µÄÑù×Ó¡£ÕâÒ»¹ý³ÌÒà¿Éͨ¹ýÍøÂç½øÐС£ÕâÒâζ×ÅÐòÁл¯»úÖÆÄÜ×Ô¶¯²¹³¥²Ù×÷ϵͳ¼äµÄ²îÒì¡£»»¾ä»°Ëµ£¬¿ÉÒÔÏÈÔÚWindows»úÆ÷ÉÏ´´½¨Ò»¸ö¶ÔÏó£¬¶ÔÆäÐòÁл¯£¬È»ºóͨ¹ýÍøÂç·¢¸øÒ»Ì¨Unix»úÆ÷£¬È»ºóÔÚÄÇÀï׼ȷÎÞÎóµØÖØÐ¡°×°Å䡱¡£²»±Ø¹ØÐÄÊý¾ÝÔÚ²»Í¬»úÆ÷ÉÏÈçºÎ±íʾ£¬Ò²²»±Ø¹ØÐÄ×Ö½ÚµÄ˳Ðò»òÕ߯äËûÈκÎϸ½Ú¡£
¾ÍÆä±¾ÉíÀ´Ëµ£¬¶ÔÏóµÄÐòÁл¯ÊǷdz£ÓÐȤµÄ£¬ÒòΪÀûÓÃËü¿ÉÒÔʵÏÖ¡°ÓÐÏ޳־û¯¡±¡£Çë¼Çס¡°³Ö¾Ã»¯¡±Òâζ×ŶÔÏóµÄ¡°Éú´æÊ±¼ä¡±²¢²»È¡¾öÓÚ³ÌÐòÊÇ·ñÕýÔÚÖ´ÐСª¡ªËü´æÔÚ»ò¡°Éú´æ¡±ÓÚ³ÌÐòµÄÿһ´Îµ÷ÓÃÖ®¼ä¡£Í¨¹ýÐòÁл¯Ò»¸ö¶ÔÏ󣬽«ÆäдÈë´ÅÅÌ£¬ÒÔºóÔÚ³ÌÐòÖØÐµ÷ÓÃÊ±ÖØÐ»ָ´ÄǸö¶ÔÏ󣬾ÍÄÜÔ²ÂúʵÏÖÒ»ÖÖ¡°³Ö¾Ã¡±Ð§¹û¡£Ö®ËùÒÔ³ÆÆäΪ¡°ÓÐÏÞ¡±£¬ÊÇÒòΪ²»ÄÜÓÃijÖÖ¡°persistent¡±£¨³Ö¾Ã£©¹Ø¼ü×Ö¼òµ¥µØµØ¶¨ÒåÒ»¸ö¶ÔÏ󣬲¢ÈÃϵͳ×Ô¶¯ÕÕ¿´ÆäËûËùÓÐϸ½ÚÎÊÌ⣨¾¡¹Ü½«À´¿ÉÄܳÉΪÏÖʵ£©¡£Ïà·´£¬±ØÐëÔÚ×Ô¼ºµÄ³ÌÐòÖÐÃ÷È·µØÐòÁл¯ºÍ×é×°¶ÔÏó¡£
ÓïÑÔÀïÔö¼ÓÁ˶ÔÏóÐòÁл¯µÄ¸ÅÄîºó£¬¿ÉÌṩ¶ÔÁ½ÖÖÖ÷ÒªÌØÐÔµÄÖ§³Ö¡£Java 1.1µÄ¡°Ô¶³Ì·½·¨µ÷Óá±£¨RMI£©Ê¹±¾À´´æÔÚÓÚÆäËû»úÆ÷µÄ¶ÔÏó¿ÉÒÔ±íÏÖ³öºÃÏó¾ÍÔÚ±¾µØ»úÆ÷ÉϵÄÐÐΪ¡£½«ÏûÏ¢·¢¸øÔ¶³Ì¶ÔÏóʱ£¬ÐèҪͨ¹ý¶ÔÏóÐòÁл¯À´´«Êä²ÎÊýºÍ·µ»ØÖµ¡£RMI½«ÔÚµÚ15ÕÂ×÷¾ßÌåÌÖÂÛ¡£
¶ÔÏóµÄÐòÁл¯Ò²ÊÇJava Beans±ØÐèµÄ£¬ºóÕßÓÉJava 1.1ÒýÈ롣ʹÓÃÒ»¸öBeanʱ£¬ËüµÄ״̬ÐÅϢͨ³£ÔÚÉè¼ÆÆÚ¼äÅäÖúᣳÌÐòÆô¶¯ÒÔºó£¬ÕâÖÖ״̬ÐÅÏ¢±ØÐë±£´æÏÂÀ´£¬ÒÔ±ã³ÌÐòÆô¶¯ÒÔºó»Ö¸´£»¾ßÌ幤×÷ÓɶÔÏóÐòÁл¯Íê³É¡£
¶ÔÏóµÄÐòÁл¯´¦Àí·Ç³£¼òµ¥£¬Ö»Ðè¶ÔÏóʵÏÖÁËSerializable½Ó¿Ú¼´¿É£¨¸Ã½Ó¿Ú½öÊÇÒ»¸ö±ê¼Ç£¬Ã»Óз½·¨£©¡£ÔÚJava 1.1ÖУ¬Ðí¶à±ê×¼¿âÀà¶¼·¢ÉúÁ˸ı䣬ÒÔ±ãÄܹ»ÐòÁл¯¡ª¡ªÆäÖаüÀ¨ÓÃÓÚ»ù±¾Êý¾ÝÀàÐ͵ÄÈ«²¿·â×°Æ÷¡¢ËùÓм¯ºÏÀàÒÔ¼°ÆäËûÐí¶à¶«Î÷¡£ÉõÖÁClass¶ÔÏóÒ²¿ÉÒÔÐòÁл¯£¨µÚ11Õ½²ÊöÁ˾ßÌåʵÏÖ¹ý³Ì£©¡£
ΪÐòÁл¯Ò»¸ö¶ÔÏó£¬Ê×ÏÈÒª´´½¨Ä³Ð©OutputStream¶ÔÏó£¬È»ºó½«Æä·â×°µ½ObjectOutputStream¶ÔÏóÄÚ¡£´Ëʱ£¬Ö»Ðèµ÷ÓÃwriteObject()¼´¿ÉÍê³É¶ÔÏóµÄÐòÁл¯£¬²¢½«Æä·¢Ë͸øOutputStream¡£Ïà·´µÄ¹ý³ÌÊǽ«Ò»¸öInputStream·â×°µ½ObjectInputStreamÄÚ£¬È»ºóµ÷ÓÃreadObject()¡£ºÍÍù³£Ò»Ñù£¬ÎÒÃÇ×îºó»ñµÃµÄÊÇÖ¸ÏòÒ»¸öÉÏËÝÔìÐÍObjectµÄ¾ä±ú£¬ËùÒÔ±ØÐëÏÂËÝÔìÐÍ£¬ÒÔ±ãÄܹ»Ö±½ÓÉèÖá£
¶ÔÏóÐòÁл¯Ìر𡰴ÏÃ÷¡±µÄÒ»¸öµØ·½ÊÇËü²»½ö±£´æÁ˶ÔÏóµÄ¡°È«¾°Í¼¡±£¬¶øÇÒÄÜ×·×Ù¶ÔÏóÄÚ°üº¬µÄËùÓоä±ú²¢±£´æÄÇЩ¶ÔÏó£»½Ó×ÅÓÖÄܶÔÿ¸ö¶ÔÏóÄÚ°üº¬µÄ¾ä±ú½øÐÐ×·×Ù£»ÒÔ´ËÀàÍÆ¡£ÎÒÃÇÓÐʱ½«ÕâÖÖÇé¿ö³ÆÎª¡°¶ÔÏóÍø¡±£¬µ¥¸ö¶ÔÏó¿ÉÓëÖ®½¨Á¢Á¬½Ó¡£¶øÇÒËü»¹°üº¬Á˶ÔÏóµÄ¾ä±úÊý×éÒÔ¼°³ÉÔ±¶ÔÏó¡£Èô±ØÐë×ÔÐвÙ×ÝÒ»Ì×¶ÔÏóÐòÁл¯»úÖÆ£¬ÄÇôÔÚ´úÂëÀï×·×ÙËùÓÐÕâЩÁ´½Óʱ¿ÉÄÜ»áÏԵ÷dz£Âé·³¡£ÔÚÁíÒ»·½Ã棬ÓÉÓÚJava¶ÔÏóµÄÐòÁл¯ËƺõÕÒ²»³öʲôȱµã£¬ËùÒÔÇ뾡Á¿²»Òª×Ô¼º¶¯ÊÖ£¬ÈÃËüÓÃÓÅ»¯µÄËã·¨×Ô¶¯Î¬»¤Õû¸ö¶ÔÏóÍø¡£ÏÂÃæÕâ¸öÀý×Ó¶ÔÐòÁл¯»úÖÆ½øÐÐÁ˲âÊÔ¡£Ëü½¨Á¢ÁËÐí¶àÁ´½Ó¶ÔÏóµÄÒ»¸ö¡°Worm¡±£¨È䳿£©£¬Ã¿¸ö¶ÔÏó¶¼ÓëWormÖеÄÏÂÒ»¶ÎÁ´½Ó£¬Í¬Ê±ÓÖÓëÊôÓÚ²»Í¬ÀࣨData£©µÄ¶ÔÏó¾ä±úÊý×éÁ´½Ó£º
//: Worm.java
// Demonstrates object serialization in Java 1.1
import java.io.*;

class Data implements Serializable {
  private int i;
  Data(int x) { i = x; }
  public String toString() {
    return Integer.toString(i);
  }
}

public class Worm implements Serializable {
  // Generate a random int value:
  private static int r() {
    return (int)(Math.random() * 10);
  }
  private Data[] d = {
    new Data(r()), new Data(r()), new Data(r())
  };
  private Worm next;
  private char c;
  // Value of i == number of segments
  Worm(int i, char x) {
    System.out.println(" Worm constructor: " + i);
    c = x;
    if(--i > 0)
      next = new Worm(i, (char)(x + 1));
  }
  Worm() {
    System.out.println("Default constructor");
  }
  public String toString() {
    String s = ":" + c + "(";
    for(int i = 0; i < d.length; i++)
      s += d[i].toString();
    s += ")";
    if(next != null)
      s += next.toString();
    return s;
  }
  public static void main(String[] args) {
    Worm w = new Worm(6, 'a');
    System.out.println("w = " + w);
    try {
      ObjectOutputStream out =
        new ObjectOutputStream(
          new FileOutputStream("worm.out"));
      out.writeObject("Worm storage");
      out.writeObject(w);
      out.close(); // Also flushes output
      ObjectInputStream in =
        new ObjectInputStream(
          new FileInputStream("worm.out"));
      String s = (String)in.readObject();
      Worm w2 = (Worm)in.readObject();
      System.out.println(s + ", w2 = " + w2);
    } catch(Exception e) {
      e.printStackTrace();
    }
    try {
      ByteArrayOutputStream bout =
        new ByteArrayOutputStream();
      ObjectOutputStream out =
        new ObjectOutputStream(bout);
      out.writeObject("Worm storage");
      out.writeObject(w);
      out.flush();
      ObjectInputStream in =
        new ObjectInputStream(
          new ByteArrayInputStream(
            bout.toByteArray()));
      String s = (String)in.readObject();
      Worm w3 = (Worm)in.readObject();
      System.out.println(s + ", w3 = " + w3);
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
} ///:~

¸üÓÐȤµÄÊÇ£¬WormÄÚµÄData¶ÔÏóÊý×éÊÇÓÃËæ»úÊý×Ö³õʼ»¯µÄ£¨ÕâÑù±ã²»Óû³ÒɱàÒëÆ÷±£ÁôÁËijÖÖԭʼÐÅÏ¢£©¡£Ã¿¸öWorm¶Î¶¼ÓÃÒ»¸öChar±ê¼Ç¡£Õâ¸öCharÊÇÔÚÖØ¸´Éú³ÉÁ´½ÓµÄWormÁбíʱ×Ô¶¯²úÉúµÄ¡£´´½¨Ò»¸öWormʱ£¬Ðè¸æËß¹¹½¨Æ÷Ï£ÍûËüÓж೤¡£Îª²úÉúÏÂÒ»¸ö¾ä±ú£¨next£©£¬Ëü×ÜÊÇÓüõÈ¥1µÄ³¤¶ÈÀ´µ÷ÓÃWorm¹¹½¨Æ÷¡£×îºóÒ»¸önext¾ä±úÔò±£³ÖΪnull£¨¿Õ£©£¬±íʾÒѵִïWormµÄβ²¿¡£
ÉÏÃæµÄËùÓвÙ×÷¶¼ÊÇΪÁ˼ÓÉîÊÂÇéµÄ¸´Ôӳ̶ȣ¬¼Ó´ó¶ÔÏóÐòÁл¯µÄÄѶȡ£È»¶ø£¬ÕæÕýµÄÐòÁл¯¹ý³ÌÈ´ÊǷdz£¼òµ¥µÄ¡£Ò»µ©´ÓÁíÍâij¸öÁ÷Àï´´½¨ÁËObjectOutputStream£¬writeObject()¾Í»áÐòÁл¯¶ÔÏó¡£×¢ÒâÒ²¿ÉÒÔΪһ¸öStringµ÷ÓÃwriteObject()¡£Òà¿ÉʹÓÃÓëDataOutputStreamÏàͬµÄ·½·¨Ð´ÈëËùÓлù±¾Êý¾ÝÀàÐÍ£¨ËüÃÇÓÐÏàͬµÄ½Ó¿Ú£©¡£
ÓÐÁ½¸öµ¥¶ÀµÄtry¿é¿´ÆðÀ´ÊÇÀàËÆµÄ¡£µÚÒ»¸ö¶ÁдµÄÊÇÎļþ£¬¶øÁíÒ»¸ö¶ÁдµÄÊÇÒ»¸öByteArray£¨×Ö½ÚÊý×飩¡£¿ÉÀûÓöÔÈκÎDataInputStream»òÕßDataOutputStreamµÄÐòÁл¯À´¶ÁÐ´ÌØ¶¨µÄ¶ÔÏó£»ÕýÈçÔÚ¹ØÓÚÁ¬ÍøµÄÄÇÒ»Õ»ὲµ½µÄÄÇÑù£¬ÕâЩ¶ÔÏóÉõÖÁ°üÀ¨ÍøÂç¡£Ò»´ÎÑ­»·ºóµÄÊä³ö½á¹ûÈçÏ£º
Worm constructor: 6
Worm constructor: 5
Worm constructor: 4
Worm constructor: 3
Worm constructor: 2
Worm constructor: 1
w = :a(262):b(100):c(396):d(480):e(316):f(398)
Worm storage, w2 = :a(262):b(100):c(396):d(480):e(316):f(398)
Worm storage, w3 = :a(262):b(100):c(396):d(480):e(316):f(398)

¿ÉÒÔ¿´³ö£¬×°Åä»ØÔ­×´µÄ¶ÔÏóȷʵ°üº¬ÁËÔ­À´ÄǸö¶ÔÏóÀï°üº¬µÄËùÓÐÁ´½Ó¡£
×¢ÒâÔÚ¶ÔÒ»¸öSerializable£¨¿ÉÐòÁл¯£©¶ÔÏó½øÐÐÖØÐÂ×°ÅäµÄ¹ý³ÌÖУ¬²»»áµ÷ÓÃÈκι¹½¨Æ÷£¨ÉõÖÁĬÈϹ¹½¨Æ÷£©¡£Õû¸ö¶ÔÏó¶¼ÊÇͨ¹ý´ÓInputStreamÖÐÈ¡µÃÊý¾Ý»Ö¸´µÄ¡£
×÷ΪJava 1.1ÌØÐÔµÄÒ»ÖÖ£¬ÎÒÃÇ×¢Òâµ½¶ÔÏóµÄÐòÁл¯²¢²»ÊôÓÚеÄReaderºÍWriter²ã´Î½á¹¹µÄÒ»²¿·Ö£¬¶øÊÇÑØÓÃÀÏʽµÄInputStreamºÍOutputStream½á¹¹¡£ËùÒÔÔÚÒ»Ð©ÌØÊâµÄ³¡ºÏÏ£¬²»µÃ²»»ìºÏʹÓÃÁ½ÖÖÀàÐ͵IJã´Î½á¹¹¡£

10.9.1 ѰÕÒÀà
¶ÁÕß»òÐí»áÆæ¹ÖΪʲôÐèÒªÒ»¸ö¶ÔÏó´ÓËüµÄÐòÁл¯×´Ì¬Öлָ´¡£¾Ù¸öÀý×ÓÀ´Ëµ£¬¼Ù¶¨ÎÒÃÇÐòÁл¯Ò»¸ö¶ÔÏ󣬲¢Í¨¹ýÍøÂ罫Æä×÷ΪÎļþ´«Ë͸øÁíһ̨»úÆ÷¡£´Ëʱ£¬Î»ÓÚÁíһ̨»úÆ÷µÄ³ÌÐò¿ÉÒÔÖ»ÓÃÎļþĿ¼À´ÖØÐ¹¹ÔìÕâ¸ö¶ÔÏóÂð£¿
»Ø´ðÕâ¸öÎÊÌâµÄ×îºÃ·½·¨¾ÍÊÇ×öÒ»¸öʵÑé¡£ÏÂÃæÕâ¸öÎļþλÓÚ±¾ÕµÄ×ÓĿ¼Ï£º
//: Alien.java
// A serializable class
import java.io.*;

public class Alien implements Serializable {
} ///:~

ÓÃÓÚ´´½¨ºÍÐòÁл¯Ò»¸öAlien¶ÔÏóµÄÎļþλÓÚÏàͬµÄĿ¼Ï£º
//: FreezeAlien.java
// Create a serialized output file
import java.io.*;

public class FreezeAlien {
  public static void main(String[] args) 
      throws Exception {
    ObjectOutput out = 
      new ObjectOutputStream(
        new FileOutputStream("file.x"));
    Alien zorcon = new Alien();
    out.writeObject(zorcon); 
  }
} ///:~

¸Ã³ÌÐò²¢²»ÊDz¶»ñºÍ¿ØÖÆÎ¥Àý£¬¶øÊǽ«Î¥Àý¼òµ¥¡¢Ö±½ÓµØ´«µÝµ½main()Íⲿ£¬ÕâÑù±ãÄÜÔÚÃüÁîÐб¨¸æËüÃÇ¡£
³ÌÐò±àÒë²¢ÔËÐк󣬽«½á¹û²úÉúµÄfile.x¸´ÖƵ½ÃûΪxfilesµÄ×ÓĿ¼£¬´úÂëÈçÏ£º
//: ThawAlien.java
// Try to recover a serialized file without the 
// class of object that's stored in that file.
package c10.xfiles;
import java.io.*;

public class ThawAlien {
  public static void main(String[] args) 
      throws Exception {
    ObjectInputStream in =
      new ObjectInputStream(
        new FileInputStream("file.x"));
    Object mystery = in.readObject();
    System.out.println(
      mystery.getClass().toString());
  }
} ///:~

¸Ã³ÌÐòÄÜ´ò¿ªÎļþ£¬²¢³É¹¦¶ÁÈ¡mystery¶ÔÏóÖеÄÄÚÈÝ¡£È»¶ø£¬Ò»µ©³¢ÊÔ²éÕÒÓë¶ÔÏóÓйصÄÈκÎ×ÊÁÏ¡ª¡ªÕâÒªÇóAlienµÄClass¶ÔÏ󡪡ªJavaÐéÄâ»ú£¨JVM£©±ãÕÒ²»µ½Alien.class£¨³ý·ÇËüÕýºÃÔÚÀà·¾¶ÄÚ£¬¶ø±¾ÀýÀíÓ¦Ïà·´£©¡£ÕâÑù¾Í»áµÃµ½Ò»¸öÃû½ÐClassNotFoundExceptionµÄÎ¥Àý£¨Í¬ÑùµØ£¬Èô·ÇÄܹ»Ð£ÑéAlien´æÔÚµÄÖ¤¾Ý£¬·ñÔòËüµÈÓÚÏûʧ£©¡£
»Ö¸´ÁËÒ»¸öÐòÁл¯µÄ¶ÔÏóºó£¬Èç¹ûÏë¶ÔÆä×ö¸ü¶àµÄÊÂÇ飬±ØÐë±£Ö¤JVMÄÜÔÚ±¾µØÀà·¾¶»òÕßÒòÌØÍøµÄÆäËûʲôµØ·½ÕÒµ½Ïà¹ØµÄ.classÎļþ¡£

10.9.2 ÐòÁл¯µÄ¿ØÖÆ
ÕýÈç´ó¼Ò¿´µ½µÄÄÇÑù£¬Ä¬ÈϵÄÐòÁл¯»úÖÆ²¢²»ÄѲÙ×Ý¡£È»¶ø£¬¼ÙÈôÓÐÌØÊâÒªÇóÓÖ¸ÃÔõô°ìÄØ£¿ÎÒÃÇ¿ÉÄÜÓÐÌØÊâµÄ°²È«ÎÊÌ⣬²»Ï£Íû¶ÔÏóµÄijһ²¿·ÖÐòÁл¯£»»òÕßijһ¸ö×Ó¶ÔÏóÍêÈ«²»±ØÐòÁл¯£¬ÒòΪ¶ÔÏó»Ö¸´ÒÔºó£¬ÄÇÒ»²¿·ÖÐèÒªÖØÐ´´½¨¡£
´Ëʱ£¬Í¨¹ýʵÏÖExternalizable½Ó¿Ú£¬ÓÃËü´úÌæSerializable½Ó¿Ú£¬±ã¿É¿ØÖÆÐòÁл¯µÄ¾ßÌå¹ý³Ì¡£Õâ¸öExternalizable½Ó¿ÚÀ©Õ¹ÁËSerializable£¬²¢ÔöÌíÁËÁ½¸ö·½·¨£ºwriteExternal()ºÍreadExternal()¡£ÔÚÐòÁл¯ºÍÖØÐÂ×°ÅäµÄ¹ý³ÌÖУ¬»á×Ô¶¯µ÷ÓÃÕâÁ½¸ö·½·¨£¬ÒÔ±ãÎÒÃÇÖ´ÐÐÒ»Ð©ÌØÊâ²Ù×÷¡£
ÏÂÃæÕâ¸öÀý×ÓչʾÁËExternalizable½Ó¿Ú·½·¨µÄ¼òµ¥Ó¦Óá£×¢ÒâBlip1ºÍBlip2¼¸ºõÍêȫһÖ£¬³ýÁ˼«Î¢Ð¡µÄ²î±ð£¨×Ô¼ºÑо¿Ò»Ï´úÂ룬¿´¿´ÊÇ·ñÄÜ·¢ÏÖ£©£º
//: Blips.java
// Simple use of Externalizable & a pitfall
import java.io.*;
import java.util.*;

class Blip1 implements Externalizable {
  public Blip1() {
    System.out.println("Blip1 Constructor");
  }
  public void writeExternal(ObjectOutput out)
      throws IOException {
    System.out.println("Blip1.writeExternal");
  }
  public void readExternal(ObjectInput in)
     throws IOException, ClassNotFoundException {
    System.out.println("Blip1.readExternal");
  }
}

class Blip2 implements Externalizable {
  Blip2() {
    System.out.println("Blip2 Constructor");
  }
  public void writeExternal(ObjectOutput out)
      throws IOException {
    System.out.println("Blip2.writeExternal");
  }
  public void readExternal(ObjectInput in)
     throws IOException, ClassNotFoundException {
    System.out.println("Blip2.readExternal");
  }
}

public class Blips {
  public static void main(String[] args) {
    System.out.println("Constructing objects:");
    Blip1 b1 = new Blip1();
    Blip2 b2 = new Blip2();
    try {
      ObjectOutputStream o =
        new ObjectOutputStream(
          new FileOutputStream("Blips.out"));
      System.out.println("Saving objects:");
      o.writeObject(b1);
      o.writeObject(b2);
      o.close();
      // Now get them back:
      ObjectInputStream in =
        new ObjectInputStream(
          new FileInputStream("Blips.out"));
      System.out.println("Recovering b1:");
      b1 = (Blip1)in.readObject();
      // OOPS! Throws an exception:
//!   System.out.println("Recovering b2:");
//!   b2 = (Blip2)in.readObject();
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
} ///:~

¸Ã³ÌÐòÊä³öÈçÏ£º
Constructing objects:
Blip1 Constructor
Blip2 Constructor
Saving objects:
Blip1.writeExternal
Blip2.writeExternal
Recovering b1:
Blip1 Constructor
Blip1.readExternal

δ»Ö¸´Blip2¶ÔÏóµÄÔ­ÒòÊÇÄÇÑù×ö»áµ¼ÖÂÒ»¸öÎ¥Àý¡£ÄãÕÒ³öÁËBlip1ºÍBlip2Ö®¼äµÄÇø±ðÂð£¿Blip1µÄ¹¹½¨Æ÷ÊÇ¡°¹«¹²µÄ¡±£¨public£©£¬Blip2µÄ¹¹½¨Æ÷Ôò²»È»£¬ÕâÑù±ã»áÔÚ»Ö¸´Ê±Ôì³ÉÎ¥Àý¡£ÊÔÊÔ½«Blip2µÄ¹¹½¨Æ÷ÊôÐÔ±ä³É¡°public¡±£¬È»ºóɾ³ý//!×¢Êͱê¼Ç£¬¿´¿´ÊÇ·ñÄܵõ½ÕýÈ·µÄ½á¹û¡£
»Ö¸´b1ºó£¬»áµ÷ÓÃBlip1ĬÈϹ¹½¨Æ÷¡£ÕâÓë»Ö¸´Ò»¸öSerializable£¨¿ÉÐòÁл¯£©¶ÔÏó²»Í¬¡£ÔÚºóÕßµÄÇé¿öÏ£¬¶ÔÏóÍêÈ«ÒÔËü±£´æÏÂÀ´µÄ¶þ½øÖÆÎ»Îª»ù´¡»Ö¸´£¬²»´æÔÚ¹¹½¨Æ÷µ÷Ó᣶ø¶ÔÒ»¸öExternalizable¶ÔÏó£¬ËùÓÐÆÕͨµÄĬÈϹ¹½¨ÐÐΪ¶¼»á·¢Éú£¨°üÀ¨ÔÚ×ֶζ¨ÒåʱµÄ³õʼ»¯£©£¬¶øÇÒ»áµ÷ÓÃreadExternal()¡£±ØÐë×¢ÒâÕâÒ»ÊÂʵ¡ª¡ªÌرð×¢ÒâËùÓÐĬÈϵĹ¹½¨ÐÐΪ¶¼»á½øÐСª¡ª·ñÔòºÜÄÑÔÚ×Ô¼ºµÄExternalizable¶ÔÏóÖвúÉúÕýÈ·µÄÐÐΪ¡£
ÏÂÃæÕâ¸öÀý×Ó½ÒʾÁ˱£´æºÍ»Ö¸´Ò»¸öExternalizable¶ÔÏó±ØÐë×öµÄÈ«²¿ÊÂÇ飺
//: Blip3.java
// Reconstructing an externalizable object
import java.io.*;
import java.util.*;

class Blip3 implements Externalizable {
  int i;
  String s; // No initialization
  public Blip3() {
    System.out.println("Blip3 Constructor");
    // s, i not initialized
  }
  public Blip3(String x, int a) {
    System.out.println("Blip3(String x, int a)");
    s = x;
    i = a;
    // s & i initialized only in non-default
    // constructor.
  }
  public String toString() { return s + i; }
  public void writeExternal(ObjectOutput out)
      throws IOException {
    System.out.println("Blip3.writeExternal");
    // You must do this:
    out.writeObject(s); out.writeInt(i);
  }
  public void readExternal(ObjectInput in)
     throws IOException, ClassNotFoundException {
    System.out.println("Blip3.readExternal");
    // You must do this:
    s = (String)in.readObject(); 
    i =in.readInt();
  }
  public static void main(String[] args) {
    System.out.println("Constructing objects:");
    Blip3 b3 = new Blip3("A String ", 47);
    System.out.println(b3.toString());
    try {
      ObjectOutputStream o =
        new ObjectOutputStream(
          new FileOutputStream("Blip3.out"));
      System.out.println("Saving object:");
      o.writeObject(b3);
      o.close();
      // Now get it back:
      ObjectInputStream in =
        new ObjectInputStream(
          new FileInputStream("Blip3.out"));
      System.out.println("Recovering b3:");
      b3 = (Blip3)in.readObject();
      System.out.println(b3.toString());
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
} ///:~

ÆäÖУ¬×Ö¶ÎsºÍiÖ»ÔÚµÚ¶þ¸ö¹¹½¨Æ÷Öгõʼ»¯£¬²»¹ØÄ¬ÈϹ¹½¨Æ÷µÄÊ¡£ÕâÒâζ׿ÙÈç²»ÔÚreadExternalÖгõʼ»¯sºÍi£¬ËüÃǾͻá³ÉΪnull£¨ÒòΪÔÚ¶ÔÏó´´½¨µÄµÚÒ»²½ÖÐÒѽ«¶ÔÏóµÄ´æ´¢¿Õ¼äÇå³ýΪ1£©¡£Èô×¢Ê͵ô¸úËæÓÚ¡°You must do this¡±ºóÃæµÄÁ½ÐдúÂ룬²¢ÔËÐгÌÐò£¬¾Í»á·¢ÏÖµ±¶ÔÏó»Ö¸´ÒÔºó£¬sÊÇnull£¬¶øiÊÇÁã¡£
Èô´ÓÒ»¸öExternalizable¶ÔÏó¼Ì³Ð£¬Í¨³£ÐèÒªµ÷ÓÃwriteExternal()ºÍreadExternal()µÄ»ù´¡Àà°æ±¾£¬ÒÔ±ãÕýÈ·µØ±£´æºÍ»Ö¸´»ù´¡Àà×é¼þ¡£
ËùÒÔΪÁËÈÃÒ»ÇÐÕý³£ÔË×÷ÆðÀ´£¬Ç§Íò²»¿É½öÔÚwriteExternal()·½·¨Ö´ÐÐÆÚ¼äдÈë¶ÔÏóµÄÖØÒªÊý¾Ý£¨Ã»ÓÐĬÈϵÄÐÐΪ¿ÉÓÃÀ´ÎªÒ»¸öExternalizable¶ÔÏóдÈëËùÓгÉÔ±¶ÔÏ󣩵쬶øÊDZØÐëÔÚreadExternal()·½·¨ÖÐÒ²»Ö¸´ÄÇЩÊý¾Ý¡£³õ´Î²Ù×÷ʱ¿ÉÄÜ»áÓÐЩ²»Ï°¹ß£¬ÒòΪExternalizable¶ÔÏóµÄĬÈϹ¹½¨ÐÐΪʹÆä¿´ÆðÀ´ËƺõÕýÔÚ½øÐÐijÖÖ´æ´¢Óë»Ö¸´²Ù×÷¡£µ«ÊµÇé²¢·ÇÈç´Ë¡£

1. transient£¨ÁÙʱ£©¹Ø¼ü×Ö
¿ØÖÆÐòÁл¯¹ý³Ìʱ£¬¿ÉÄÜÓÐÒ»¸öÌØ¶¨µÄ×Ó¶ÔÏó²»Ô¸ÈÃJavaµÄÐòÁл¯»úÖÆ×Ô¶¯±£´æÓë»Ö¸´¡£Ò»°ãµØ£¬ÈôÄǸö×Ó¶ÔÏó°üº¬Á˲»ÏëÐòÁл¯µÄÃô¸ÐÐÅÏ¢£¨ÈçÃÜÂ룩£¬¾Í»áÃæÁÙÕâÖÖÇé¿ö¡£¼´Ê¹ÄÇÖÖÐÅÏ¢ÔÚ¶ÔÏóÖоßÓС°private¡±£¨Ë½ÓУ©ÊôÐÔ£¬µ«Ò»µ©¾­ÐòÁл¯´¦Àí£¬ÈËÃǾͿÉÒÔͨ¹ý¶Áȡһ¸öÎļþ£¬»òÕßÀ¹½ØÍøÂç´«ÊäµÃµ½Ëü¡£
Ϊ·ÀÖ¹¶ÔÏóµÄÃô¸Ð²¿·Ö±»ÐòÁл¯£¬Ò»¸ö°ì·¨Êǽ«×Ô¼ºµÄÀàʵÏÖΪExternalizable£¬¾ÍÏóÇ°ÃæÕ¹Ê¾µÄÄÇÑù¡£ÕâÑùÒ»À´£¬Ã»ÓÐÈκζ«Î÷¿ÉÒÔ×Ô¶¯ÐòÁл¯£¬Ö»ÄÜÔÚwriteExternal()Ã÷È·ÐòÁл¯ÄÇЩÐèÒªµÄ²¿·Ö¡£
È»¶ø£¬Èô²Ù×÷µÄÊÇÒ»¸öSerializable¶ÔÏó£¬ËùÓÐÐòÁл¯²Ù×÷¶¼»á×Ô¶¯½øÐС£Îª½â¾öÕâ¸öÎÊÌ⣬¿ÉÒÔÓÃtransient£¨ÁÙʱ£©Öð¸ö×ֶεعرÕÐòÁл¯£¬ËüµÄÒâ˼ÊÇ¡°²»ÒªÂé·³Ä㣨ָ×Ô¶¯»úÖÆ£©±£´æ»ò»Ö¸´ËüÁË¡ª¡ªÎÒ»á×Ô¼º´¦ÀíµÄ¡±¡£
ÀýÈ磬¼ÙÉèÒ»¸öLogin¶ÔÏó°üº¬ÁËÓëÒ»¸öÌØ¶¨µÄµÇ¼»á»°ÓйصÄÐÅÏ¢¡£Ð£ÑéµÇ¼µÄºÏ·¨ÐÔʱ£¬Ò»°ã¶¼Ï뽫Êý¾Ý±£´æÏÂÀ´£¬µ«²»°üÀ¨ÃÜÂ롣Ϊ×öµ½ÕâÒ»µã£¬×î¼òµ¥µÄ°ì·¨ÊÇʵÏÖSerializable£¬²¢½«password×Ö¶ÎÉèΪtransient¡£ÏÂÃæÊǾßÌåµÄ´úÂ룺
//: Logon.java
// Demonstrates the "transient" keyword
import java.io.*;
import java.util.*;

class Logon implements Serializable {
  private Date date = new Date();
  private String username;
  private transient String password;
  Logon(String name, String pwd) {
    username = name;
    password = pwd;
  }
  public String toString() {
    String pwd =
      (password == null) ? "(n/a)" : password;
    return "logon info: \n   " +
      "username: " + username +
      "\n   date: " + date.toString() +
      "\n   password: " + pwd;
  }
  public static void main(String[] args) {
    Logon a = new Logon("Hulk", "myLittlePony");
    System.out.println( "logon a = " + a);
    try {
      ObjectOutputStream o =
        new ObjectOutputStream(
          new FileOutputStream("Logon.out"));
      o.writeObject(a);
      o.close();
      // Delay:
      int seconds = 5;
      long t = System.currentTimeMillis()
             + seconds * 1000;
      while(System.currentTimeMillis() < t)
        ;
      // Now get them back:
      ObjectInputStream in =
        new ObjectInputStream(
          new FileInputStream("Logon.out"));
      System.out.println(
        "Recovering object at " + new Date());
      a = (Logon)in.readObject();
      System.out.println( "logon a = " + a);
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
} ///:~

¿ÉÒÔ¿´µ½£¬ÆäÖеÄdateºÍusername×ֶα£³Öԭʼ״̬£¨Î´Éè³Étransient£©£¬ËùÒÔ»á×Ô¶¯ÐòÁл¯¡£È»¶ø£¬password±»ÉèΪtransient£¬ËùÒÔ²»»á×Ô¶¯±£´æµ½´ÅÅÌ£»ÁíÍ⣬×Ô¶¯ÐòÁл¯»úÖÆÒ²²»»á×÷»Ö¸´ËüµÄ³¢ÊÔ¡£Êä³öÈçÏ£º
logon a = logon info:
   username: Hulk
   date: Sun Mar 23 18:25:53 PST 1997
   password: myLittlePony
Recovering object at Sun Mar 23 18:25:59 PST 1997
logon a = logon info:
   username: Hulk
   date: Sun Mar 23 18:25:53 PST 1997
   password: (n/a)

Ò»µ©¶ÔÏó»Ö¸´³ÉÔ­À´µÄÑù×Ó£¬password×ֶξͻá±ä³Énull¡£×¢Òâ±ØÐëÓÃtoString()¼ì²épasswordÊÇ·ñΪnull£¬ÒòΪÈôÓùýÔØµÄ¡°+¡±ÔËËã·ûÀ´×°ÅäÒ»¸öString¶ÔÏ󣬶øÇÒÄǸöÔËËã·ûÓöµ½Ò»¸önull¾ä±ú£¬¾Í»áÔì³ÉÒ»¸öÃûΪNullPointerExceptionµÄÎ¥Àý£¨Ð°æJava¿ÉÄÜ»áÌṩ±ÜÃâÕâ¸öÎÊÌâµÄ´úÂ룩¡£
ÎÒÃÇÒ²·¢ÏÖdate×ֶα»±£´æµ½´ÅÅÌ£¬²¢´Ó´ÅÅָ̻´£¬Ã»ÓÐÖØÐÂÉú³É¡£
ÓÉÓÚExternalizable¶ÔÏóĬÈÏʱ²»±£´æËüµÄÈκÎ×ֶΣ¬ËùÒÔtransient¹Ø¼ü×ÖÖ»ÄܰéËæSerializableʹÓá£

2. ExternalizableµÄÌæ´ú·½·¨
Èô²»ÊÇÌØ±ðÔÚÒâҪʵÏÖExternalizable½Ó¿Ú£¬»¹ÓÐÁíÒ»ÖÖ·½·¨¿É¹©Ñ¡Óá£ÎÒÃÇ¿ÉÒÔʵÏÖSerializable½Ó¿Ú£¬²¢Ìí¼Ó£¨×¢ÒâÊÇ¡°Ìí¼Ó¡±£¬¶ø·Ç¡°¸²¸Ç¡±»òÕß¡°ÊµÏÖ¡±£©ÃûΪwriteObject()ºÍreadObject()µÄ·½·¨¡£Ò»µ©¶ÔÏó±»ÐòÁл¯»òÕßÖØÐÂ×°Å䣬¾Í»á·Ö±ðµ÷ÓÃÄÇÁ½¸ö·½·¨¡£Ò²¾ÍÊÇ˵£¬Ö»ÒªÌṩÁËÕâÁ½¸ö·½·¨£¬¾Í»áÓÅÏÈʹÓÃËüÃÇ£¬¶ø²»¿¼ÂÇĬÈϵÄÐòÁл¯»úÖÆ¡£
ÕâЩ·½·¨±ØÐ뺬ÓÐÏÂÁÐ׼ȷµÄÇ©Ãû£º
private void 
  writeObject(ObjectOutputStream stream)
    throws IOException;

private void 
  readObject(ObjectInputStream stream)
    throws IOException, ClassNotFoundException

´ÓÉè¼ÆµÄ½Ç¶È³ö·¢£¬Çé¿ö±äµÃÓÐЩÆËË·ÃÔÀë¡£Ê×ÏÈ£¬´ó¼Ò¿ÉÄÜÈÏΪÕâЩ·½·¨²»ÊôÓÚ»ù´¡Àà»òÕßSerializable½Ó¿ÚµÄÒ»²¿·Ö£¬ËüÃÇÓ¦¸ÃÔÚ×Ô¼ºµÄ½Ó¿ÚÖеõ½¶¨Òå¡£µ«Çë×¢ÒâËüÃDZ»¶¨Òå³É¡°private¡±£¬ÕâÒâζ×ÅËüÃÇÖ»ÄÜÓÉÕâ¸öÀàµÄÆäËû³ÉÔ±µ÷Óá£È»¶ø£¬ÎÒÃÇʵ¼Ê²¢²»´ÓÕâ¸öÀàµÄÆäËû³ÉÔ±Öе÷ÓÃËüÃÇ£¬¶øÊÇÓÉObjectOutputStreamºÍObjectInputStreamµÄwriteObject()¼°readObject()·½·¨À´µ÷ÓÃÎÒÃǶÔÏóµÄwriteObject()ºÍreadObject()·½·¨£¨×¢ÒâÎÒÔÚÕâÀïÓÃÁ˺ܴóµÄÒÖÖÆÁ¦À´±ÜÃâʹÓÃÏàͬµÄ·½·¨Ãû¡ª¡ªÒòΪÅ»ìÏý£©¡£´ó¼Ò¿ÉÄÜÆæ¹ÖObjectOutputStreamºÍObjectInputStreamÈçºÎÓÐȨ·ÃÎÊÎÒÃǵÄÀàµÄprivate·½·¨¡ª¡ªÖ»ÄÜÈÏΪÕâÊÇÐòÁл¯»úÖÆÍæµÄÒ»¸ö°ÑÏ·¡£
ÔÚÈκÎÇé¿öÏ£¬½Ó¿ÚÖе͍ÒåµÄÈκζ«Î÷¶¼»á×Ô¶¯¾ßÓÐpublicÊôÐÔ£¬ËùÒÔ¼ÙÈôwriteObject()ºÍreadObject()±ØÐëΪprivate£¬ÄÇôËüÃDz»ÄܳÉΪ½Ó¿Ú£¨interface£©µÄÒ»²¿·Ö¡