Download JavaI/O - MOVES Institute

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Java I/O The Cheat Sheet Reading and Wri5ng • The basic architecture of Java IO is pluggable. The idea is to have some very simple classes do very simple IO, and then use those simple classes in a variety of other classes that are much more capable • The InputStream and OutputStream are the very simple building blocks • Things like PrintWriter are the more capable classes Packages • The IO classes are in the java.io package • Use import java.io.* to get them all • hFp://download.oracle.com/docs/cd/
E17409_01/javase/6/docs/api/ for documenta5on OutputStream • The OutputStream class knows how to write an array of bytes and a single byte. That’s it. That makes it preFy easy to write for a lot of contexts • A FileOutputStream writes to a file on disk • A ByteArrayOutputStream writes to a chunk of memory Complex Output • We probably want to do more than just write byte arrays. For example, we probably want to write – Strings – Floa5ng point numbers in binary format – Booleans – Characters – Integers • These are all handled by classes that make use of OutputStreams, but are not OutputStreams PrintWriter • Suppose we want to output text. We can create a PrintWriter object, and place some instance of an OutputStream in it via the constructor. PrintWriter knows how to convert strings to what the OutputStream understands PrintWriter The PrintWriter API has printDouble,
println, etc, and talks to the
OutputStream API, which only
understands writing byte arrays
Depending on what sort of OutputStream
This is, it may write to a file, memory,
Etc.
PrintWriter
OutputStream
Example • Create a PrintWriter that writes to a file FileOutputStream fos = new FileOutputStream(“foo.txt”);
PrintWriter pw = new PrintWriter(fos);
pw.println(“Hello world”);
pw.flush();
pw.close();
This creates a FileOutputStream that points to a file
on disk named foo.txt. The PrintWriter instance contains
the FileOutputStream instance, and we use the
PrintWriter API to write a string to the file
Example • Create a PrintWriter that sends output to a socket Socket aSocket = new Socket(anInetAddress, port);
OutputStream os = aSocket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.println(“Hello world”);
pw.flush();
pw.close();
This creates a socket that is connected to an IP address
And port. The OutputStream in the socket is retrieved,
And used to create a PrintWriter instance. We can use
The exact same PrintWriter API to send data to a host
As we do to write to a file!
Example • Create a PrintWriter that writes to a memory buffer ByteArrayOutputStream os = new ByteArrayOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.println(“Hello world”);
pw.flush();
pw.close();
This creates a ByteArrayOutputStream, which sends output
to a memory buffer. Again, the same PrintWriter API
can be used as the other two examples
Flush? • For performance reasons, when you do a println() the data may not actually be wri2en to the underlying output stream right away • You can call flush() at any 5me to force any data lounging around to be wriFen through • This is important in network programming! Always remember to flush() if you hope to see the data actually be sent across the wire Close? • The call to close() is your way of telling the opera5ng system “I will never write anything to this stream ever again” and the opera5ng system can reclaim any resources associated with the stream Print vs. Println • Println adds a carriage return character a`er the data to be wriFen • This is important for “data framing” in network programming; you need to know when one line of data ends an anther begins • The carriage return or newline character is very o`en used to say “this is the end of a line of data” InputStreams • A very similar process is used for input streams. InputStreams are very simple, but we can use InputStreams in other objects that provide a nice API Other Than Text • No5ce that the PrintWriter outputs Strings, not a binary representa5on of things like floa5ng point numbers. • We can use other classes if we want to write binary data to an output stream instead of string data DataOutputStream • O`en used for wri5ng binary data FileOutputStream fos = new FileOutputStream(“foo.txt”);
DataOutputStream dos = new DataOutputStream(fos);
dos.writeFloat(17.0);
dos.writeDouble(23.0);
dos.flush();
dos.close();
DataOutputStream • What if you wanted to create a memory buffer that had two floa5ng point numbers in it, in binary format? ByteArrayOutputStream os = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeFloat(17.0);
dos.writeFloat(23.0);
byte data[] = dos.toByteArray();
Reading & Wri5ng Objects • Java has a very slick ability to read and write en5re object instances to an IO stream, provided the class implements something called the Serializable interface • For the most part, just make sure the class, and any objects it contains, implement the interface, which has no methods • Exactly the same class needs to exist on the reading side • Doesn’t work outside of Java Reading & Wri5ng Objects • Class implements Serializable: public class MyClass implements Serializable
{ int x;
int y;
public int getX();
}
Wri5ng Object Instances FileOutputStream fos = new FileOutputStream(“foo.tmp”);
ObjectOutputStream oos = new ObjectOutputStream(fos);
MyClass anObjectInstance = new MyClass();
oos.writeObject(anObjectInstance);
oos.close();
Reading Object Instances FileInputStream fis = new FileInputStream(“foo.tmp”);
ObjectInputStream ois = new ObjectOutputStream(fis);
MyClass anObjectInstance ;
anObjectInstance = ois.ReadObject();
ois.close();
Cheat Sheet: Text IO • Use when you want to write string representa5ons PrintWriter pw = new PrintWriter(yourOutputStream);
pw.println(“some data”);
pw.writeDouble(17.0);
pw.flush(); pw.close();
Cheat Sheet: Reading Text • Use when you want to read text data from an input stream BufferedReader br = new BufferedReader(
new InputStreamReader(yourInputStream));
String someText = br.readln();
Cheat Sheet: Wri5ng Binary • Write binary data to a memory buffer ByteArrayOutputStream os = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeFloat(17.0);
dos.writeFloat(23.0);
byte data[] = dos.toByteArray();
Cheat Sheet: Reading Binary • Read binary data from a memory buffer ByteArrayInputStream bais =
new ByteArrayInputStream(anArrayOfBytes);
DataInputStream dis = new DataInputStream(bais);
dis.readFloat();
dis.readDouble();
Java IO • It’s not that bad if you don’t panic