Download 15Streams

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
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 */ }
Related documents