ࡱ> 7 4hbjbjUU 27|7|4dl<<<<|&2X h&j&j&j&j&j&j&' *j&  j& & h& h&  "%$&L *6t< %$&D&0&%,* *$& Internet Programming with Java Course 1.2 Java Input/Output Text and Binary Streams Introduction to Data Streams Often programs need to bring in information from an external source or send out information to an external destination. The information can be anywhere: in a file, on disk, somewhere on the network, in memory, or in another program. Also, it can be of any type: objects, characters, images, or sounds. To bring in information, a program opens a stream on an information source (a file, memory, a socket) and reads the information serially, like this:  INCLUDEPICTURE "C:\\InetJava Books\\IO\\The Java Tutorial - IO_files\\figures\\essential\\19stream.gif" \* MERGEFORMATINET  Similarly, a program can send information to an external destination by opening a stream to a destination and writing the information out serially, like this:  INCLUDEPICTURE "C:\\InetJava Books\\IO\\The Java Tutorial - IO_files\\figures\\essential\\20stream2.gif" \* MERGEFORMATINET  No matter where the information is coming from or going to and no matter what type of data is being read or written, the algorithms for reading and writing data is pretty much always the same. ReadingWritingopen a stream while more information read information close the streamopen a stream while more information write information close the streamThe  HYPERLINK "http://java.sun.com/products/jdk/1.2/docs/api/java/io/package-summary.html" \t "apidoc" java.io package contains a collection of stream classes that support these algorithms for reading and writing. These classes are divided into two class hierarchies based on the data type (either characters or bytes) on which they operate.  INCLUDEPICTURE "C:\\InetJava Books\\IO\\The Java Tutorial - IO_files\\figures\\essential\\21chstream.gif" \* MERGEFORMATINET  However, it's often more convenient to group the classes based on their purpose rather than on the data type they read and write. Thus, we can cross-group the streams by whether they read from and write to data "sinks" or process the information as its being read or written.  HYPERLINK "C:\InetJava Books\IO\The Java Tutorial - IO_files\figures\essential\22charstream.gif" \t "_top"  INCLUDEPICTURE "C:\\InetJava Books\\IO\\The Java Tutorial - IO_files\\figures\\essential\\22charstream.gif" \* MERGEFORMATINET  Overview of I/O Streams Character Streams Reader and Writer are the abstract superclasses for character streams in java.io. Reader provides the API and partial implementation for readers--streams that read 16-bit characters--and Writer provides the API and partial implementation for writers--streams that write 16-bit characters. Subclasses of Reader and Writer implement specialized streams and are divided into two categories: those that read from or write to data sinks (shown in gray in the following figures) and those that perform some sort of processing (shown in white). The figure shows the class hierarchies for the Reader and Writer classes.  HYPERLINK "C:\InetJava Books\IO\The Java Tutorial - IO_files\figures\essential\23reader.gif" \t "_top"  INCLUDEPICTURE "C:\\InetJava Books\\IO\\The Java Tutorial - IO_files\\figures\\essential\\23reader.gif" \* MERGEFORMATINET   HYPERLINK "C:\InetJava Books\IO\The Java Tutorial - IO_files\figures\essential\24writer.gif" \t "_top"  INCLUDEPICTURE "C:\\InetJava Books\\IO\\The Java Tutorial - IO_files\\figures\\essential\\24writer.gif" \* MERGEFORMATINET  Most programs should use readers and writers to read and write information. This is because they both can handle any character in the Unicode character set (while the byte streams are limited to ISO-Latin-1 8-bit bytes). Byte Streams (Binary Streams) Programs should use the byte streams, descendants of InputStream and OutputStream, to read and write 8-bit bytes. InputStream and OutputStream provide the API and some implementation for input streams (streams that read 8-bit bytes) and output streams (streams that write 8-bit bytes). These streams are typically used to read and write binary data such as images and sounds. As with Reader and Writer, subclasses of InputStream and OutputStream provide specialized I/O that falls into two categories: data sink streams and processing streams. Figure 56 shows the class hierarchies for the byte streams.  INCLUDEPICTURE "C:\\InetJava Books\\IO\\The Java Tutorial - IO_files\\figures\\essential\\25inputs.gif" \* MERGEFORMATINET   INCLUDEPICTURE "C:\\InetJava Books\\IO\\The Java Tutorial - IO_files\\figures\\essential\\26outputs.gif" \* MERGEFORMATINET  As mentioned, two of the byte stream classes, ObjectInputStream and ObjectOutputStream, are used for object serialization. Understanding the I/O Superclasses Reader and InputStream define similar APIs but for different data types. For example, Reader contains these methods for reading characters and arrays of characters: int read() int read(char cbuf[]) int read(char cbuf[], int offset, int length) InputStream defines the same methods but for reading bytes and arrays of bytes: int read() int read(byte cbuf[]) int read(byte cbuf[], int offset, int length) Also, both Reader and InputStream provide methods for marking a location in the stream, skipping input, and resetting the current position. Writer and OutputStream are similarly parallel. Writer defines these methods for writing characters and arrays of characters: int write(int c) int write(char cbuf[]) int write(char cbuf[], int offset, int length) And OutputStream defines the same methods but for bytes: int write(int c) int write(byte cbuf[]) int write(byte cbuf[], int offset, int length) All of the streams--readers, writers, input streams, and output streams--are automatically opened when created. You can close any stream explicitly by calling its close method. Or the garbage collector can implicitly close it, which occurs when the object is no longer referenced. How to Use File Streams File streams are perhaps the easiest streams to understand. Simply put, the file streams -  HYPERLINK "http://java.sun.com/products/jdk/1.2/docs/api/java.io.FileReader.html" \t "apidoc" FileReader,  HYPERLINK "http://java.sun.com/products/jdk/1.2/docs/api/java.io.FileWriter.html" \t "apidoc" FileWriter,  HYPERLINK "http://java.sun.com/products/jdk/1.2/docs/api/java.io.FileInputStream.html" \t "apidoc" FileInputStream, and  HYPERLINK "http://java.sun.com/products/jdk/1.2/docs/api/java.io.FileOutputStream.html" \t "apidoc" FileOutputStream - each read or write from a file on the native file system. You can create a file stream from a filename, a  HYPERLINK "http://java.sun.com/products/jdk/1.2/docs/api/java.io.File.html" \t "apidoc" File object, or a  HYPERLINK "http://java.sun.com/products/jdk/1.2/docs/api/java.io.FileDescriptor.html" \t "apidoc" FileDescriptor object. The following  HYPERLINK "C:\InetJava Books\IO\The Java Tutorial - IO_files\essential\io\example-1dot1\Copy.java" \t "source" Copy program uses FileReader and FileWriter to copy the contents of a file named input.txt into a file called output.txt : import java.io.*; public class Copy { public static void main(String[] args) throws IOException { File inputFile = new File("input.txt"); File outputFile = new File("output.txt"); FileReader in = new FileReader(inputFile); FileWriter out = new FileWriter(outputFile); int c; while ((c = in.read()) != -1) out.write(c); in.close(); out.close(); } } This program is very simple. It opens a FileReader on input.txt and opens a FileWriter on output.txt. The program reads characters from the reader as long as there's more input in the input file. When the input runs out, the program closes both the reader and the writer. Notice the code that the Copy program uses to create a FileReader: File inputFile = new File("input.txt"); FileReader in = new FileReader(inputFile); This code creates a File object that represents the named file on the native file system. File is a utility class provided by java.io. This program uses this object only to construct a FileReader on input.txt. However, it could use inputFile to get information about input.txt, such as its full pathname. After you've run the program, you should find an exact copy of input.txt in a file named output.txt in the same directory. Remember that FileReader and FileWriter read and write 16-bit characters. However, most native file systems are based on 8-bit bytes. These streams encode the characters as they operate according to the default character-encoding scheme. You can find out the default character-encoding by using System.getProperty ("file.encoding"). To specify an encoding other than the default, you should construct an OutputStreamWriter on a FileOutputStream and specify it. For the curious, here is another version of this program,  HYPERLINK "C:\InetJava Books\IO\The Java Tutorial - IO_files\essential\io\example\CopyBytes.java" \t "source" CopyBytes, which uses FileInputStream and FileOutputStream in place of FileReader and FileWriter : import java.io.*; public class CopyBytes { public static void main(String[] args) throws IOException { File inputFile = new File("input.txt"); File outputFile = new File("output.txt"); FileInputStream in = new FileInputStream(inputFile); FileOutputStream out = new FileOutputStream(outputFile); int c; while ((c = in.read()) != -1) out.write(c); in.close(); out.close(); } } How to Use LineNumberReader The LineNumberReader class is a subclass of BufferedReader. Its read() methods contain additional logic to count end-of-line characters and thereby maintain a line number. Since different platforms use different characters to represent the end of a line, LineNumberReader takes a flexible approach and recognizes "\n", "\r", or "\r\n" as the end of a line. Regardless of the end-of-line character it reads, LineNumberReader returns only "\n" from its read() methods. You can create a LineNumberReader by passing its constructor a Reader. The following example prints out all the lines of a file, with each line prefixed by its number. If you try this example, you'll see that the line numbers begin at 0 by default: try { FileReader fileIn = new FileReader("text.txt"); LineNumberReader in = new LineNumberReader(fileIn); while ((line=in.readLine()) != null) { System.out.println(in.getLineNumber() + ". " + line); } } catch (IOException ioe) { ioe.printStackTrace(); } The LineNumberReader class has two methods pertaining to line numbers. The getLineNumber() method returns the current line number. If you want to change the current line number of a LineNumberReader, use setLineNumber(). This method does not affect the stream position; it merely sets the value of the line number. How to Use PrintWriter The PrintWriter class is a subclass of Writer that provides a set of methods for printing string representations of every Java data type. A PrintWriter can be wrapped around an underlying Writer object or an underlying OutputStream object. In the case of wrapping an OutputStream, any characters written to the PrintWriter are converted to bytes using the default encoding scheme.[2] Additional constructors allow you to specify if the underlying stream should be flushed after every line-separator character is written. The PrintWriter class provides a print() and a println() method for every primitive Java data type. As their names imply, the println() methods do the same thing as their print() counterparts, but also append a line separator character. The following example demonstrates how to wrap a PrintWriter around an OutputStream: boolean b = true; char c = '%' double d = 8.31451 int i = 42; String s = "R = "; PrintWriter out = new PrintWriter(System.out, true); out.print(s); out.print(d); out.println(); out.println(b); out.println(c); out.println(i); This example produces the following output: R = 8.31451 true % 42 PrintWriter objects are often used to report errors. For this reason, the methods of this class do not throw exceptions. Instead, the methods catch any exceptions thrown by any downstream OutputStream or Writer objects and set an internal flag, so that the object can remember that a problem occurred. You can query the internal flag by calling the checkError() method. Although you can create a PrintWriter that flushes the underlying stream every time a line-separator character is written, this may not always be exactly what you want. Suppose that you are writing a program that has a character-based user interface, and that you want the program to output a prompt and then allow the user to input a response on the same line. In order to make this work with a PrintWriter, you need to get the PrintWriter to write the characters in its buffer without writing a line separator. You can do this by calling the flush() method. How to Use DataInputStream and DataOutputStream This page shows you how to use the java.io  HYPERLINK "http://java.sun.com/products/jdk/1.2/docs/api/java.io.DataInputStream.html" \t "apidoc" DataInputStream and  HYPERLINK "http://java.sun.com/products/jdk/1.2/docs/api/java.io.DataOutputStream.html" \t "apidoc" DataOutputStream classes. It features an example,  HYPERLINK "C:\InetJava Books\IO\The Java Tutorial - IO_files\essential\io\example\DataIOTest.java" \t "source" DataIOTest, that reads and writes tabular data (invoices for Java merchandise) : import java.io.*; public class DataIOTest { public static void main(String[] args) throws IOException { // write the data out DataOutputStream out = new DataOutputStream(new FileOutputStream("invoice1.txt")); double[] prices = { 19.99, 9.99, 15.99, 3.99, 4.99 }; int[] units = { 12, 8, 13, 29, 50 }; String[] descs = { "Java T-shirt", "Java Mug", "Duke Juggling Dolls", "Java Pin", "Java Key Chain" }; for (int i = 0; i < prices.length; i ++) { out.writeDouble(prices[i]); out.writeChar('\t'); out.writeInt(units[i]); out.writeChar('\t'); out.writeChars(descs[i]); out.writeChar('\n'); } out.close(); // read it in again DataInputStream in = new DataInputStream(new FileInputStream("invoice1.txt")); double price; int unit; String desc; double total = 0.0; try { while (true) { price = in.readDouble(); in.readChar(); // throws out the tab unit = in.readInt(); in.readChar(); // throws out the tab desc = in.readLine(); System.out.println("You've ordered " + unit + " units of " + desc + " at $" + price); total = total + unit * price; } } catch (EOFException e) { } System.out.println("For a TOTAL of: $" + total); in.close(); } } The tabular data is formatted in columns, where each column is separated from the next by tabs. The columns contain the sales price, the number of units ordered, and a description of the item, like this: 19.99 12 Java T-shirt 9.99 8 Java Mug DataOutputStream, like other filtered output streams, must be attached to some other OutputStream. In this case, it's attached to a FileOutputStream that's set up to write to a file named invoice1.txt. DataOutputStream dos = new DataOutputStream(new FileOutputStream("invoice1.txt")); Next, DataIOTest uses DataOutputStream's specialized writeXXX methods to write the invoice data (contained within arrays in the program) according to the type of data being written: for (int i = 0; i < prices.length; i ++) { dos.writeDouble(prices[i]); dos.writeChar('\t'); dos.writeInt(units[i]); dos.writeChar('\t'); dos.writeChars(descs[i]); dos.writeChar('\n'); } dos.close(); Note that this code snippet closes the output stream when it's finished. Next, DataIOTest opens a DataInputStream on the file just written: DataInputStream dis = new DataInputStream(new FileInputStream("invoice1.txt")); DataInputStream also must be attached to some other InputStream; in this case, a FileInputStream set up to read the file just written - invoice1.txt. DataIOTest then just reads the data back in using DataInputStream's specialized readXXX methods. try { while (true) { price = dis.readDouble(); dis.readChar(); // throws out the tab unit = dis.readInt(); dis.readChar(); // throws out the tab desc = dis.readLine(); System.out.println("You've ordered " + unit + " units of " + desc + " at $" + price); total = total + unit * price; } } catch (EOFException e) { } System.out.println("For a TOTAL of: $" + total); dis.close(); When all of the data has been read, DataIOTest displays a statement summarizing the order and the total amount owed, and closes the stream. Note the loop that DataIOTest uses to read the data from the DataInputStream. Normally, when reading you see loops like this: while ((input = dis.readLine()) != null) { . . . } The readLine method returns a value, null, that indicates that the end of the file has been reached. Many of the DataInputStream readXXX methods can't do this because any value that could be returned to indicate end-of-file may also be a legitimate value read from the stream. For example, suppose that you wanted to use -1 to indicate end-of-file? Well, you can't because -1 is a legitimate value that can be read from the input stream using readDouble, readInt, or one of the other read methods that reads numbers. So DataInputStream's readXXX methods throw an EOFException instead. When the EOFException occurs the while (true) terminates. When you run the DataIOTest program you should see the following output: You've ordered 12 units of Java T-shirt at $19.99 You've ordered 8 units of Java Mug at $9.99 You've ordered 13 units of Duke Juggling Dolls at $15.99 You've ordered 29 units of Java Pin at $3.99 You've ordered 50 units of Java Key Chain at $4.99 For a TOTAL of: $892.88 File Manipulation While streams are used to handle most types of I/O in Java, there are some nonstream-oriented classes in java.io that are provided for file manipulation. Namely, the File class represents a file on the local filesystem, while the RandomAccessFile class provides nonsequential access to data in a file. In addition, the FilenameFilter interface can be used to filter a list of filenames. File The File class represents a file on the local filesystem. You can use an instance of the File class to identify a file, obtain information about the file, and even change information about the file. The easiest way to create a File is to pass a filename to the File constructor, like this: new File("readme.txt") Although the methods that the File class provides for manipulating file information are relatively platform independent, filenames must follow the rules of the local filesystem. The File class does provide some information that can be helpful in interpreting filenames and path specifications. The variable separatorChar specifies the system-specific character used to separate the name of a directory from what follows. In a Windows environment, this is a backslash (\), while in a UNIX or Macintosh environment it is a forward slash (/). File separator can be obtained as System.getProperty('file.separator'), which is how the File class gets it. You can create a File object that refers to a file called readme.txt in a directory called myDir as follows: new File("myDir" + File.separatorChar + "readme.txt") The File class also provides some constructors that make this task easier. For example, there is a File constructor that takes two strings as arguments: the first string is the name of a directory and the second string is the name of a file. The following example does the exact same thing as the previous example: new File("myDir", "readme.txt") The File class has another constructor that allows you to specify the directory of a file using a File object instead of a String: File dir = new File("myDir"); File f = new File(dir, "readme.txt"); Sometimes a program needs to process a list of files that have been passed to it in a string. For example, such a list of files is passed to the Java environment by the CLASSPATH environment variable and can be accessed by the expression: System.getProperty("java.class.path") This list contains one or more filenames separated by separator characters. In a Windows or Macintosh environment, the separator character is a semicolon (;), while in a UNIX environment, the separator character is a colon (:). The system-specific separator character is specified by the pathSeparatorChar variable. Thus, to turn the value of CLASSPATH into a collection of File objects, we can write: StringTokenizer s; Vector v = new Vector(); s = new StringTokenizer(System.getProperty("java.class.path"), File.pathSeparator); while (s.hasMoreTokens()) v.addElement(new File(s.nextToken())); You can retrieve the pathname of the file represented by a File object with getPath(), the filename without any path information with getName(), and the directory name with getParent(). The File class also defines methods that return information about the actual file represented by a File object. Use exists() to check whether or not the file exists. isDirectory() and isFile() tell whether the file is a file or a directory. If the file is a directory, you can use list() to get an array of filenames for the files in that directory. The canRead() and canWrite() methods indicate whether or not a program is allowed to read from or write to a file. You can also retrieve the length of a file with length() and its last modified date with lastModified(). A few File methods allow you to change the information about a file. For example, you can rename a file with rename() and delete it with delete(). The mkdir() and mkdirs() methods provide a way to create directories within the filesystem. Many of these methods can throw a SecurityException if a program does not have permission to access the filesystem, or particular files within it. If a SecurityManager has been installed, the checkRead() and checkWrite() methods of the SecurityManager verify whether or not the program has permission to access the filesystem. FilenameFilter The purpose of the FilenameFilter interface is to provide a way for an object to decide which filenames should be included in a list of filenames. A class that implements the FilenameFilter interface must define a method called accept(). This method is passed a File object that identifies a directory and a String that names a file. The accept() method is expected to return true if the specified file should be included in the list, or false if the file should not be included. Here is an example of a simple FilenameFilter class that only allows files with a specified suffix to be in a list: import java.io.File; import java.io.FilenameFilter; public class SuffixFilter implements FilenameFilter { private String suffix; public SuffixFilter(String suffix) { this.suffix = "." + suffix; } public boolean accept(File dir, String name) { return name.endsWith(suffix); } } A FilenameFilter object can be passed as a parameter to the list() method of File to filter the list that it creates. You can also use a FilenameFilter to limit the choices shown in a FileDialog. RandomAccessFile The RandomAccessFile class provides a way to read from and write to a file in a nonsequential manner. The RandomAccessFile class has two constructors that both take two arguments. The first argument specifies the file to open, either as a String or a File object. The second argument is a String that must be either "r" or "rw". If the second argument is "r", the file is opened for reading only. If the argument is "rw", however, the file is opened for both reading and writing. The close() method closes the file. Both constructors and all the methods of the RandomAccessFile class can throw an IOException if they encounter an error. The RandomAccessFile class defines three different read() methods for reading bytes from a file. The RandomAccessFile class also implements the DataInput interface, so it provides additional methods for reading from a file. Most of these additional methods are related to reading Java primitive types in a machine-independent way. Multibyte quantities are read assuming the most significant byte is first and the least significant byte is last. All of these methods handle an attempt to read past the end of file by throwing an EOFException. The RandomAccessFile class also defines three different write() methods for writing bytes of output. The RandomAccessFile class also implements the DataOutput interface, so it provides additional methods for writing to a file. Most of these additional methods are related to writing Java primitive types in a machine-independent way. Again, multibyte quantities are written with the most significant byte first and the least significant byte last. The RandomAccessFile class would not live up to its name if it did not provide a way to access a file in a nonsequential manner. The getFilePointer() method returns the current position in the file, while the seek() method provides a way to set the position. Finally, the length() method returns the length of the file in bytes. &Vr89YZE F J K ! " # $ : ; ʺկկեե՗ʇ|nj'UmHnHujUmHnHu0J>*B* ^JmHnHphujUmHnHuCJaJmHnHu0J5\mHnHuj8 UmHnHu jUjUmHnHu mHnHuCJ$aJ$mHnHuCJ aJ mHnHuCJ OJQJ^JaJ mHnHu)&Vs8Y $$Ifa$$[$\$a$$[$\$a$$a$ ]^ $x[$\$a$ 4h  4 E F % : 0 `{{$[$\$a$$[$\$a$ $$Ifa$k$$If0iB ? 064ax * + , - . [ a f l *+,-ŻŻŻŻŻŻŻŻŻŭŐŻŻjQB* UmHnHphujPUmHnHujz@B* UmHnHphuj?UmHnHu0J^JmHnHu mHnHujUmHnHuj(B* UmHnHphuB* mHnHphujB* UmHnHphu20 I [ }{xv?J`.7$8$H$$[$\$a$$[$\$a$[$\$$xa$$a$ $dd[$\$a$ ' %+;FKWtuvwxy(9>P?BJMSW`cimvy  "%.9CJOJQJ^JaJmHnHu(B*CJOJQJ^JaJmHnHphujuUmHnHuj`UmHnHujUmHnHu0J^JmHnHu mHnHuB9?DO:=DGKNUYbelpy|  " !ﱿjeUmHnHu0J>*B* ^JmHnHphujUUmHnHujUmHnHuCJOJQJ^JaJmHnHu(B*CJOJQJ^JaJmHnHphu mHnHu0J^JmHnHu:.:Kb"#=V E n !! $dd[$\$a$$a$$a$7$8$H$$a$$[$\$a$  rstLMNRSab_`aeft~ߵߧߙ0J^JmHnHu0J>*B* ^JmHnHphujǏUmHnHujUmHnHujUmHnHujUmHnHujuUmHnHu mHnHu0J>*B* ^JmHnHphujUmHnHu-      W Z ` k ! !!!&!(!5!6!C!F!Z!\!n!q!!!!!!!!!!""""""""###/#D#H#猪猪0J^JmHnHu mHnHu(B* CJOJQJ^JaJmHnHphu(B* CJOJQJ^JaJmHnHphu(B*CJOJQJ^JaJmHnHphuCJOJQJ^JaJmHnHu?!!8!Q!R!f!{!!!!""""#/#0#b$c$$$&''''$a$$a$ $[$\$a$$a$7$8$H$H########$$!$;$D$$$$$$$$%&+&t&&&&&&X'Y'Z'c'd'q''''''''''''''''''(C(F(L(ܾ(B*CJOJQJ^JaJmHnHphuCJOJQJ^JaJmHnHu0J>*B* ^JmHnHphujUmHnHujUmHnHu0JmHnHu0J^JmHnHu mHnHu7'*(Z(((( )))A)Z)[)o)))))|+v,|,,,-=-?-[-7$8$H$^` 7$8$H$`$a$7$8$H$L(W(t(w(}(((((((((())#)()/)1)>)?)L)O)c)e)w)z))))))))********?+O+]+a+k+q+++++g,h,v,y,,,,,,,,۱۫0J^JmHnHu mHnHu(B* CJOJQJ^JaJmHnHphu(B*CJOJQJ^JaJmHnHphuCJOJQJ^JaJmHnHu(B* CJOJQJ^JaJmHnHphu?,,,,,,,-----/-3-A-F-t-x----*.:.@.O.....S/^//////// 000001 1O1X1|1111222!2%2'2+20242:2?2G2J2ۡ(B* CJOJQJ^JaJmHnHphu0J^JmHnHu mHnHu(B* CJOJQJ^JaJmHnHphuCJOJQJ^JaJmHnHu(B*CJOJQJ^JaJmHnHphu?[-r-t-..012'242G2S2f22222222$a$$ 2( Px 4 #\'*.25@9a$7$8$H$ 7$8$H$`J2O2Q2^2d2r2u2x2{22222222222222222293D3344 4444486C6Y6d666178797:7777猪}jUmHnHujUmHnHu0J^JmHnHu0J^JmHnHu mHnHu(B*CJOJQJ^JaJmHnHphu(B* CJOJQJ^JaJmHnHphu(B* CJOJQJ^JaJmHnHphuCJOJQJ^JaJmHnHu02#3/34363934679'9(9B99999997$8$H$^`7$8$H$ $dd[$\$a$$ 2( Px 4 #\'*.25@9a$ 2( Px 4 #\'*.25@977777888-8.8P8Q8888889(9.9/949F9L9M9S9T9X99999999999: ::ޢxx(B* CJOJQJ^JaJmHnHphu(B*CJOJQJ^JaJmHnHphuCJOJQJ^JaJmHnHu0J>*B* ^JmHnHphujޓUmHnHuj’UmHnHu mHnHujUmHnHu0J>*B* ^JmHnHphu(:: :$:&:+:-:1:3:7:C:F:S:U:W:X:Z:\:^:`:b:d:::::::::::::::;;*;-;R;U;`;d;s;v;;;;;;;;;;;<<</<G<I<L<O<`<d<w<<<<<۱۱۱۱۱۱۱۱۱۱(B* CJOJQJ^JaJmHnHphu(B*CJOJQJ^JaJmHnHphuCJOJQJ^JaJmHnHu(B* CJOJQJ^JaJmHnHphuF9;:h:::::;F;g;;;;;;<</<d<<<<<<<<< =6=q=7$8$H$<<<<<<<<<== =%='=F=H=[=q=========>>>+>5>A>R>Y>>>>>>>??"?@0@u@@@@@@@AAAA-A;A?AFAPAVAfAuA۱۱۱۱۱۱۫۱۫0J^JmHnHu mHnHu(B* CJOJQJ^JaJmHnHphu(B* CJOJQJ^JaJmHnHphuCJOJQJ^JaJmHnHu(B*CJOJQJ^JaJmHnHphu?q====D>d>>>>>?? ?"?? @@ @@@?A@AAA#BCB\B$a$ $dd[$\$a$7$8$H$uAzA}AAAABBBUBYBBBBBB(C2C;CJCgC}CCCCCCCCCC DD@DLDNDXDDDDDDDDDDDDD E8ENElEoExEEEEEEE­˜˜˜˜˜˜˜˜˜(B* CJOJQJ^JaJmHnHphu(B* CJOJQJ^JaJmHnHphuCJOJQJ^JaJmHnHu(B*CJOJQJ^JaJmHnHphu mHnHu0JmHnHu0J^JmHnHu<\BxBBBBBBB"CfCgCCCDDDDD E"ENEeEE7$8$H$^` 7$8$H$`$a$[$\$7$8$H$EEEEEEE.F;F`L`m`w````azaaaaaaaaaaaa+b/bobvbbbbb ccl Óg sMeT]E|6s3'd0`p/$f-k=ɟ?O'%W^Z؆D㿗:0wr\:`fb2)hYc$ȿcw\.ĖR"XB 1Gw2[ "1&>:h/VXKDdU 8GʳLBzҝ5Ia%JU}ndݱ VTVq`='lӶdB"^3q|m@lWu78,aJ{ T[2rC@#&:85\y̦wMl\3>iÎM_AP'+Y\ֿl]}&C#h}[ڔ9}v{UYh 5hqC7A>UN=W$c/!ĠQMZ[*Oq5bͳL<DžG3|;ۣxSr*V"`T.<cq,6 JMF7hp'mN}Ǻr+!6crH} Alxd@[0*ȪN⥕ڃ] ^I?g,>6I)qcIZ`C "3D|-W?dN7zx@a#ݓf^O$ŕTw$ƒFme&?o\^AYK /ptoy۲F e+T4Y|w֛֬ T|L6N؈-y:mv _kp.,|gKqrH_o[x*o( EJv=[oX[=,vJiNL:-mEφG~X9t e &rrg36ڥ>z[Y̲JXu zO3c?Ro wNlFqY6q/Ē!喠M>rJs|>bY~8WY ګ[֜XEl-.=uhqXUp2Zi;S imJ)j pVIK)kD+N<6w (k?Ӓ1Wjsbzn?:.7Ī k3A{q#:stGȂ]{V5t˛4Еl7OU<}s➢ poɃPte0jC=E1$?}{'Y۪'if/ RL~-RDHFBS$S&$k)9{+upcSXqz/J=oV2ZŒ% jm]D꾩GA)mUchdkm ϱH  Nt}/֝[&<xe%]GaEWiТkAde8Vlac6<$i+7ҡG`x}PSTMPt7:dGz5h2i2jq[m"8z; > S&5+OGe2Jt_IO͒xj7ȗb]r%\r%\rߖ\>LIENDB`\ Dd#c  s A? C:\InetJava Books\IO\The Java Tutorial - IO_files\figures\essential\20stream2.gif"bԲt5P_Ȧdž| <nԲt5P_ȦdžPNG  IHDRmo֤ PLTEq7bKGDH cmPPJCmp0712OmSIDAThk#GK6}a9tpid۳xn'aR$dY4xaAWcrڋ 5]8([R~lIER}}իWՌmmk[Zڊ=aaNx{unab ōÂȼ bqA^0 V$eC(sW00'< ƕ<$msB fxam;C'dwɋ Օ]9nJm|1=i`y p`ָ.[ޜIتJ4vi}MètB7L}hҗ &ÛA;C_AXbepZђ!w;&lY'J@lkPW&hl^)A[O%_(HNF"ˁ7 P ?MG)ipfU;D6Un,LZXf=PvG&3F&#,  S\Kq"vyK)Owa m'<<~=iRy۪FʒȁG=Qxx$^ RďRv)JI Č S& ͛᳐=1٘5 j[}E\EZH}!}zbxT>rd^r̉Y +FR3cҔ @1i[|e6dIGlA_ >WxC+al:f\YXoƐ|oG3/>+ٴ2Ŷie]ܮm̗6jW#cr6@͵Q6ޛNedM+\iͱ} H[)K𫾬I[q PQJ#œbIXWUÆ#-S daӝ[$uv?b9` , n'eۣO3zҸy:\ҳ\[8f0,O;|ֺA,AU,ۼ}>3=ү`[ňḷnD"![l wu͢9ğߟջe`kѥ2 6t0f].X.85=hܽ[ru@2|d E =bEQ3/61:rSyѯd`=3cHqZ-CGe~oie3H|3S @ L.3|G(ɫN0.ou))Y- fݸt>vkoBNK;d˺q%e4`PVMIs4VY$Og:-6Zec,{SKO.l Ըg`+,]@360댙]D> mK1Wj1sj2sG4L2T%{c6QWqUi{@\Q择xUiCTe|3+m}<|KQNe,)fZ;)vWI rlxy)Nm׭a}%\r6[Wm$G%۳I۸[2*;p4u\-ĩQ5sF .REyyJw\CjWPF٧B7* K7ס̮J/eOKL}@]׋L]b{-+ t `eM+ɖ=X2+%o٣!R*zi̗HZ/UlS@3iuT9a,zX}c@^D K_qqm:}}od\ç|~dvqqg ˆ~[z6ތ8:!>6ף{pᵇ#o(#2G w+?fbT֜2_c{ϸ8*φ?#+Kt[@?~~H#z #NC}98ܛZ}zg;K3|ۄ?v?ǀ!6jdz PofΨLzܱQ\xiMQ\tA֞i ,D. Nv[;ƦIA0 bߤҸf2pN&i춻X6wJMF3y@lc8d*7Ma/ͧX%tPYAܯuaËC{3D'Ꮽ;A\1:}*Љ{+2&u~'TSmC^e*\ӏ^&SiO^3shs>NzH<){yO:1OhMDʄ#ogX'XBGhd^DcT칧(thJL cqRW!6jøNdQlm,Mdb\V1enތ1)*'0\f&y2v0G9.Nlv]ر`)屃3ЄZ$0 1SWgǕ YhS} s!&ekouGj0?,"v(R.nbQ= EvS#FR([tR}ha~:asShkA񔕏OH-f3҉}1"]։8lȍg~"?*u *eQ$mP2F%J<_'zP<;v("=gžP*5 BЖ=f]/ WX#WtN؋IEYT&L4\uѨBo^E;mY1%{҉OQ_#vJm?'HCݣlx[1]*@p\u|<< ;oBppPWx!)9E!:j,b yr ADs0aBjkc;X'{rv]i~Bao)Bk?\a{ǝ<<cbB ¾oc ~@L⎃T'MQ=. wzlߣBnV62/Ȑ[on,@[4q)3q~&w^EQԢ7,nQmդw$[Z)c ciT~Qqmbs~ܓ`<{0Խ&Vޥ@ 5ScfZe A+41ۙhhf23GC!z=A'6\n]C5;;q'RD\573p^VCXԢ8OMmv)a3y@)Z0'mT(,xs(Z5O gcY)p*%OO`ih 1c˴ьmpfsE3sΉa~܁?PCZԺN$9U))CWepN$#*XJi U1l-?m0PdV* 0]*1||-mkj"FPq؟$BߦiB֢~9bVqy҉NZ[58t^8D;;۽ӭP<2@~|M|pv*?7E&['H*S?E}$KΟu҉[]O]N']{ĥ/n_2E'5'^AX ߌعYJi6:lRjί# |ˆI t(A'\U+3Tw6&RgU2ak\X`)R +ۤ!r6f%|9"_geP%r^`)|9U'(A?+FBNUhV,Voglb>^ʴ|DbO4QġgAKEH9!;)t羫s avL@d9&y')"V2v@Vj&" St':&SYQ Vj/,"&& krԉ@qL`~bTĢۿ ďĢfB0:E5|YwIuoǏ`A,zEB?U,e&.Nd Ɖ kR uR*$obk&XJE*Ld^ou&io|"Ba~7a{ RX"x2a/vAH2|~x8u;D&sl| 'qu2C$ɯ >uaWF֢J>T\-_~Z_Q|IENDB`DyK _topFMInetJava BooksIOThe Java Tutorial - IO_filesfiguresessential22charstream.gifDdm   s A? C:\InetJava Books\IO\The Java Tutorial - IO_files\figures\essential\22charstream.gif"bO`pw2霴d++)<n#`pw2霴dPNG  IHDRӑF0PLTE{{{%rbKGDH cmPPJCmp0712OmxIDATx]rHm,"B[J5N }j`*~ [P73=?- +5D>`zWzWzWzWzzUj;7B Ǜ9`9ߍCDpW0"Qln[oǛiuDWoF6Of~7XOK$?ԾS4t7`ߍV]D׬ wzћ:+0n\I',Hl| jwEF6`qCFycXawP/NA;Of~7qV% QZ9)R|ssQZZNoK_+YWzm xW ѷ/^,ui M~Bb6-69V3i^h&`ʹЖ |:\ޛ&>c U|D^rM- lK,2k[% `\t\`Y)ƅ&ĪYċ8 adJk|yRY9Xn`g/ 3L&o`.Lx_w9!䲸3xa+?X!=X'nhXUJ69ʭvͿX5{{*Yv-;c+G4<<&bTw|18190<{v29{r TYam2G"R XDb<{b@`a/YkItV[5tY I=hp&&lډl3 Cܨu!Ql}3Jχ``YK!AsmB`Y6fIE3{$Oe svSݧiN ?YECoX8[ b4 i XlJ!NO:XUcQ2o*Jbl-Φ< RZ*7g=qV:3(_: =$ ۪\2OYKg{ƲAuXvqS9' [c76CR 4u-wYCyX=ߙ.6i8Qí rt- x: ?6qE *<:ǫdF:waL.N:א7p4ӳ}}rbP*G˺-z[ŖNt=ddA#te&;vڍcP( R0Kf8.:b 9|tZkfrG:: c,7 9h{c@u`WFw% v{VFS\5aAߘdNE 46ǒГ@;ZQJ+p\ށ&UC`}7 vH [۩adYoLc wA, Qt֚Zr3Ũ/$:B:{MrLuZCƛr,?LjTG :z~.zuFZK!r' r+.>Q@!ކ.*ˈor8G*觀(/"n!|pp5ސufliXq%Jl X#vZ.  N0`x!qt7VJgr#^* SF9V2}>bGxo"Y#ikc5zsmd$eA,|acEE^8nàbYܸr]WTwvMߡIՑt#,w{`&RyXܕG;&[N Z8(Emsz^<mo݈Y3>4<+qceXs^ "WENF;~ǥ>3(@.vīBn1,TAAi즺 *wָCA QQ֌-ٺ [8 H.ʜI[ADɲ:; v*7hjIcB &o:`:(F8a`TDi!PXclJp4*JsK \$, +vr <dEq'ŻĽ<r|{L}?؆8;YkvyeAu 4 F[+; I p*#p2.Dȣ^z Tp)Ϯ2 YhwK+4aM*{bTl$edgzj;b@;>Z2U}l圼L#U%#e̾FY``Tō9ZP[Avy E,!P*((ƢZJKf(3V{ϭ9ni.9*%8]fMut67ej;<8 ,uGTt*8k}yb 4L  WY҇#JJg,wyKo >ħ>墨b߭!)s糁v%?$VScZxjWqT*TNxnb^hu[?L)c=8c Z|~zN!j?GM@G+) ש012ۂmt5hN{@` f~~^&o?h=ͶR`4*N:> }%xļ2g$]꟱ig*!lz5v7#Mz QazEk8Zamp-~u\<^ n@mRHbY1ض⺡:px\8|E= :\a|ph}(ܠ^/fd0X[gQ1dfΒ;2S DyA qK_q]҃hjcwLg&c/CfMfVg>K\S:D`Y{,{)Vx1/a;֭kxR"zPv%9EIC~7&gl36y8 ܆^gŘ JƍO8Tq8UV E{ ]s^z,&?yJ9ۋ1&|]Z݇k<Ep޾\UC}̀2%LC>"L$|}HLC$FS v:pY#^7]N\;$]?^^ĺ5292No1㴿Oq 2B)5o*/y"`}\"cx\iFZ=ɾSODTLYPBq~$"2Uz>(N8>UEYy'F;>d`'Lhu f҈ gZ` W*pFWG^NHD%$*K8|B_+-LJ)mj},i3iN}$іd&5)w}}}njNϚ$!}!H}DX0SE2Ѭ_-98\sF!X1Qdx$19ɗ`+GB^ጝk8W63\y9_#L ֎c7/ӎ^v9,g A>:8 vnua@VzpiLJdM;$>ā0(BEb:-?@D) YiWI~=W8 e+is~k$8!Yֺ |߱|pZkIͲ5N^RKj|tVPOPӎ;B<,եMgͶfl E#PhXٚiӨ-WZk4(*y5X٬4@;INa vV홶V ?Z[zUZ-+ikqKiJY[Цh[ 9`kJYldS,~6uusͷʶ$*+QôhϒS>`mX߶pʋMaØ{47 8ib߭j~}k)s$'m Tb{IV5x۟i]*hsxnbAENxkT02tk1ΛQ~6Hz3o¥Xb*-gV$J1Zdzk:ӧF8Z "."$/5=}ۚktWz(T}跅oy5ez_ʩUzʷ$ YRfn+`l!0&)o[cMpS=sf"_9⌲<>3!߶䌲4vXFc?-5ӿĹK8}aJ{I R{wĖg紝 )VKٛIv ZjPR\ cy=3ʎFU39ud:c&ĸ0vYGޖ~3(/ZOJ-'~:|0C9thiPC%tьۈZq2ۮQyu38mٔf̦pM߯cȩJ{(儷@/[Uwc63fcq>-]p0bU (Ο%p㜙MO9qg>kY>o0(7GƦUuVu;FQ)L1éݐbSqgUcP6rMuh: 'k,R@`+H!I)$;qR+\TxV-P1Ƭ2\fBܹ>Բ7Ek {جX|q':-eoΤT, ]ݙ8t4YVܖ#WGb}aj zKalܖZkқ>gߪN;ki?O'IGBw-mO&Ir0'srbmngv,Oy-n;-i#ɧDd19JH&^b%m8wMfWo&Kbz:e'ćf[ 7 sJLoqWf~K?ҟy:\0!g4 L(AGpoS/wm} s3zopemZ'HfgOw9UsM޵8mqFThn?NoO/Sܠg37?s,@Gܛ`l8!9>-/1_zΙؼ'v'XVD(y^]iMh)7Vw7ɤc>' 4Mv,ޛ< ӜUxo`>Њs/M rBZw=~Y9㫳;vItI{\Wœ {{OVb!rx\k|] uW-:_pώŝq/g$diD){)H /x I<^vG(\rH@_M(w:m3aSF)|S@8 /{|H<圀3dɿ9clЭ>8}s*G¯`o(‚\vonup03d:.; 1ӂ&W' T1p^* VЭU%z$4~{W@g'cɸn\*EL}8hnDsI9mO2Վ/$^TgF9}4)8LީVy߸v.t758gik ,H| #}kOjaݯ 0*=sܛe{ܟ|pZ# uJ2^UK _wM`7ǑsyRl>Hm}KǑVanURȷ{f}VAlf @niQfsT)vcUe3-9APc`ldQGLw V>gt4Nͣt`@=mM5?PRj|a|=Ȱl5>Ee]?7ȭLj#Ja+G 2,۠:mkV',T?[[c3$e8F)TjG3+-^s}JVfR{AfskVXjoߎq"KSrTbKOQ+NH=yB\0܋U6_ ZRՀFÎj%*j| -#1Dښf 4|0< Xy!o4KfJ]7 ݵ Pgq}r_IENDB`DyK _topFIInetJava BooksIOThe Java Tutorial - IO_filesfiguresessential24writer.gif'Dd   s A? C:\InetJava Books\IO\The Java Tutorial - IO_files\figures\essential\24writer.gif"b 124}<`9z0E@ R<n 124}<`9z0E@PNG  IHDR}Z0PLTE{{{(9YbKGDH cmPPJCmp0712Om IDATxArg"N0dvSe*89tʻl8rO-  HNG%$o^M&Q YdY}5aoej]a1gΔ3p.N޵p'j cwv8%N$8U1\S<3c:6+Kg+X*DݪG;7SƱD#B='W)l ͂.[S˽o93՜SmM9ƚsjcNqhbPwG&ο.t2dL49]l%7ywƩoL}sY8^&r:ǧq&[8M|c9#ϗ$ 0\./Irؕ i?8u!ASn9yHH'|C-s~j\dtMjI#2:ǻ&@ؗ [N7'ՋʩJSekF˃o^Ow+6i7.BZ1I]8@*1j5 N>'L&FP(W&S'K}S9e9q(j+7Ə^[MeDq$ -)Q%AuO FK@o96,JI\& &ؔjrku` :g-oy}cY87 qOTPQBď[f 3X6Γ^P~04s(4U#%S|-&YtTPuh0;-G.a ?SO~p7!@>w k{e.+EX O/}pjkꭿKH+|cY9|ͳ`+apɎYuʹIˋ7gͭ+]2,%Q7g.syMF_qs8}3}gq^ӽ[׌Al:Pm䨧iԻzowh]xuRocNA||.gFĤ0;lfx/brk״s1\gi( 2!rD{\/m'ikuLb9rqIuz*GHC@\%ͷ:k͜{FլT1ZnFN9-82$u&q:\?Tpv>ڜlDV}FÒ-A7 +SSLOgHj1?|f_3>^9F&NҩrߑBOFNx:J< bWR ƦK;48]7E;q:/8t9f9n67@۾=MG+ǝrQ+JXj䟣c9a2N'E:Qw0;gSgdz4|gy m8G~gh,}f)Mp^տ\ÿ^W|ICLWL!q:JZt,'ԃo%(^ulrnuktO ƉXݸXtxj-S?hٜ褍Kj2ވXmɁK/8{4)>6^y7.磓sB^#T^3 ̛0 6`"!Ij;gT#ˤ!ycB-qVq֔u$hM?XҲ߾sv$aҙD2I&.Ѐ_F4x ŧѭt*u㎹+F?LyγPSԠq2pceJq*\?T =ҲJV Yl/K1FS&UQ^)RcvSIYf(;Ҭ|Ud_IAgEfap۠pEixxMF,$i>7UBtNH1+.|.|O.ߜKtg߅N7@k׼NrtX 6{> ,i.dx`ZnlMGP2rnw%˜g:+Ozg%UIWr{k /5?8Wr{k`u;ZT[& 0ι[ WNn˹O&s/(/6!%lC _FX)ZO^>R]s_(IQ9%h=$&O DSj]"G^ht>o !N^7NJc[:>Tɴ$,ϩT$ 29nO&J* >׹R.ZYY0*\9E[ JEYc\4; Jl6eMuz@u.dY$ % q+snN,WVL D*aSir: k8V}$3.uVZ̩[;xJ&nETrA5Aw$(l{F={6"v{a{VR|ڔVʯU*YfX` z.2ÚI/=ڼGL֝ɔw$!?{S)홬̳jgH8djoa +̤tT΃|.Y_F*5] .~*aO'eHFPtQjTtPNwYj7z:Ke4(&%}ևn<8ZsvA of's]9lzk%YQ]E3::z,l%X,m[G.O/A)oǗx!CMK׃J$WhyIsuwq4񱴭u2 Dsvi/}?SbLm^*hجn=k^ 8OvtPmxu`u)2O֤I sBG06A:8z,n=rJ5r.4}vխ^CjkةKNz0œ:\'t򲱷c o~Mw)n= Zg.|_1oѣ)U5)q)NG/.{-*sFǴ8ŽOw1(`ȉvӠtWQ-v0'CS^"~3lsb\#܌;wAq̠kq|66f#R$gri]C9š=̨5Cz-.uUBIpQuq[6!&ě)ϥJ C)٠@VɶO:,ŴGnbDo w w[q0S8ΑF `P ,vV_1&Iucy|'t꾫AT,eeJ{K,hvzFR;MLT(]g,R8-v,q+a2`0 /:MLN ,k(IiNWptD qP'IU iJvFǴA0csJܳcx>rNugn׌ftkYdtyö>R/ِ_?4YS(Ls9ܶ>1۵w/˓}*b~Qx.]&YǭO/yyy~ e;Zk有UٴduaF`Ҽ谙^%NK%\>J+q4{PP҃.gkej\dF'L~愉&NG)vumpR>֦\h;F;-uXmJj h)L|55v=o@GZHR[#UNiĕ߉2:5)V'YijiJ=%Iꐼv1vJ \)djfi>Dv-@Ʊm1TgP845/^k̰KLYvml~_Jj='7mҔG[@tDL{PᠵJ4aG*8P>fpzKӵ) 9RU6< qFfacƚx~’!FN-z^%+%.Z(H/pqz!"*xW rBX^I0EgsQ" jI' eʏNE *Rg0F@9ת5MRpU@lr{ kPf,*ҔX!c-::^)/O3ܯ",R? UA "cu)B%$eQ%w qs3سe5j)Ȧ]E5R}4w˽]}y*,:}m$~,PVCc&]\kU YZ2x|?в3KV_A+jƑj4a2_}Ћ.{^O!:*ꑦR3ϬϕsG:)Ӷֽ%nl-ޯ- a#A@$<  b}gA~`ȠIx~$OT[f'-ѹu$< k R S8Bܠ쟄)7KsuvP27f\CEpCe#FMMJji1n){w 6MٶN9}uO'r\E~ېp|Np{rΘ&mWX xI8Yc:^&⁕iVdKa\>[b-˳mQ,Q8$Ꙃdn\k>k[GPsMZ{ ,YΣⵖquKQ|s޶nbn4˯dػ܌Jc'|/706YS,Q8|t%!:˫a29Y^ej2}>^n&\KU4ݹ ,I[XFWPy1Lf9K,5TqKGwGE\g%~@x:&Y2(a#2Kfy%Iw 4L \c Xʏͳ1KVfL7qkbr̵GLV6X>Yf9'KS1Vlc,` Rd,2YE)OԖY:;㠴ӞN2יmXf,$?UMz1yI%u")m'@UMZFV}VîZv}t̲gJ% h ]Dn\Xya i~4sx<¶=eCvf$@K;>YPHPV65 # MXa^[$b;ˌq"@湠(Ai ֚+'d?lVŒQP1eP G|ft^ r5-.5JZ듺=/cT [3(ZӂXm6kY2V,׻w"zx)Sj/Xf9fk"}g{gf9;>g5#/4~jEں}ö.G,'g_6Mb^g^g^g^g^ ar1\>Vt_ҸQg7 {h[:'vY,K;TT&[{,q,Y3-c}yC:;f87)T_)s6_&fI}?C_qtN0l).0'lveq{\2ePn{@[PL̲LfYᤢ1܋|YbUu79>`i$?̤y|f9ˤ\T hun*lq5q9$ \euc5>`sn* ~`ik"&\w .*EE16ˠ0\YKJđXeJݤRp#f7~RL}z,29Cnć΍U5$ |%3n㜙 e,k6+ (sFFM*u&5:YFܜe?eٍ K:"wBByLkF<̒,` U|ZNr,IvwfyPѴs{>͋ifIl# Xh#;d);G|h0uQk/,2&|Oiv2+Yu՗iu#^X5G7@ML-,魢tK܂N!ӝ$7v8?EXf7-CKӏ*7IYC(1IesT_li4 ] 65aH\Nc<~ f9-h<B [M1_ՔoP0gben7B6Y_g҈s1KfX|Bu]5PXb,,a<,qt0%eBXڠ5WҊ r'!vzN@#{e䮂+rk/oRj#~|.$0fy}%Wb #zb[4,sGX)% ]߬Ca8]v1u?~t%So%w%?WcfG R [n .Hhbq a}\.Y1>R +=@ ̯ۖ8}!-pZ^!uӒ-~?&\~.`ڱéR:zDɢ wcMsa5As,gdyfEwD $N/OͱfǦ{v~|dY"dr0uv;ф{V%̲SO+(һdon,;7*DɜwKvgbn&h;עdӲ5%+ShstWdavcAHدh?Uq5Jf93eN~wa`^ .I2Y*}C{KMGi3A^z[o +f97Uz)kteY1yk1 W,x,XG,Gr1y,GrQ[k԰FGcGi],QQo4{FGt܈6 'f9`sԬ,̌[h}`ManYΣ"K>Vy P~6 sKrAa:蚞K<ͼOI#ɲ~Pf%f9XXq\(I=;V ebH.R&ƆUc x?%:X^?ʭ,$"~!:gyPz{YΣ*4i =!bd,Q[ #ar.cfYN[~ &w_5zyc1yT'2;dk\rܿ{pG[j3Y/f9*/݂zWr"ۄA,YN&0VȨ^W)f9|hϬp}{,gR&"sD1vzU=ǐ1A'HnU1~zbYN$zCt0q1˙4RG{FyX̒uxyt/೨TIENDB`DyK apidocyK http://java.sun.com/products/jdk/1.2/docs/api/java.io.FileReader.htmlDyK apidocyK http://java.sun.com/products/jdk/1.2/docs/api/java.io.FileWriter.htmlDyK apidocyK http://java.sun.com/products/jdk/1.2/docs/api/java.io.FileInputStream.htmlDyK apidocyK http://java.sun.com/products/jdk/1.2/docs/api/java.io.FileOutputStream.htmlDyK apidocyK http://java.sun.com/products/jdk/1.2/docs/api/java.io.File.htmlDyK apidocyK http://java.sun.com/products/jdk/1.2/docs/api/java.io.FileDescriptor.htmlDyK sourceFNInetJava BooksIOThe Java Tutorial - IO_filesessentialioexample-1dot1Copy.javaDyK sourceFMInetJava BooksIOThe Java Tutorial - IO_filesessentialioexampleCopyBytes.javaDyK apidocyK http://java.sun.com/products/jdk/1.2/docs/api/java.io.DataInputStream.htmlDyK apidocyK http://java.sun.com/products/jdk/1.2/docs/api/java.io.DataOutputStream.htmlDyK sourceFNInetJava BooksIOThe Java Tutorial - IO_filesessentialioexampleDataIOTest.java i8@8 NormalCJ_HaJmH sH tH X@X Heading 1&$dd@&[$\$]^5CJ"\aJ"F@"F Heading 2dd@&[$\$5CJ$\aJ$F@2F Heading 3dd@&[$\$5CJ\aJ<A@< Default Paragraph Font:B@: Body Text$dd[$\$a$&X@& Emphasis6]Bg@B HTML TypewriterCJOJPJQJaJ4O"4 paradd[$\$ B*ph:^@2: Normal (Web)dd[$\$"W@A" Strong5\e@R HTML Preformatted7 2( Px 4 #\'*.25@9CJOJQJ^JaJ6b@a6 HTML CodeCJOJPJQJaJ.U@q. Hyperlink >*B* ph4d&Vs8Y4EF%:{xv?J`.:Kb"#=VEn8QRf{/0b c "####*$Z$$$$ %%%A%Z%[%o%%%%%|'v(|((()=)?)[)r)t)**,-.'.4.G.S.f........#///4/6/9/0235'5(5B5555555;6h666667F7g77777788/8d888888888 969q9999D:d:::::;; ;";; << <<<?=@===#>C>\>x>>>>>>>"?f?g???@@@@@ A"ANAeAAAAAAAA.B;B?ACDFHIKMPRSU0 .!'[-29q=\BEKVf4h68:=@BEGJLNOQTV4h78YJ!#:* , - + ,   tvx  sMRa`e"Y#c#933334-4P4444dCCXCXCXCXCCCXXXXXXXXXXX8@0(  B S  ?4d6d3d6d Star Gruhtar<C:\NAKOV\PROJECTS\InetJava\lectures\InetJava-1.2-Java-IO.doc Star GruhtarJC:\NAKOV\PROJECTS\InetJava\lectures\part1_sockets\InetJava-1.2-Java-IO.doc Star GruhtarJC:\NAKOV\PROJECTS\InetJava\lectures\part1_sockets\InetJava-1.2-Java-IO.doc7)Om^`CJOJQJ^JaJo(^`CJOJQJ^JaJo(opp^p`CJOJQJ^JaJo(@ @ ^@ `CJOJQJ^JaJo(^`CJOJQJ^JaJo(^`CJOJQJ^JaJo(^`CJOJQJ^JaJo(^`CJOJQJ^JaJo(PP^P`CJOJQJ^JaJo(7)TY jkoD|$&ˎEF6d@4dP@UnknownGz Times New Roman5Symbol3& z Arial?5 z Courier New;Wingdings"habFbF~R*!7790ve2%Internet Programming with Java Course Star Gruhtar Star GruhtarOh+'0 0< X d p|&Internet Programming with Java Courset nte Star Gruhtarramtartar Normal.dotr Star Gruhtarram4arMicrosoft Word 9.0g@@>Ff@~R՜.+,D՜.+,X hp   Magic Team*ve &Internet Programming with Java Course Title 8@ _PID_HLINKSA"_BNInetJava BooksIOThe Java Tutorial - IO_filesessentialioexampleDataIOTest.javal>?Lhttp://java.sun.com/products/jdk/1.2/docs/api/java.io.DataOutputStream.html,{<Khttp://java.sun.com/products/jdk/1.2/docs/api/java.io.DataInputStream.htmly9MInetJava BooksIOThe Java Tutorial - IO_filesessentialioexampleCopyBytes.javarX6NInetJava BooksIOThe Java Tutorial - IO_filesessentialioexample-1dot1Copy.javaV3Jhttp://java.sun.com/products/jdk/1.2/docs/api/java.io.FileDescriptor.htmlx?0@http://java.sun.com/products/jdk/1.2/docs/api/java.io.File.htmlv2-Lhttp://java.sun.com/products/jdk/1.2/docs/api/java.io.FileOutputStream.html6w*Khttp://java.sun.com/products/jdk/1.2/docs/api/java.io.FileInputStream.htmlK'Fhttp://java.sun.com/products/jdk/1.2/docs/api/java.io.FileWriter.htmlL$Fhttp://java.sun.com/products/jdk/1.2/docs/api/java.io.FileReader.htmluIInetJava BooksIOThe Java Tutorial - IO_filesfiguresessential24writer.gifxIInetJava BooksIOThe Java Tutorial - IO_filesfiguresessential23reader.gifl MInetJava BooksIOThe Java Tutorial - IO_filesfiguresessential22charstream.gif=+Khttp://java.sun.com/products/jdk/1.2/docs/api/java/io/package-summary.htmlHzQC:\InetJava Books\IO\The Java Tutorial - IO_files\figures\essential\19stream.gifY5RC:\InetJava Books\IO\The Java Tutorial - IO_files\figures\essential\20stream2.gif(" SC:\InetJava Books\IO\The Java Tutorial - IO_files\figures\essential\21chstream.gifIk+ UC:\InetJava Books\IO\The Java Tutorial - IO_files\figures\essential\22charstream.gif]QC:\InetJava Books\IO\The Java Tutorial - IO_files\figures\essential\23reader.gifPQC:\InetJava Books\IO\The Java Tutorial - IO_files\figures\essential\24writer.gifFbuQC:\InetJava Books\IO\The Java Tutorial - IO_files\figures\essential\25inputs.gif>RC:\InetJava Books\IO\The Java Tutorial - IO_files\figures\essential\26outputs.gif  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root Entry Fp 6Data Xϔ1Table*WordDocument2SummaryInformation(DocumentSummaryInformation88CompObjjObjectPoolp 6p 6  FMicrosoft Word Document MSWordDocWord.Document.89q