290 likes | 424 Views
Introduction to Java 2 Programming. Lecture 7 IO, Files, and URLs. Overview. Java I/O The java.io package Streams, Readers and Writers Files Working with Files URLs Working with Internet Resources. Java I/O – The Basics. Java I/O is based around the concept of a stream
E N D
Introduction to Java 2 Programming Lecture 7 IO, Files, and URLs
Overview • Java I/O • The java.io package • Streams, Readers and Writers • Files • Working with Files • URLs • Working with Internet Resources
Java I/O – The Basics • Java I/O is based around the concept of a stream • Ordered sequence of information (bytes) coming from a source, or going to a ‘sink’ • Simplest stream reads/writes only a single byte, or an array of bytes at a time • Designed to be platform-independent • The stream concept is very generic • Can be applied to many different types of I/O • Files, Network, Memory, Processes, etc
Java I/O – The Basics • The java.io package contains all of the I/O classes. • Many classes specialised for particular kinds of stream operations, e.g. file I/O • Reading/writing single bytes is quite limited • So, it includes classes which provide extra functionality • e.g. buffering, reading numbers and Strings (not bytes), etc. • Results in large inheritance hierarchy, with separate trees for input and output stream classes
Java I/O – Using InputStreams • Basic pattern for I/O programming is as follows: Open a stream While there’s data to read Process the data Close the stream
Java I/O – Using InputStreams • I/O in Java: InputStream in = new FileInputStream(“c:\\temp\\myfile.txt”); int b = in.read(); //EOF is signalled by read() returning -1 while (b != -1) { //do something… b = in.read(); } in.close();
Java I/O – Using InputStreams • But using buffering is more efficient, therefore we always nest our streams… InputStream inner = new FileInputStream(“c:\\temp\\myfile.txt”); InputStream in = new BufferedInputStream(inner); int b = in.read(); //EOF is signalled by read() returning -1 while (b != -1) { //do something… b = in.read(); } in.close();
Java I/O – Using InputStreams • We’ve omitted exception handling in the previous examples • Almost all methods on the I/O classes (including constructors) can throw an IOException or a subclass. • Always wrap I/O code in try…catch blocks to handle errors.
Java I/O – Using InputStreams InputStream in = null; try { InputStream inner = new FileInputStream(“c:\\temp\\myfile.txt”); in = new BufferedInputStream(inner); //process file } catch (IOException e) { e.printStackTrace(); } finally { try { in.close(); } catch (Exception e) {} }
Java I/O – Using InputStreams • Basic pattern for output is as follows: Open a stream While there’s data to write Write the data Close the stream
Java I/O – Using OutputStreams • Output in Java: OutputStream out = new FileOutputStream(“c:\\temp\\myfile.txt”); while (…) { out.write(…); } out.close();
Java I/O – Using OutputStreams OutputStream out = null; try { OutputStream inner = new FileOutputStream(“c:\\temp\\myfile.txt”); out = new BufferedOutputStream(inner); //write data to the file } catch (IOException e) { e.printStackTrace(); } finally { try { out.close(); } catch (Exception e) {} }
But That’s Not All! • Input/OutputStream and sub-classes were part of Java 1.1. • Java 1.2 adds more classes specialised for character based I/O • The stream classes are for data I/O. • Classes for character I/O are called Readers and Writers • Why have specialised classes? • To support foreign languages
Unicode • Each character in the ASCII character set fits into a single byte • …but that’s not enough for chinese, and other complex alphabets • Need more than a single byte • A Java character (char) is 2 bytes • Java handles text using Unicode • International standard character set, containing characters for almost all known languages • And a few imaginary ones! (Klingon, Elvish…) • Inside the JVM all text is held as Unicode
Java Text I/O • Because byte != character for all languages, you have to turn bytes into chars using a Input/OutputStream • Java provides Readers and Writers to save you this work. • These classes deal with streams of characters • Read/write single character or array of characters • Again there are classes specialised for particular purposes
Using Readers Reader in = null; try { Reader inner = new FileReader(“c:\\temp\\myfile.txt”); in = new BufferedReader(inner); //process file } catch (IOException e) { e.printStackTrace(); } finally { try { in.close(); } catch (Exception e) {} }
Using Writers Writer out = null; try { Writer inner = new FileWriter(“c:\\temp\\myfile.txt”); out = new BufferedWriter(inner); //write data to the file } catch (IOException e) { e.printStackTrace(); } finally { try { out.close(); } catch (Exception e) {} }
Bridging the Gap • Sometimes you need to bridge across the two hierachies • Use InputStreamReader or OutputStreamWriter • InputStreamReader • Reads bytes from an InputStream, and turns them into characters using a character encoding • OutputStreamWriter • Turns characters sent to the Writer into bytes written by the OutputStream, again using a character encoding.
The File Object • Java provides access to the file system through the java.io.File object • Represents files and directories • Has methods for working with files and directories • Making directories, listing directory contents • renaming and deleting, checking permissions, etc • Check whether the File corresponds to a directory or a file with isDirectory() • Well-featured, and intuitive • Take a look through the javadocs • Quick example…
The URL Object • Similar to File is the java.net.URL class • Provides access to information about website addresses • Most useful is a means to open an InputStream to a remote website • Use the openStream() method • Makes it very simple to retrieve files from the Internet. • Throws MalformedURLException if you provide an illegal internet address in its constructor • Example…
URL Object Example try { URL p = new URL(“http://www.ldodds.com/lectures/person.jar”); InputStream inner = p.openStream(); BufferedInputStream in = new BufferedInputStream(inner); //process the file… in.close() catch (Exception e) { e.printStackTrace(); }