15Streams - Docjava.com

hedgebornabaloneSoftware and s/w Development

Dec 2, 2013 (3 years and 6 months ago)

88 views

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

9

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");



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;


}

14

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"); }


}

}

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;


}

22

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



23

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");


}


}

}

24

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");


}


}

}

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

29

Object serialization

Write objects to a file, instead of writing
primitive types.


Use the ObjectInputStream,
ObjectOutputStream
classes, the same way
that filters are used.

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?

34

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 ();


}

}

35

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 (); }

}

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