Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
.opennet Technologies Input/Output in Java Fall Semester 2001 MW 5:00 pm - 6:20 pm CENTRAL (not Indiana) Time Geoffrey Fox and Bryan Carpenter PTLIU Laboratory for Community Grids Computer Science, Informatics, Physics Indiana University Bloomington IN 47404 [email protected] 1 I/O in Java Many packages and libraries associated with Java provide sophisticated ways to input and output information, e.g.: – GUI-based approaches: input from low-level keyboard and mouse events, or higher level semantic operations on buttons, menus, etc; output through arbitrarily sophisticated graphics (Swing, AWT, Java2d, etc). – (Server-side) Web-based approaches: input from HTML forms (or via client-side Javascript); output through dynamically generated Web pages (Java Servlets, Java Server Pages, etc). – XML-based: input through XML parsing; output through XML serialization (DOMParser, SAXParser, etc). Nevertheless, we often need to resort to more traditional methods to read and write information from terminal keyboard and screen, or ordinary files. – This section discusses “traditional I/O”. 2 Simple Output We already saw many examples of simple output: e.g. float x ; System.out.println(“The value of x is: ” + x) ; – Here we use the string concatenation operator, + (in conjunction with an implicit “string conversion” operation, which converts x to a suitable String representation). – (Note implicit string conversion only works in a + operation). The prefix System.out is a reference to a static field of the System class. – System is a class in the implicitly imported java.lang package. The field out has type PrintStream. It represents the “standard output” of the program. – Typically the terminal screen, unless it has been redirected. 3 I/O Streams A stream carries a sequence of bytes or characters. Stream sources and sinks include: – files – network or thread-to-thread connections – blocks of memory (Java arrays) As far as possible, all types of streams are treated uniformly. The most basic byte streams are InputStream and OutputStream. These classes have methods to read or write bytes from or to a stream, e.g.: int read(); void write(int); skip(long); available(); flush(); close(); etc, etc – Many of the above methods throw a possible IOException. – The read() and write(int) methods “block” during transfer. Mostly you won’t use these methods directly: you use higher level methods provided by specialized stream subclasses. 4 The Output Stream Zoo The specialized subclasses of OutputStream write their data to specific kinds of target, or offer additional methods to write a byte stream in a more structured way, or provide other functionality, such as guaranteed buffering. For example, to open a binary stream to an output file, use: FileOutputStream s = new FileOutputStream("/usr/gcf/file"); OutputStream ByteArray OutputStream FileOutput Stream FilterOutput Stream Buffered PrintStream OutputStream PipedOutput Stream DataOutput Stream 5 FilterOutputStreams DataOutputStream and BufferedOutputStream are two important FilterOutputStreams. To open a data stream to an output file, use: DataOutputStream out = new DataOutputStream (new FileOutputStream( filename ) ); where filename is a file name string. – Note that DataOutputStream has methods to write any primitive type. To open a buffered output stream, use: BufferedOutputStream out = new BufferedOutputStream (new FileOutputStream( filename ) ); – Only bytes may be written to a BufferedOutputStream (unless, say, you create a Dataoutput stream, wrapping it in turn). 6 The Input Streams The hierarchy of input streams is follows similar lines to the hierachy of output streams. We don’t reproduce the details here. Check out the Java 2 API at http://java.sun.com/products/j2se/1.4/docs/api 7 Character Streams The hierarchies of streams based on InputStream and OutputStream are most suitable for handling “binary” data. A separate hierarchy of Reader and Writer classes fulfill the analogous role for character streams, used to read and write to terminal, or text files. To construct a character output stream directed to a file, for example: PrintWriter out = new PrintWriter (new FileWriter( filename ) ) ; – Note it is a historical accident that System.out is a PrintStream rather than a PrintWriter. PrintStream is now a deprecated class, and only retained for backward compatibility. 8 Standard Input/Output The System class in java.lang provides the “standard” I/O streams System.in, System.out, and System.err. System.in is an instance of InputStream. System.out and System.err are instances of PrintStream. 9 Simple keyboard input import java.io.* ; class BufferedReaderTest { public static void main(String [] args) throws IOException { // Create a BufferedReader wrapping standard input: BufferedReader in = new BufferedReader(new InputStreamReader(System.in)) ; String s ; s = in.readLine() ; new-line. // Reads any string terminated by System.out.println("s = " + s) ; // Print what was read. } } 10 Wrapper classes for primitive types Primitive types such as int, char, float, etc. are not classes. Thus one cannot use methods: int var; var.toString(); // Wrong! However, all primitive types have associated wrapper classes: Character myChar = new Character( 'A' ); – The Character class has methods such as: if ( myChar.equals( ch ) ) ... System.out.print( myChar.toString() ); Static methods in a wrapper class are also useful to convert types, such as a String to a Double. 11 Example: reading a number double x ; while (true) { // retry loop try { String t = in.readLine() ; // Read line as a string x = Double.valueOf(t).doubleValue() ; // Convert to a double break ; // Success!: break out of retry loop } catch (NumberFormatException e) { System.out.print("Sorry. " + "Please re-enter a double (no spaces): ") ; // retry loop begins again } } System.out.println("x = " + x) ; // Print what was 12 The java.lang.Math class This class provides standard mathematical functions, using types int, long, float and double. It is a “static class”, meaning that you only use the static methods. – You cannot create Math objects (enforced by private constructor). The methods include IEEEremainder, abs, ceil, cos, exp, floor, log, max, min, pow, random, sin, sqrt, and other trig functions. – The random number generator is a linear congruential generator, which is fast but not random enough for many scientific applications. 13