Electrical and Computer Engineering Object-Oriented Topic : Streams and Files Maj Joel Young Joel Young@afit.edu. 18-Sep-03 Maj Joel Young
Java Input/Output Java implements input/output in terms of streams of characters Streams have a producer, or source Streams have a consumer, or sink Sometimes sources are sinks depending on use (a file can be both a source and a sink) Source Sink programs, user input, etc. files, console, sockets, etc. 2
I/O Processors Control over the stream is improved by adding processors Convert char streams to integers, doubles, strings, etc. Perform filtering Buffer characters to improve read performance Source Processor Sink 3
Data Sinks/Sources Several kinds of data streams in Java File Reader File Writer Pipe Reader Processor(s) Pipe Writer Processor(s) String Reader Char Array Reader String Writer Char Array Writer Input Streams (Application is Sink) Output Streams (Application is Source) 4
The Pipeline Concept Writing Data: Start with a sink, such as a FileOutputStream Writes only one byte at a time (or an array of bytes), not very efficient so we add a buffer manager Can still only write a byte (or array of bytes), so we add a DataOutputStream to allow more complex types double, int, char, String, etc. Data OutputStream bytes Buffered OutputStream bytes File OutputStream bytes Hard Disk 5
The Pipeline Concept Reading Data: Start with a source, such as a FileInputStream Reads only one byte at a time (or an array of bytes), not very efficient so we add a buffer manager Can still only read a byte (or array of bytes), so we add a DataInputStream to allow more complex types double, int, char, String, etc. Data InputStream bytes Buffered InputStream bytes File InputStream bytes Hard Disk 6
File Streams File Streams (Byte Stream Classes) FileInputStream: read bytes/arrays of bytes FileOutputStream: write bytes/arrays of bytes import java.io.*; public class Copy public static void main(string[] args) throws IOException FileInputStream in = new FileInputStream( source.dat ); FileOutputStream out = new FileOutputStream( dest.dat ); int c; while ((c = in.read())!= -1) out.write(c); in.close(); out.close(); 7
File Streams Add DataInputStream/DataOutputStream Provides read/write methods for primitives Provides read/write methods for unicode strings import java.io.*; public class Test public static void main(string[] args) throws IOException FileOutputStream fos = new FileOutputStream( output.dat ); DataOutputStream dos = new DataOutputStream(fos); dos.writedouble(64.356); dos.close(); FileInputStream fis = new FileInputStream( output.dat ); DataInputStream dis = new DataInputStream(fis); double test = dis.readdouble(); System.out.println( test ); dis.close(); 8
File Streams Can keep adding processors... Add buffered input/output import java.io.*; public class Test2 public static void main(string[] args) throws IOException FileOutputStream fos = new FileOutputStream( output.dat ); BufferedOutputStream bos = new BufferedOutputStream(fos); DataOutputStream dos = new DataOutputStream(bos); dos.writedouble(64.356); dos.close(); FileInputStream fis = new FileInputStream( output.dat ); BufferedInputStream bis = new BufferedInputStream(fis); DataInputStream dis = new DataInputStream(bis); double test = dis.readdouble(); System.out.println( test ); dis.close(); 9
File Streams File Streams (Character Stream Classes) FileReader: read chars/arrays of chars FileWriter: write chars/arrays of chars import java.io.*; public class Copy2 public static void main(string[] args) throws IOException FileReader in = new FileReader( source.dat ); FileWriter out = new FileWriter( dest.dat ); int c; while ((c = in.read())!= -1) out.write(c); in.close(); out.close(); 10
ASCII Files Problem: ASCII uses 8-bit chars, but Java uses 16-bit Unicode chars how do we read plain-text files? InputStreamReader: Translates input bytes to Unicode public class Copy public static void main(string[] args) throws IOException FileInputStream in = new FileInputStream( source.dat ); InputStreamReader isr = new InputStreamReader(in); BufferedReader br = new BufferedReader(isr); String line = br.readline(); // Read a line of text while (line!= null) System.out.println(line); line = br.readline(); br.close(); // Any more text to read? // Print the text to the console // Read more text 11
ASCII Formatted Numbers & Variable Length Strings class Test static public void main(string args[]) throws IOException BufferedReader br = new BufferedReader(new InputStreamReader( new FileInputStream( test.dat ))); String line = br.readline(); // Get first line of text StringTokenizer st; int studentnum; double gradeavg; String name; while (line!= null) st = new StringTokenizer(line); studentnum = Integer.parseInt(st.nextToken()); gradeavg = Double.parseDouble(st.nextToken()); name = st.nexttoken(); while (st.hasmoretokens()) name = name + + st.nexttoken(); System.out.println(studentNum+, +gradeavg+, +name); line = br.readline(); 1 4.0 Smith, Joe 2 2.8 Jones, Jim Bob 3 3.9 Doe, Tricia... 12
Console I/O PrintStream Heavily overloaded versions of print() for: print(int n) print(double d) print(float f) print(string s) Version called println() puts a newline character after the formatted text 13
System.in & System.out Like C++ keeps stdin and stdout streams open at all times System.in is a class attribute of type InputStream System.out is a class attribute of type PrintStream import java.io.*; public class Test public static void main(string[] args) throws IOException System.out.print( Here s a string: ); System.out.println(10); // Integer 10 w/new line break 14