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
Streams input, output, FILE I/O, tokenization, serialization and compression What is a Stream? • an unformatted sequence of bytes • There are several stream oriented classed in the java.io package. – InputStream – interface – OutputStream – interface – FileInputStream implements InputStream Why would I want a stream? • To input and output data. • To perform elementary data processing • Streaming data is data that flows without stopping. • Higher performance • Binary data processing What kind of Streams are there? • Two kinds: – InputStream (FileInputStream) – OutputStream (FileOutputStream) – you need a File instance to • make a new instance of a FileInputStream or • a FileOutputStream Byte Streams Introducing java.io Where are streams used? • • • • • • • File IO Socket IO Web-based IO Concurrent computing Distributed computing keyboard and terminal printer and the scanner Streams for input and output • Abstract base classes for input and output functionality. • Defines basic set of methods. • Used to get data from files, other objects, etc. Two base structures: 1.InputStream/OutputStream Byte streams 8-bit 2.Reader/Writer Character streams 16-bit UNICODE Internationalization Efficiency Buffer (and not byte) operations Better locking scheme Streams and I/O • basic classes for file IO – FileInputStream, for reading from a file – FileOutputStream, for writing to a file • Example: Open a file "myfile.txt" for reading FileInputStream fis = new FileInputStream("myfile.txt"); Open a file "outfile.txt" for writing FileOutputStream fos = new FileOutputStream ("myfile.txt"); 9 InputStream methods • int read() • int read(byte[] ) • int read(byte[], int, int) • void close • int available() • skip(long) OutputStream methods • void write(int) • void write(byte[] ) • void write(byte[], int, int) • void close() • void flush() Basic Stream Classes • FileInputStream • FileOutputStream • DataInputStream – byte readByte(), long readLong(), double readDouble() • DataOutputStream – writeByte(byte), writeLong(long), writeDouble(double) • PipedInputStream - PipedOutputStream How do I use a FileInputStream? public static FileInputStream getFileInputStream(String prompt) { try { return new FileInputStream(getReadFile(prompt)); } catch (IOException e) { System.out.println("Er: FileOutputStream in Futil.java"); } return null; } Display File Contents import java.io.*; public class FileToOut1 { public static void main(String args[]) { try { FileInputStream infile = new FileInputStream("testfile.txt"); byte buffer[] = new byte[50]; int nBytesRead; do { nBytesRead = infile.read(buffer); System.out.write(buffer, 0, nBytesRead); } while (nBytesRead == buffer.length); } catch (FileNotFoundException e) { System.err.println("File not found"); } catch (IOException e) { System.err.println("Read failed"); } } 14 } copying a file... public static void binaryCopyFile(FileInputStream fis, FileOutputStream fos) throws IOException { byte buffer[] = new byte[512]; int count; while ((count = fis.read(buffer)) > 0) fos.write(buffer, 0, count); } Byte Example (EOF) import java.io.*; public class CopyBytes { public static void main(String[] args) throws IOException { File inputFile = new File("farrago.txt"); File outputFile = new File("outagain.txt"); FileInputStream in = new FileInputStream(inputFile); FileOutputStream out = new FileOutputStream(outputFile); int c; while ((c = in.read()) != -1) //EOF condition test out.write(c); in.close(); out.close(); } } Working with Filter Streams • Filters data being read from or written to a stream • Some streams buffer data, some count data, others convert data to another form. – DataInputStream & DataOutputStream – BufferedInputStream & BufferedOutputStream – LineNumberInputStream – PushbackInputStream (Character based) – PrintStream (This is an output stream.) DataInputStream & DataOutputStream Conceptually, data looks like this, although in binary form (non-text): 19.99 12 Java T-shirt 9.99 8 Java Mug The data might have been created with the following: DataOutputStream out = new DataOutputStream(new FileOutputStream("invoice1.bin")); 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(); DataInputStream in = new DataInputStream(new FileInputStream("invoice1.bin")); // break on EOF while (true) { price = in.readDouble(); unit = in.readInt(); desc = new StringBuffer(20); //end of line (carriage return linefeed) char lineSep = System.getProperty("line.separator").charAt(0); char chr; while (((chr = in.readChar()) != lineSep) && chr != -1) { desc.append(chr); } if (chr == -1) break; System.out.println("You've ordered " + unit + " units of “ + desc + " at $" + price); total = total + unit * price; } System.out.println("For a TOTAL of: $" + total); in.close(); write out the bytes public static boolean writeBytes(File f, byte b[]) { FileOutputStream fos = null; try { fos = new FileOutputStream(f); fos.write(b); fos.close(); return true; } catch (IOException e) { System.out.println("Futil.writeBytes,Could not open" + f); return false; } How big is that file? public static int available(File file) { FileInputStream fis = null; int sizeInBytes = -1; try { fis = new FileInputStream(file); sizeInBytes = fis.available(); fis.close(); } catch (IOException e) { System.out.println("Futil:Could not open file"); } return sizeInBytes; } Filters •Once a stream (e.g., file) has been opened, we can attach filters •Filters make reading/writing more efficient •Most popular filters: • For basic types: •DataInputStream, DataOutputStream • For objects: •ObjectInputStream, ObjectOutputStream 22 Writing data to a file using Filters import java.io.*; public class GenerateData { public static void main(String args[]) { try { FileOutputStream fos = new FileOutputStream("stuff.dat"); DataOutputStream dos = new DataOutputStream(fos); dos.writeInt(2); dos.writeDouble(2.7182818284590451); dos.writeDouble(3.1415926535); dos.close(); fos.close(); } catch (FileNotFoundException e) { System.err.println("File not found"); } catch (IOException e) { System.err.println("Read or write failed"); } } 23 } Reading data from a file using filters import java.io.*; public class ReadData { public static void main(String args[]) { try { FileInputStream fis = new FileInputStream("stuff.dat"); DataInputStream dis = new DataInputStream(fis); int n = dis.readInt(); System.out.println(n); for( int i = 0; i < n; i++ ) { System.out.println(dis.readDouble()); } dis.close(); fis.close(); } catch (FileNotFoundException e) { System.err.println("File not found"); } catch (IOException e) { System.err.println("Read or write failed"); } } 24 } Random-Access Files • A program can start reading or writing a random-access file at any place and read or write any number of bytes at a time. • “Random-access file” is an abstraction: any file can be treated as a random-access file. • You can open a random-access file both for reading and writing at the same time. Random Access Files new RandomAccessFile(“data.txt", "rw"); int skipBytes(int) --Moves the file pointer forward the specified number of bytes void seek(long) --Positions the file pointer just before the specified byte long getFilePointer() --Returns the current byte location of the file pointer The RandomAccessFile class implements both the DataInput and DataOutput interfaces Does not extend stream class No support for Serialized Objects Random-Access Files (cont’d) • A binary file containing fixed-length data records is suitable for random-access treatment. • A random-access file may be accompanied by an “index” (either in the same or a different file), which tells the address of each record. • Tape : CD == Stream : Random-access Serialization • a way to write instance to a stream • Anything that implements the interface serializable can be serialized • Most java core classes implement serializable. • All primitive data types can be serialized Object serialization Write objects to a file, instead of writing primitive types. Use the ObjectInputStream, ObjectOutputStream classes, the same way that filters are used. 29 Why do I need serialization? • • • • • Persistence (data storage) Transmission via a stream comparison Distributed computing (CORBA, RMI, etc.) serialization is an application of streams. ObjectOutputStream (Serialization) FileOutputStream out = new FileOutputStream("theTime"); ObjectOutputStream s = new ObjectOutputStream(out); s.writeObject("Today"); s.writeObject(new Date()); s.flush(); The writeObject method throws a NotSerializableException if it's given an object that is not serializable. An object is serializable only if its class implements the Serializable interface. ObjectInputStream (Deserialization) FileInputStream in = new FileInputStream("theTime"); ObjectInputStream s = new ObjectInputStream(in); String today = (String)s.readObject(); Date date = (Date)s.readObject(); ObjectInputStream stream implements the DataInput interface that defines methods for reading primitive data types How can I use serialization? • • • • • • Make an instance of an ObjectOutputStream ObjectOutputStream resides in java.io. To read back use ObjectInputStream. Object o = ois.read(); oos.write(o); Customer c = (Customer)o; //CNFE? Write an object to a file import java.io.*; import java.util.*; public class WriteDate { public WriteDate () { Date d = new Date(); try { FileOutputStream f = new FileOutputStream("date.ser"); ObjectOutputStream s = new ObjectOutputStream (f); s.writeObject (d); s.close (); } catch (IOException e) { e.printStackTrace(); } public static void main (String args[]) { new WriteDate (); } } 34 Read an object from a file import java.util.*; public class ReadDate { public ReadDate () { Date d = null; ObjectInputStream s = null; try { FileInputStream f = new FileInputStream ("date.ser"); s = new ObjectInputStream (f); } catch (IOException e) { e.printStackTrace(); } try { d = (Date)s.readObject (); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InvalidClassException e) { e.printStackTrace(); } catch (StreamCorruptedException e) { e.printStackTrace(); } catch (OptionalDataException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println ("Date serialized at: "+ d); } public static void main (String args[]) { new ReadDate (); } } 35 How do I control what is saved? • I need a special java keyword for this! • transient is a keyword...for example class Customer implements Serializable { transient String name = null; } java.util.zip Package CheckedInputStream & CheckedOutputStream • An input and output stream pair that maintains a checksum as the data is being read or written. DeflaterOutputStream & InflaterInputStream • Compresses or uncompresses the data as it is being read or written. GZIPInputStream & GZIPOutputStream • Reads and writes compressed data in the GZIP format. ZipInputStream & ZipOutputStream • Reads and writes compressed data in the ZIP format Save a gzip file • • • • • • • • • • • • • • • public void saveGzDb(final File writeFile) throws IOException { if (writeFile == null) return; FileOutputStream fos = new FileOutputStream(writeFile); GZIPOutputStream gos = new GZIPOutputStream(fos); ObjectOutputStream oos = new ObjectOutputStream(gos); oos.writeObject(addressVector); oos.flush(); oos.close(); gos.finish(); fos.close(); System.out.println("saved to:"+writeFile); } Read in the gzip object • FileInputStream fis • = new FileInputStream(readFileName); • GZIPInputStream gis • = new GZIPInputStream(fis); • ObjectInputStream ois • = new ObjectInputStream(gis); • final Object o = ois.readObject(); • addressVector = (Vector) o; Playing Audio from a File • audio is stored in a file format. • One way to open and play the audio is via the ULawCodec. • The ULawCodec resides in the sound package. • Run the main and it will open and play an au file. Project ideas • write a java program that will prompt the user for a directory containing AU files. • Play all au files contained in the directory or the subdirectories from the root selected by the users. • Use the sound.UlawCodec class to help you. • You can use the web to get multiple au files. Whats a codec? • • • • • Coder + decoder = codec. Why do I need a codec? How many codec do I need? Can I writing my own codec? When should I write my own codec? How does the Ulaw Codec work? • public UlawCodec() { • String fileName = • Futil.getReadFileName( • "select an au file"); • readAUFile(fileName); • } How do you get the bytes from a file? • private void readUlawDataFromAFile(String fileName) throws IOException { • FileInputStream fis = new FileInputStream(fileName); • ulawData = readData(fis); • fis.close(); • } Reading from an input stream • public static byte[] readData(InputStream is) throws IOException { • AudioStream as = new AudioStream(is); • int length = as.getLength(); • byte b[] = new byte[length]; • as.read(b, 0, length); • return b; • } How do you play the sound? • public static void playFromFile() { • UlawCodec ulc = new UlawCodec(); • ulc.play(); • //ulc.writeAUFile(); • } How does play work? • public void play() { • stop(); • AudioData audioData = • new AudioData(ulawData); • audioDataStream = new AudioDataStream(audioData); • AudioPlayer.player.start(audioDataStream); • } What is audioData? • a class in package sun.audio; • public class AudioData { • AudioFormat format; • byte[] buffer; • • public AudioData(byte[] bytes) { /* compiled code */ } AudioData(AudioFormat audioFormat, byte[] bytes) { /* compiled code */ } • } What is an AudioDataStream? • public class AudioDataStream extends ByteArrayInputStream { • AudioData ad; • public AudioDataStream(AudioData audioData) { /* compiled code */ } • AudioData getAudioData() { /* compiled code */ } • } What is an AudioPlayer? • • • • public class AudioPlayer extends Thread { private AudioDevice devAudio; private static boolean DEBUG; public static final AudioPlayer player; • private static ThreadGroup getAudioThreadGroup() { /* compiled code */ } • private static AudioPlayer getAudioPlayer() { /* compiled code */ } • private AudioPlayer() { /* compiled code */ } • public synchronized void start(InputStream inputStream) { /* compiled code */ } • public synchronized void stop(InputStream inputStream) { /* compiled code */ } • public void run() { /* compiled code */ } • AudioPlayer(sun.audio.AudioPlayer$1 audioPlayer$1) { /* compiled code */ }