You are on page 1of 160

Input-Output operations

1. Exceptions
2. Types of Input-Output Operations
3. Streams
4. Communication on serial and parallel ports
5. Native Methods

Tiberiu Leia: Software Engineering Input-output operations

1. Exceptions
Definition: An exception is an event, which occurs during the execution
of a program that disrupts the normal flow of the program's instructions
Source: Java Tutorial
.

Program call stack.

Tiberiu Leia: Software Engineering Input-output operations

Searching the call stack for the exception handler.

Tiberiu Leia: Software Engineering Input-output operations

Exceptions are related to achievement of programs where the mistakes dont


disturb them and where undesired situations are removed.
Badly formed code will not run
Goal: create programs:
without errors
that dont block
that can face every situations and
adapt to undesired circumstances.
Error cause: there wasnt anticipated and eliminated all program states
that cause problems. Activities to exit correctly from errors should be
implemented.

Tiberiu Leia: Software Engineering Input-output operations

Special situation origins (causes):


receiving wrong data from users
reading data from objects that dont exist
calling methods of objects that dont exist
accessing files that dont exist or that contain wrong data (wrong format)
calling hardware devices that dont exist or that dont work properly input-output errors
trying an Internet connection but the network doesnt work or calling a
partener that doesnt answer network connection errors etc.
Throwing an exception when a program violates semantic
constraints. Operating system signals JVM that creates an exception object
signaling an error.

Tiberiu Leia: Software Engineering Input-output operations

Signaling
An exception is signaled if:
an expression evaluation violates language normal
an error appears at loading or linking a program
a resource limits are exceeded.
Exceptions are unusual events that happen outside normal or desired
program behavior.

Tiberiu Leia: Software Engineering Input-output operations

Behavior
Throwing exceptions
Exceptional conditions exception object is ejected from the current
context.
The exception object is created with new operator. It contains information
about the cause.
Handling
Exception handler mechanism to recover exception state recovery
Class behavior when exceptions occur. The programmers are warned
(notified) about the possibilities of exception occurring.

Tiberiu Leia: Software Engineering Input-output operations

Exception classes hierarchy:


Throwable Error
ExceptionIOException EOFException
FileNotFoundException
MalformedURLException
SocketException
RuntimeException ClassNotFoundException
AWTException
SecurityException
NullPointerException
ArrayIndexOutOfBoundsException

Tiberiu Leia: Software Engineering Input-output operations

Object

Trowable

Error

RuntimeException

Exception

NullPointerException

ExceptiaMea
AlteClase cu
Exceptii

Tiberiu Leia: Software Engineering Input-output operations

Error instances are inner Java environmet errors (JVM).


They have dezastrous effects that cannot be recovered.
Problem to: catch throw

public class Throwable implements java.io.Serializable {


...................
public String getMessage()
public String toString()
public void printStackTrace()
..................
}

Tiberiu Leia: Software Engineering Input-output operations

10

Definition: A stack trace provides information on the execution history of


the current thread and lists the names of the classes and methods that were
called at the point when the exception occurred. A stack trace is a useful
debugging tool that you'll normally take advantage of when an exception has
been thrown.
Exception:
public class NullPointerException extends RuntimeException
public class EOFException extends IOException
public class IllegalMonitorStateException extends RuntimeException
public class IllegalThreadException extends IllegalArgumentException

Tiberiu Leia: Software Engineering Input-output operations

11

Exception subclasses
Runtime exceptions
ArrayIndexOutOfBoundsException referin la o variabil care nu exist
n obiect (index inexistent) s-a depit limita unui tablou
SecurityException a aprut o excepie legat de securitate ncercare de
accesare de metode, clase sau variabile care nu au fost declarate publice
NullPointerException se ncearc folosirea unui pointer cu valoarea null,
adic folosirea unei variabile nainte ca aceasta s fie configurat ca
referin a obiectului sau dup ce a fost eliminat.
ArithmeticException pentru o operaie nepermis (ex. mprire cu zero)
StringOutOfBoundsException indicele este in afara domeniului stabilit
NumberFormatException se ncearc transformarea unui ir de caractere
cu format necorespunztor ntr-un numr
Tiberiu Leia: Software Engineering Input-output operations

12

ArrayStoreException pentru atribuirea unui element dintr-un tablou a


unei valori nepermise (ex. la un tablou de ntregi se ncearc atribuirea unui
numr double)
ClassCastException se ncearc prin distribuire (cast) transformarea unui
obiect n unul necompatibil cu primul
IllegalArgumentException se utilizeaz argumente necorespunztoare
IllegalMonitorStateException se ncearc efectuarea unei operaii cu un
monitor (software) dar nu este posesorul monitorului sau acesta este ntr-o
stare necorespunztoare
IllegalThreadStateException se ncearc apelarea unei metode a unui fir
care nu este permis n situaia respectiv
NegativeArraySizeException este semnalat la ncercarea de creare a unui
tablou cu dimensiuni negative

Tiberiu Leia: Software Engineering Input-output operations

13

File exception
EOFException - s-a detectat sfritul fiierului i se ncearc citirea din el
n continuare
Transmission exception
MalformedURLException adresa URL nu are formatul corect
(corespunztor)

Tiberiu Leia: Software Engineering Input-output operations

14

Exception handling
try { //marcare inceput de bloc protejat = guard region
//protected method body or instruction sequence that leads to exception
............................
} // end of protected block
catch (ClassExceptie1 numeExceptie1) // preluare exceptie
{
//secventa_executata_la_aparitia_exceptiei;
}
catch (ClassExceptie2 numeExceptie2) { ... }

finally {
//secventa de cod executata in final (in oricare caz)release of the memory
}
Tiberiu Leia: Software Engineering Input-output operations

15

Catching an exception
Ex:
try {
................
}catch (IOException e) {
System.out.println(Eroare: +e.getMessage());
}

Tiberiu Leia: Software Engineering Input-output operations

16

New Exception Creation


public class ExceptiaMea extends Exception {
public ExceptiaMea() {//constructor
}
public ExceptiaMea(String msj) {
super(msj);//msj mesajul transmis in exceptie
}
/*se pot suprascrie metodele
public String getMessage()
public String toString()
public void printStackTrace()
*/
}
Tiberiu Leia: Software Engineering Input-output operations

17

Exception throwing
launching = signaling = throwing
throw new ExceptiaMea;
Ex.:
if(ref==null) throw new NullPointerException("ref=null");

Tiberiu Leia: Software Engineering Input-output operations

18

Ex.: Class diagram containing a method that can throw exception


ClasaCuMetPericuloasa

Exception

+metPericuloasa()

MainClass

<<exception>>
ExceptiaMea
+toString()
+getMessage()
+printStack()
+daInformatii()

Fig x. Diagrama claselor unei aplicatii care semnalizeaza si trateaza exceptii

Tiberiu Leia: Software Engineering Input-output operations

19

public double metodaPericuloasa(double x, int j)


throws ArithmeticException, ExceptiaMea
//sunt doua exceptii
list of exceptions
{
x=x/j;
if (j==0) throw new ExceptiaMea(
" din metodaPericuloasa");
return x;
}

Tiberiu Leia: Software Engineering Input-output operations

20

Ex.: Usage of a method that throws exceptions


try {
y = cls.metodaPericuloasa(y,i);
}
catch (ArithmeticException e)
{
System.out.println("Impartire cu zero");
}
catch (ExceptiaMea e2)
{
System.out.println("Eroare: "+
e2.getMessage());
}
Tiberiu Leia: Software Engineering Input-output operations

21

Catching exception information from stack


catch (Exception cause) {
StackTraceElement elements[] = cause.getStackTrace();
for (int i = 0, n = elements.length; i < n; i++) {
System.err.println(elements[i].getFileName() + ":"
+ elements[i].getLineNumber()
+ ">> "
+ elements[i].getMethodName() + "()");
}
}

Rethrowing exception

Tiberiu Leia: Software Engineering Input-output operations

22

Recommendation for exception usage


Dont declare an exception when a simple expression test can avoid it.
Ex.: When a user have to introduce a data it is easier to verify if it is
correct and ask to introduce again than to signal an exception.
Value provided from a device must be signaled based on exception.
Handling an exception cost more that an expression test.
Signal exceptions only with really chances to happen.
Fill the catch block even if the Java compiler accepts empty blocks.

Tiberiu Leia: Software Engineering Input-output operations

23

2. Input-output operations
<They perform information interchange between a program
and its environment >
Streams
Native methods
Graphical windows - GUI
Communication system

Tiberiu Leia: Software Engineering Input-output operations

24

3. Streams
read()
Source

InputStream

OutputStream

Program

Destination

write()
print()

Stream = communication channel Java streams:


Byte Streams - 0 and 255
Character Streams
Buffered Streams
Data Streams
Object Streams
Tiberiu Leia: Software Engineering Input-output operations

25

Senses:
input stream
output stream
Byte streams accept:
numerical data
executable program and
bytecode

Tiberiu Leia: Software Engineering Input-output operations

26

Source:
files on the same computer
keyboard
input channel - Internet (Intranet)
other thread or program etc.
Destination:
files
monitor - screen
output channel - Internet (Intranet)
other thread or program
printer etc.

Tiberiu Leia: Software Engineering Input-output operations

27

Usage of input stream:


create an object associated to data source using a Input Stream class
read information with the object methods
close the date stream.
Usage of output stream:
create an object associated to data destination using a Output Stream class
write information with the object methods
close the date stream.

Tiberiu Leia: Software Engineering Input-output operations

28

Classes and interfaces


Package java.io.
Interfaces:
DataInput - ofer posibilitatea citirii octeilor dintr-un flux binar i
construirea datelor din el (n oricare dintre tipurile de date primitive)
DataOutput - idem pentru scrieri
Externalizable - servete la scrierea n fluxuri serializabile pentru salvare
i reconstruire (reconstituire)
FileFilter - servete la filtre pentru nume de ci abstracte
ObjectInput - extinde interfaa DataInput cu citirea obiectelor
ObjectOutput - extinde interfaa DataOutput cu scrierea obiectelor
ObjectStreamConstant - conine constante de scriere pentru fluxuri
Serializable - permite implementarea claselor serializabile

Tiberiu Leia: Software Engineering Input-output operations

29

Classes:
BufferedInputStream - adaug funcionalitate la alt flux de intrare prin
asocierea unui buffer - clasele vor avea n plus metodele mark i reset.
BufferedOutputStream - implementeaz un flux de ieire cu buffer
BufferedReader - permite citirea unui text dintr-un flux de intrare de tip
caracter. Pune caracterele n buffer astfel nct realizeaz citiri eficiente de
caractere, tablouri i linii.
BufferedWriter - permite scrierea unui text ntr-un flux de ieire de tip
caracter. Pune caracterele n buffer ceea ce permite scrieri eficiente de
caractere singulare, tablouri i string-uri.
ByteArrayInputStream - are un buffer intern care conine octei ce pot fi
citii din flux.
ByteArrayOutputStream - implementeaz un flux de ieire n care se scriu
datele ntr-un tablou de octei.
Tiberiu Leia: Software Engineering Input-output operations

30

CharArrayWriter - implementeaz un buffer de caractere care poate fi


utilizat ca un "Writer".
DataInputStream - permite citirea tipurilor de date primitive Java dintr-un
flux de intrare cu care este n legtur ntr-un mod independent de main.
DataOutputStream - permite scrierea tipurilor de date primitive ntr-un
flux de ieire cu care este n legtur.
File - este o reprezentare abstract a unui fiier
FileDescriptor - instanele clasei servesc la tratarea structurilor specifice
mainii reprezentnd un fiier deschis, soclu sau alte surse sau destinatari de
octei.
FileInputStream - creeaz un flux de intrare pentru citirea datelor dintr-un
fiier sau dintr-un obiect de tip FileDescriptor.
FileOutputStream - creeaz un flux de ieire pentru scrierea datelor ntr-un
fiier (din clasa File) sau un obiect de tip FileDescriptor.
FilePermission - reprezint accesul la un fiier sau un director
Tiberiu Leia: Software Engineering Input-output operations

31

FileReader - pentru citirea caracterelor din fiiere


FileWriter - pentru scrierea caracterelor n fiiere
FilterInputStream - include un alt flux de intrare de date care este folosit
ca surs de date de baz cu posibilitatea transformrii datelor pe parcurs sau
adugnd funcionalitate.
FilterOutputStream - este superclasa tuturor fluxurilor care filtreaz
fluxuri de ieire.
FilterReader - este o clas abstract pentru citirea fluxurilor de caractere
filtrate.
FilterWriter - idem pentru scrierea n fluxuri
InputStream - este o clas abstract, fiind superclasa claselor reprezentnd
fluxuri de intrare pe octei.
InputStreamReader - este un pod de la fluxuri de octei la fluxuri de
caractere.
Tiberiu Leia: Software Engineering Input-output operations

32

LineNumberReader - creeaz un flux de intrare de tip buffer care


urmrete numrul de linii.
ObjectInputStream - deserializeaz date primitive i obiecte scrise n
prealabil cu ObjectOutputStream.
ObjectOutputStream - scrie tipuri de date primitive i grafuri de obiecte
Java n OutputStream
ObjectStreamClass - descriptor pentru serializarea datelor
OutputStream - este o clas abstract, superclasa tuturor claselor care
reprezint un flux de ieire de octei.
OutputStreamWriter - este un pod de la fluxuri de caractere la fluxuri de
octei. Caracterele scrise sunt translatate n octei conform cu codificarea
specificat a caracterelor.
PipedInputStream - se conecteaz la un flux de ieire pe conduct (piped
output stream).
PipedOutputStream - idem pentru ieire
Tiberiu Leia: Software Engineering Input-output operations

33

PipedReader - construiete fluxurile de intrare de caractere din conducte


PipedWriter - idem pentru fluxuri de ieire
PrintStream - adaug funcionalitate la un alt flux de ieire. Trateaz
convenabil diferite tipuri de date.
PrintWriter - tiprete reprezentri formatate ale obiectelor n fluxuri de
ieire de tip text.
PushbackInputStream - adaug funcionalitate la un alt flux de ieire
("pushback") - datele pot s fie "necitite" adic s fie mpinse napoi n
buffer pentru a fi citite din nou.
PushbackReader - adaug funcionalitate la un alt flux de intrare care
permite caracterelor s fie mpinse ("pushback") napoi ntr-un flux.
RandomAccessFile - instanele ei pot citi sau scrie direct n oricare poziie
dintr-un fiier.
Reader - clas abstract pentru citirea fluxurilor de caractere.
Tiberiu Leia: Software Engineering Input-output operations

34

SequenceInputStream - reprezint concatenarea logic a altor fluxuri de


intrare.
SerializablePermission - pentru permiterea serializrii
StreamTokenizer - transform un flux de intrare n jetoane pe care le
citete unul cte unul.
StringReader - creeaz un flux de caractere care conecteaz ieirea la un
buffer de tip string (care poate fi utilizat la construirea unui string).
Writer - clas abstract pentru construirea fluxurilor de caractere.

Tiberiu Leia: Software Engineering Input-output operations

35

Byte Streams
Reading a character from keyboard
Class System
Clasa System a fost conceput pentru rezolvarea operaiilor I/E simple,
apelarea colectorului de reziduuri, furnizarea timpului curent, ieiri forate
din program, obinerea sau setarea proprietilor sistemului. Aceasta are
cmpurile:
System.in pentru citiri (intrri) standard
System.out pentru scrieri (ieiri) standard i
System.err pentru erori.
Cmpurile menionate sunt membri statici ai clasei System avnd
definiiile:
public static final PrintStream out
public static final InputStream in
Tiberiu Leia: Software Engineering Input-output operations

36

Class InputStream
public abstract class InputStream extends Object
Metode:
available() - returneaz un numr de octei care sunt disponibili n flux fr
a bloca firul
close() - servete la nchiderea fluxului
public synchronized void mark(int n) - marcheaz poziia curent n flux, n
fiind numrul maxim de octei care pot fi citii nainte ca marcajul s
devin invalid
public synchronized void markSupported() - testeaz dac fluxul accept
metodele mark i reset

Tiberiu Leia: Software Engineering Input-output operations

37

public abstract int read() throws IOException - declarat (dar


neimplementat) ca fiind destinat pentru citirea unui octet - trebuie
implementat n subclase
public int read(byte b[]) throws IOException - citete un tablou de octei
ntr-un buffer b - returneaz numrul de octei citii
public int read(byte b[], int off, int len) throws IOException - citete un
tablou de octei de lungime len ncepnd de la off - returneaz -1 dac nu
reuete, sau numrul de octei citii n cazul unei citiri reuite
public synchronized void reset() throws IOException - repoziioneaz
fluxul n poziia marcat de ultima apelare a metodei mark
public long skip(long n) throws IOException - sare peste numrul precizat
de octei.

Tiberiu Leia: Software Engineering Input-output operations

38

Class OutputStream
Metoda write() - permite scrierea octeilor n fluxuri de ieire. Are forme
care scriu un octet, un tablou de octei sau un segment dintr-un tablou de
octei. Ca i metoda read(), blocheaz firul care ncearc s scrie pn la
terminarea operaiei.
Metoda flush() - determin scrierea imediat ntr-un flux de ieire cu
buffer.
Metoda close() - determin ca orice dat scris n flux s fie memorat
nainte ca fluxul s fie dezalocat i eliminat.

Tiberiu Leia: Software Engineering Input-output operations

39

Class PrinStream
PrintStream(OutputStream out) constructor
Metode:
print(boolean b)
print(float f) i variantele similare
print(Object o)
print(char[] c)
println(boolean b) etc.
println(String s)
write(byte[] buf, int off, int len)

Tiberiu Leia: Software Engineering Input-output operations

40

Exemplu:
try {
char citCar = (char)(System.in.read());
int disp = System.in.available();
System.in.skip(disp);
System.out.print(disp);
} catch (IOException e) {}
MainClass
+main(): void

PrintStream
+print(String): void
+println(String): void

Tiberiu Leia: Software Engineering Input-output operations

<<final>>
System
+in: InputStream
+out: PrintStream

<<abstract>>
InputStream
+read(byte[]): int
+skip(int): long
+available(): int

41

Byte Array Streams


Clasele pentru fluxuri de intrare pe octei:
BufferedInputStream citete date dintr-o zon tampon (buffer)
ByteArrayInputStream citete octeii de date ntr-o matrice de octei
DataInputStream citete dintr-un flux de intrare obiecte de date
FileInputStream citete date dintr-un fiier
StringBufferedInputStream citete date de tip caracter ntr-o matrice de
caractere
Metode:
read() citete date dintr-un flux de intrare
skip() ignor datele rmase din fluxul de intrare
markAvailable() testeaz dac metoda mark() este disponibil pentru
fluxul de intrare
close() nchide un flux de intrare
Tiberiu Leia: Software Engineering Input-output operations

42

Unele metode nu sunt utilizabile pentru toate fluxurile de intrare:


available() determin cantitatea de date disponibile ntr-un flux de intrare
mark() marcheaz n fluxul de intrare un punct la care se poate reveni
ulterior
reset() revine la un punct specificat din fluxul de intrare.
Clase de fluxuri de ieire pe octei:
BufferedOutputStream scrie date ntr-o zon tampon (buffer)
ByteArrayOutputStream scrie datele ntr-un tablou de octei
DataOutputStream scrie obiecte de date ntr-un flux de ieire
FileOutputStream scrie date ntr-un fiier
PrintStream scrie date formatate pe ecranul monitorului

Tiberiu Leia: Software Engineering Input-output operations

43

BufferedStreams
Scop: To reduce this kind of overhead, the Java platform implements
buffered I/O streams. Buffered input streams read data from a memory area
known as a buffer; the native input API is called only when the buffer is
empty. Similarly, buffered output streams write data to a buffer, and the
native output API is called only when the buffer is full.
Probleme: golirea = flushing
autoflash n constructor
Buffer justification: different speeds of producer and consumer

Tiberiu Leia: Software Engineering Input-output operations

44

File Streams
File,
FileDescriptor,
FilePermision
FileInputStream,
FileOuputStream
FileReader,
FileWriter.

Tiberiu Leia: Software Engineering Input-output operations

45

Class File
Un obiect File reprezint un fiier din sistemul nativ. Clasa File are
constructorii:
File(String cale);
File(String cale, String nume);
File(File dir, String nume);
Parametrul cale este calea ctre fiier, nume numele, iar dir permite
utilizarea unui alt obiect File ca director.
Metodele: canRead(), canWrite(), delete(), equals(Object), exists(),
getName(), getParent(), getPath(), lastModified(), length(), list(), mkdir(),
renameTo(File), toString().

Tiberiu Leia: Software Engineering Input-output operations

46

Se creeaz un obiect File (de tip fiier):


File fil=new File(tmp.txt);
Se poate testa dac fiierul exist n modul urmtor:
if(fil.exists()) System.out.println(Fisierul tmp.txt exista);
Class FileInputStream
este utilizat pentru crearea unui flux de intrare pe octei dintr-un obiect File
sau FileDescriptor. Are metodele: close(), finalize(), getFD(), read(byte[]),
read(byte[],int,int) i skip(long).
Class FileOutputStream
este utilizat pentru crearea unui flux de ieire pe octei pentru scriere ntr-un
obiect File sau FileDescriptor. Are metodele: close(), finalize(), getFD(),
write(byte[]), write(byte[],int,int) i write(int).

Tiberiu Leia: Software Engineering Input-output operations

47

Construirea unui flux pentru un fiier:


FileInputStream numeIn=new FileInputStream(fisierNou.dat);
sau
File fil=new File(fisierNou.dat);
FileInputStream fluxIn=new FileInputStream(fil);

Tiberiu Leia: Software Engineering Input-output operations

48

Exception Handling
byte b;
try {
FileInputStream fluxIn=new FileInputStream(fisierNou.dat);
b=fluxIn.read()//citeste din flux
}
catch (IOException e)
{
System.out.println(Eroare la citire +e);
}
Dac read() furnizeaz 1, citirea s-a terminat (nu mai are ce citi din flux).

Tiberiu Leia: Software Engineering Input-output operations

49

Scrierea n fiier:
FileOutputStream outStream =new FileOutputStream(fisierIesire.dat);
sau
File fil=new File(fisierIesire.dat);
FileOutputStream outStream=new FileOutputStream(fil);
outStream.write(n); //unde n este int, boolean, float, double etc.
i la scriere trebuie tratat o excepie posibil.

Tiberiu Leia: Software Engineering Input-output operations

50

Closing the stream


try {
FileOutputStream outStream=new FileOutputStream(fisier.dat);
//scrie date
outStream.close();
}
catch (IOException e) {
System.out.println(Eroare de scriere);
}

Tiberiu Leia: Software Engineering Input-output operations

51

RandomAccessFile
public class RandomAccessFile extends Object implements DataOutput,
DataInput

nceput

Offset

Sfrit

Fiier

Fig. x.
Tiberiu Leia: Software Engineering Input-output operations

52

Clasa RandomAccessFile acept noiunea de indicator (pointer) de fiier.


Acesta indic poziia curent din fiier.
La crearea lui, indicatorul corespunde poziiei 0. Operaiile readXXX i
write XXX ajusteaz indicatorul fiierului dup numrul de octei citii sau
scrii.
Metoda seek poziioneaz indicatorul de fiier imediat dup octetul
specificat.
Constructorii clasei sunt:
RandomAccessFile(File numeFisier, String mode) creeaz un flux de
fiier cu acces direct pentru citire din (i opional pentru scriere n) fiierul
specificat de argumentul File.
RandomAccessFile(String numeFisier, String mode) idem mai sus cu
specificarea numelui fiierului.
Numele fiierului este dependent de sistem. Modul mode poate fi:
r pentru citire (input)
rw pentru citire-scriere (input-output)
Tiberiu Leia: Software Engineering Input-output operations

53

Metodele clasei sunt:


close() nchide fluxul de fiier cu acces aleator i elibereaz orice resurs
a sistemului asociat cu el.
getFD() returneaz obiectul descriptor de fiier (File Descriptor) asociat
cu fluxul.
getFilePointer() returneaz valoarea curent a offset-ului fiierului.
length() returneaz lungimea fiierului.
read() citete un octet din fiier.
read(byte[] b) citete pn la b.length octei din fiier n tabloul b.
read(byte[] b,int off, int length) Idem mai sus, dar cu offset.
readBoolean() citete o valoare boolean.
readByte() idem, un octet.
readChar() idem, un caracter.
readDouble() idem, un numr real n dubl precizie.
Tiberiu Leia: Software Engineering Input-output operations

54

readFloat() idem n simpl precizie.


readFully(byte b[]) citete b.length octei din fiier n tabloul b de octei.
readFully(byte b[], int off, int len) idem cu offset.
readInt() citete un numr ntreg.
readLine() citete urmtoarea linie text.
readLong()
readShort()
readUnsigned()
readUTF() citete un string din fiier.
seek(long) pune offsetul la nceput de fiier.
skip(int n) sare peste n octei.
write(byte b[],) scrie b.length octei din tabloul b n fiier cu ncepere de
la offset off dat implicit.
write(byte b[], int off, int len) idem cu precizarea offset-ului.
writeBoolean() Tiberiu Leia: Software Engineering Input-output operations

55

writeByte(int)
writeBytes(String)
writeChar()
writeChars(String)
writeDouble(double) convertete un argument double ntr-un long
folosind metoda doubleToLongBits din clasa Double i apoi scrie valoarea
mrimii long n fiier ca o cantitate de cte 8 bii, cu primul octet cel
superior.
write(int)
Toate metodele de mai sus arunc IOException.

Tiberiu Leia: Software Engineering Input-output operations

56

Ex. de specificaie a unui program:


Se citete de la consol un ir de caractere care se pune ntr-un buffer buf
de tip byte[].
Se scrie pe ecranul monitorului ce s-a citit.
Se scrie coninutul lui buf ntr-un fiier numit text.txt.
Se prelucreaz datele din fiierul text.txt schimbnd literele mici n litere
mari.
Se citete din fiier coninutul lui (schimbat) i se pune n buf.
Se afieaz pe monitor coninutul lui buf adic irul de caractere schimbat.
Tem: Construii programul cu cerinele de mai sus mpreun cu diagrama
claselor lui.

Tiberiu Leia: Software Engineering Input-output operations

57

Reading data from command line


Class Console
public final class Console extends Object
implements Flushable
Method Summary
void flush()
Flushes the console and forces any buffered output to be written immediately .
Console format(String fmt, Object... args)
Writes a formatted string to this console's output stream using the specified
format string and arguments.
Console printf(String format, Object... args)
A convenience method to write a formatted string to this console's output stream
using the specified format string and arguments.
Reader reader()
Retrieves the unique Reader object associated with this console.
String readLine()
Reads a single line of text from the console.
String readLine(String fmt, Object... args)
Tiberiu Leia: Software Engineering Input-output operations

58

Provides a formatted prompt, then reads a single line of text from the console.
char[] readPassword()
Reads a password or passphrase from the console with echoing disabled
char[] readPassword(String fmt, Object... args)
Provides a formatted prompt, then reads a password or passphrase from the
console with echoing disabled.
PrintWriter writer()
Retrieves the unique PrintWriter object associated with this console.

Tiberiu Leia: Software Engineering Input-output operations

59

Data Streams
Classes DataInputStream and DataOutputStream
sunt utilizate la crearea unor fluxuri care pot prelucra diferite tipuri de
date primitive.
Clasa DataInputStream implementeaz interfaa DataInput. Se creeaz astfel
un set de metode care permit citirea unor tipuri de date primitive (int, float,
short, etc.) i a unor obiecte (de tip tablou).
Fluxul este creat prin intermediul constructorului:
public DataInputStream(InputStream in)

Tiberiu Leia: Software Engineering Input-output operations

60

Metodele clasei DataInputStream:


public synchronized boolean readBoolean() throws IOException;
public synchronized byte readByte() throws IOException;
public synchronized int readUnsignedByte() throws IOException;
public synchronized short readShort() throws IOException;
public synchronized int readUnsignedShort() throws IOException;
public synchronized int readInt() throws IOException;
public synchronized char readchar() throws IOException;
public synchronized long readLong() throws IOException;
public synchronized float readFloat() throws IOException;
public synchronized double readDouble() throws IOException;
public synchronized String readLine() throws IOException;
public synchronized String readUTF() throws IOExceptio; - citete un ir
Unicode (format cu UTF-8).
Tiberiu Leia: Software Engineering Input-output operations

61

Metodele sunt complementare (cu write(),) pentru clasa


DataOutputStream. Are metode pentru scriere pentru toate tipurile primitive
de date i pentru obiecte de tip tablou.
Metoda de scriere pentru tablou este:
public synchronized void write( byte b[], int off, int len ) throws IOException
care scrie len octei din tabloul de octei specificat ncepnd de la poziia
dat de off.

Tiberiu Leia: Software Engineering Input-output operations

62

Clasele DataInputStream i DataOutputStream pot fi conectate cu fluxuri


pentru fiiere:
DataInputStream in = new DataInputStream(new
FileInputStream(test.dat)));
DataInputStream out = new DataOutputStream(new
FileOutputStream(test.dat)));
Clasa BufferedInputStream
Clasa BufferedInputStream menine un buffer pentru datele de intrare
recepionate. Astfel se elimin necesitatea de-a citi dintr-un flux surs de
fiecare dat cnd este nevoie de un byte.
Clasa BufferedInputStream adaug noi metode pentru utilizarea obiectelor
de tip InputStream prin intermediul unui buffer (tampon). Clasa are doi
constructori:
Tiberiu Leia: Software Engineering Input-output operations

63

public BufferedInputStream(InputStream in)


public BufferedInputStream(InputStream in, int size)
Clasa BufferedInputStream are metodele:
public synchronized int read(byte b[], int off, int len) throws IOException citete o parte dintr-un tablou pe care o depune n tabloul b ncepnd de la
offsetul off (cu lungimea maxim len) - returneaz numrul real de octei
citit sau -1 dac s-a ajuns la sfritul citirii
public synchronized int read() throws IOException - citete urmtorul octet
pe care-l returneaz ca un ntreg (ntre 0 i 255), returneaz octetul citit sau
-1 dac s-a detectat sfritul fluxului - metoda blocheaz firul pn cnd
este disponibil data
public synchronized long skip(long n) throws IOException - sare peste n
octei i returneaz numrul real de octei peste care s-a srit
available(), mark(), markSuppeorted() i reset() - metode motenite din
clasa
InputStream.
Tiberiu Leia: Software Engineering Input-output operations

64

Clasa BufferedOutputStream
Un obiect din aceast clas adaug metode la un obiect din clasa
OutputStream.
Clasa implementeaz un flux de ieire pe buffer. La apelul unei
instruciuni de ieire a unei date, aceasta este scris mai nti ntr-un buffer i
apoi n fluxul de la baza lui.
Dac bufferul se umple se nchide fluxul de ieire pe buffer sau poate fi
golit explicit.
Are doi constructori:
public BufferedOutputStream(OutputStream out) - creeaz un flux de ieire
pentru date cu bufferul avnd dimensiunea de 512 octei
public BufferedOutputStream(OutputStream out, int len) - creeaz un flux
de ieire pentru date cu bufferul avnd dimensiunea de len octei.

Tiberiu Leia: Software Engineering Input-output operations

65

Metode:
public synchronized void flush() throws IOException - golete bufferul
fluxului de ieire fornd octeii s fie scrii n fluxul pe care se bazeaz
public synchronized void write(byte b[], int off, int len) throws IOException
- scrie len octei din tabloul de octei specificat ncepnd de la offsetul off.

Tiberiu Leia: Software Engineering Input-output operations

66

Character Streams
Classes Reader and Writer
Pentru a transfera obiecte de tip String exist clasele Writer i
BufferedWriter:
public abstract class Writer extends Object
este folosit la scrierea de fluxuri de caractere.
O subclas a ei poate implementa metodele write(char[],int,int), flush() i
close().
Are constructorii:
Writer()
Writer(Object) - creeaz un flux de caractere Writer care se sincronizeaz
pe obiectul dat.
Clasa Writer are metodele: close(), flush(), write(char[]),
write(char[],int,int), write(int), write(String), write(String,int,int).
Tiberiu Leia: Software Engineering Input-output operations

67

Correspondences:
InputStream InputStreamReader
OutputStream OutputStreamWriter
FileInputStream FileReader
FileOutputStream FileWriter
StringBufferedInputStream StringReader (exist i StringWriter)
ByteArrayInputStream CharArrayReader
ByteArrayOutputStream CharArrayWriter
PipedInputStream PipedReader
PipedOutputStream PipedWriter

Tiberiu Leia: Software Engineering Input-output operations

68

Exemplu: citire unei linii de caractere de la tastatur se poate utiliza


secvena
BufferedReader bufRead=new BufferedReader(new
InputStreamReader(System.in));
String str=bufRead.readLine();
Se poate modifica modul de scriere pe ecran (System.out.println())
folosind clasa PrintWriter astfel:
PrintWriter out=new PrintWriter(System.out, true);
out.println(Sir de caractere);

Tiberiu Leia: Software Engineering Input-output operations

69

Modifiers
Exist urmtoarele corespondene ntre modificatorii comportamentelor
fluxurilor: FilterInputStream FilterReader
FilterOutputStream FilterWriter
BufferedIntputStream - BufferedReader
BufferedOutputStream BufferedWriter
PrintStream PrintWriter
LineNumberInputStream LineNumberReader
Clasa BufferedWriter definit
public class BufferedWriter extends Writer
scrie un text ca un flux de ieire de caractere. Caracterele sunt puse ntr-un
buffer astfel nct se pot realiza operaii eficiente de scriere a unui singur
caracter, a unui tablou sau a unui string.
Tiberiu Leia: Software Engineering Input-output operations

70

Are constructorii:
BufferedWriter(Writer)
BufferedWriter(Writer,int)
Metodele clasei BufferedWriter sunt similare cu cele ale clasei pe care o
extinde: close(), flush(), newLine() (scrie un separator de linie),
write(char[],int,int), write(int), write(String,int,int).
Clasele Reader i BuffredReader sunt similare cu cele dou de mai sus, dar
cu modificare sensului fluxului i evident schimbarea metodelor write() cu
read().

Tiberiu Leia: Software Engineering Input-output operations

71

Clasa FileWriter are constructorii:


FileWriter(String numeFisier) - construiete un flux pe fiierul cu numele
dat cu suprascriere (dac este cazul)
FileWriter(String numeFisier, boolean append) - idem mai sus cu
adugarea n fiier dac append este true
FileWriter(File numeFisier)
FileWriter(FileDescriptor fd) - idem cu descriptorul precizat.

Tiberiu Leia: Software Engineering Input-output operations

72

ieire

intrare

?BufferedOutputStream ?BufferedInputStream
?FileOutputStream
?FileInputStream
test.dat
new

new

new

writeInt( )
close( )
new

new

new
readInt( )
close( )

Tiberiu Leia: Software Engineering Input-output operations

73

Separarea datelor dup jetoane Scanning and Formating


Scopul utilizrii jetoanelor (engl.: tokens) este ca la citirea unei linii de
intrare s se despart irul de caractere n pri numite simboluri.
Se utilizeaz clasa StringTokenizer din biblioteca java.util.
Aceasta servete la separarea unui ir de caractere n simboluri.
La specificarea unui obiect StringTokenizer se precizeaz irul de
caractere i caracterul special de delimitare a componentelor.
Clasa StringTokenizer
permite unei aplicaii s despart un string n jetoane. Acest mod de lucru
este mai simplu dect cel realizat cu clasa StreamTokenizer. Metodele clasei
StringTokenizer nu fac distincie ntre identificatori, numere i semne de
punctuaie. Nu recunosc i nu pot s sar peste caractere.

Tiberiu Leia: Software Engineering Input-output operations

74

Are constructorii:
StringTokenizer(String str, String delim, boolean returnSimbol)
StringTokenizer(String str, String delim)
StringTokenizer(String str)
unde
str este irul de caractere care trebuie separat
delim este o list cu caractere de delimitare
returnSimbol precizeaz dac se vrea ca delimitatorul s fie returnat ca
simbol.

Tiberiu Leia: Software Engineering Input-output operations

75

Clasa StringTokenizer are metodele:


nextElement() - returneaz urmtoarea valoare ca i nextToken() cu
deosebirea c tipul returnat este Object
nextToken(String) - returneaz urmtorul jeton din string
nextToken() - returneaz urmtorul jeton
countToken() - calculeaz (numr) numrul de jetoane
hasMoreElements() - testeaz dac mai sunt jetoane
hasMoreTokens() - testeaz dac mai sunt elemente disponibile.
Ca exemple de delimitatori sunt: , :. Delimitatori implicii sunt \t,\n,\r.

Tiberiu Leia: Software Engineering Input-output operations

76

Parcurgerea listei cu simboluri se face n modul urmtor:


Se construiete obiectul StringTokenizer.
Se extrage fiecare simbol cu metoda nextToken().
Dac este nevoie s se determine dac mai sunt simboluri, se utilizeaz
metoda hasMoreTokens().

Tiberiu Leia: Software Engineering Input-output operations

77

Exemplu
String str="Exemplu de sir Tokenizer";
StringTokenizer stk=new StringTokenizer(str," ");
//parcurgerea listei de simboluri
while(stk.hasMoreTokens()) {
System.out.println("simbol= " +stk.nextToken());
}
//le poate numara numai pe cele ramase
//numararea simbolurilor din sir
StringTokenizer stk1=
new StringTokenizer(str," ");
System.out.println("Nr.simboluri= "+stk1.countTokens());
stk1.nextToken();
System.out.println("Nr.simboluri= " +stk1.countTokens());
Tiberiu Leia: Software Engineering Input-output operations

78

Clasa StreamTokenizer
extinde clasa Object.
Poate prelua un flux de intrare pe care l transform n jetoane care pot fi
citite (preluate) unul cte unul.
Transformarea este controlat de o tabel i un numr de indicatoare care
pot fi puse n stri diferite artnd dac:
terminatorii de linie pot fi returnai ca jetoane sau tratai ca spaii albe care
separ jetoanele
trebuie recunoscute comentarii n stilul C++ care s fie srite
sunt convertite n litere mici caracterele indicatorilor.
Un obiect StreamTokenizer rupe coninutul unui flux dup jetoane.
Acestea sunt cele mai mici uniti recunoscute de un algoritm pentru
transformarea unui text. Se poate utiliza un astfel de obiect pentru
prelucrarea oricrui fiier text (inclusiv HTML).

Tiberiu Leia: Software Engineering Input-output operations

79

Clasa StreamTokenizer are cmpurile:


nval - dac jetonul curent este un numr acest cmp conine valoarea lui
sval - dac jetonul curent este un cuvnt acest cmp conine un string
reprezentnd caracterele lui
TT_EOF - este o constant care indic citirea sfritului fluxului
TT_EOL - este o constant care indic citirea sfritului unei linii
TT_NUMBER - este o constant care indic citirea unui jeton numr
TT_WORD - este o constant care indic citirea unui jeton cuvnt
ttype - cmpul va conine tipul ultimului jeton citit cu metoda nextToken()

Tiberiu Leia: Software Engineering Input-output operations

80

Constructorii clasei sunt:


StreamTokenizer(InputStream) - este depreciat
StreamTokenizer(Reader) - creeaz o component pentru manevrarea
jetoanelor pentru fluxul de caractere dat.
Metodele clasei StreamTokenizer sunt:
commentChar(int) - precizeaz c argumentele de tip caracter ncep un
comentariu pe o singur linie
eolIsSignificant(boolean) - determin dac sfritul liniilor sunt tratate ca
jetoane
lino() - returneaz numrul liniei curente
lowerCaseMode(boolean) - determin dac jetonul cuvnt este automat pus
cu litere mici
nextToken() - transfer urmtorul jeton din fluxul de intrare
Tiberiu Leia: Software Engineering Input-output operations

81

ordinaryChar(int) - precizeaz dac argumentul caracter din acest jeton


este ordinar
ordinaryChars(int,int) - precizeaz c toate caracterele cuprinse ntre
numerele date de parametrii sunt ordinare
parseNumbers() - precizeaz c numerele trebuie s fie transformate de
acest jeton
pushBack() - precizeaz c urmtorul apel al metodei nextToken()
returneaz valoarea curent n cmpul ttype i nu modific valorile nval i
sval.

Tiberiu Leia: Software Engineering Input-output operations

82

Exemplu: Scrierea i citirea datelor despre starea vremii ntr-un i dintr-un


fiier.
Formatul datelor este:
Mrimea dataZilei valMin valMax valMedie
Temperatura 12/01/2007 1.5 8.5 7.5
Presiunea 12/01/2007 732 748 740

Tiberiu Leia: Software Engineering Input-output operations

83

//Afiseaza date din fisierul cu starea vremii "setVar.dat"


System.out.println("\n Afiseaza starea vremii:");
String numeVariabila;
String data;
float valMin, valMax, valMedie;
try {
String linie;
int nrLinie;
BufferedReader bfr=new BufferedReader(
new FileReader("setVar.dat"));
while((linie=bfr.readLine())!=null)
{
System.out.println("\n");
StringTokenizer stkn=
new StringTokenizer(linie);
numeVariabila=stkn.nextToken();
data=stkn.nextToken();
valMax=Float.valueOf(stkn.nextToken()).floatValue();
valMin=Float.valueOf(stkn.nextToken()).floatValue();
valMedie=Float.valueOf(stkn.nextToken()).floatValue();
//afiseaza datele citite
Tiberiu Leia: Software Engineering Input-output operations

84

System.out.println("variabila: " +numeVariabila);


System.out.println("Data: "+data);
System.out.println("valMax= " +valMax);
System.out.println("valMin= " +valMin);
System.out.println("valMedie= " +valMedie);
}
bfr.close();
}
catch(IOException e){System.out.println(
"Nu poate fi citit fisierul");}
try {System.in.read();}catch (IOException e) {}

Tiberiu Leia: Software Engineering Input-output operations

85

Exemplu: Achiziia datelor despre starea vremii


String marime, data, s=new String();
float valoareMinima, valoareMaxima, valoareMedie;
Float f;
Date date;
//creeaza un format pentru data
SimpleDateFormat format=new
SimpleDateFormat("dd.MM.yyyy-HH:mm");
try {
//deschide un flux pentru a citi linii de la tastatura
BufferedReader br=new BufferedReader(
new InputStreamReader(System.in));
//deschide un flux spre fisierul setVar.dat
//permitand adaugarea datelor
PrintWriter outF=new PrintWriter(
new FileWriter("setVar.dat",true));
System.out.println(
"Intrare: Marime ValoareMinima ValoareMaxima ValoareMedie");
while(true) {
Tiberiu Leia: Software Engineering Input-output operations

86

//citeste o linie de la tastatura


StringTokenizer stk= new
StringTokenizer(br.readLine()," ");
marime=stk.nextToken();//citeste ce marime s-a //tastat
//daca linia este "end" inchide aplicatia
if(marime.equals("end")) {
br.close();
outF.close();
stk=null; break;
}
//extrage jetoanele din linie
f=new Float(stk.nextToken()); //converteste stringul in
float
valoareMinima=f.floatValue();
f=new Float(stk.nextToken());
valoareMaxima=f.floatValue();
f=new Float(stk.nextToken());
valoareMedie=f.floatValue();
date=new Data();
data=format.format(date);
//aplica formatul declarat pentru data
Tiberiu Leia: Software Engineering Input-output operations

87

//Scrie pe monitor ce a citit


System.out.println("\nPreluat:Marime="+marime);
System.out.println("Data: "+data);
System.out.println("ValoareMinima="+valoareMinima);
System.out.println("ValoareMaxima="+valoareMaxima);
System.out.println("ValoareMedie="+valoareMedie);
//scrie in fisierul setVar.dat
outF.println(marime+" "+data+": "
+ valoareMinima+" "+ valoareMaxima+" " + valoareMedie);
}//while
}catch(IOException e){
System.out.println("Eroare de citire");}
System.out.println("\n S-a incheiat culegerea datelor.");
}
}
Datele scrise n fiier vor arta astfel:
Temperatura 04.11.2001-14:12 12.5 23.4
Presiunea 05.11.2001-13:23 760.5 773.4
Tiberiu Leia: Software Engineering Input-output operations

17.6
766.6
88

Tem:
1) S se construiasc o aplicaie care culege ntrebri de la un profesor
mpreun cu rspunsurile lor.
2) S se construiasc o aplicaie care interogheaz un elev cu ntrebrile date
i i evalueaz rspunsurile. La urm i scrie nota pe ecran.

Tiberiu Leia: Software Engineering Input-output operations

89

Object Streams
Serialization and Deserialization
Implementation of lightweight components persistency
Use to store objects or collection of objects on files
to transmit objects or collection of objects through Internet

Tiberiu Leia: Software Engineering Input-output operations

90

Prin serializarea unui obiect se nelege transformarea lui ntr-o secven


de octei care poate fi:
transmis prin reea
stocat ntr-un fiier pe hardisc i
folosit la refacerea obiectului iniial.
Clasa unui obiect serializabil trebuie s conin:
semntura clasei
valorile cmpurilor i tablourilor obiectului
nchiderea oricror altor obiecte referite de ctre obiectele iniiale.
Serializarea obiectelor se face cu ajutorul clasei ObjectOutputStream din
pachetul java.io definit:
public class ObjectOutputStream extends OutputStream implements
ObjectOutput, ObjectStreamConstants
Tiberiu Leia: Software Engineering Input-output operations

91

Obiectele pot fi stocate permanent folosind un fiier. Pentru scrie sau citire
se conecteaz la acel fiier un flux de intrare sau de ieire.
Dac fluxul este unul pentru socluri de reea, obiectele pot fi reconstituite pe
o alt gazd (alt calculator) sau ntr-un alt proces (sau program).

Tiberiu Leia: Software Engineering Input-output operations

92

Clasa ObjectInputStream
Este utilizat pentru deserializarea datelor primitive i a obiectelor scrise
cu o instan a clasei ObjectOutputStream. Ea garanteaz c tipul obiectului
citit se potrivete cu cel care se atepta s fie citit.
Cmpurile declarate transient sau static sunt ignorate de la serializare (i
deci stocare). Citirea unui obiect este similar celei de apelare a unui
constructor (la execuia operatorului new) fr a i se da argumente.
Constructorul clasei creeaz un flux de intrare pe obiecte care citete
dintr-un obiect InputStream.
Clasa ObjectInputStream are metodele: available(), close(),
defaultReadObject(), enableResolveObject(boolean), read(), read(byte[]),
read(byte[],int,int), read(int), readBoolean(), readByte(), readChar(),
readDouble(), readFloat(), readFully(byte[]), readFully(byte[],int,int),
readInt(), readLine(), readLong(), readObject(), readShort(),
readStreamHeader(), readUnsignedByte(), readUnsignedShort(),
Tiberiu Leia: Software Engineering Input-output operations

93

readUTF(), registerValidation(ObjectInputValidation,int),
resolveClass(ObjectStreamClass) i skipBytes(int).

Tiberiu Leia: Software Engineering Input-output operations

94

Clasa ObjectOutputStream
Este utilizat la scrierea tipurilor de date primitive i a obiectelor ntr-un
flux OutputStream. Se poate scrie orice obiect care implementeaz interfaa
Serializable. Constructorul clasei creeaz un flux de ieire pe obiecte care
scrie ntr-un obiect OutputStream.
Are metodele: annotatedClass(), close(), defaultWriteObject(),
enableReplaceObject(boolean), flush(), replaceObject(Object),
reset(),write(byte[]), write(byte[],int,int), write(int), writeBoolean(boolean),
writeByte(int), writeBytes(String), writeChar(int), writeChar(String),
writeDouble(double), writeFloat(float), writeInt(int), writeLong(long),
writeObject(Object), writeShort(short), writeStreamHeader(), i
writeUTF(String).

Tiberiu Leia: Software Engineering Input-output operations

95

Metoda writeObject() este cea care scrie obiectul n flux. Pot fi scrise cu ea
String-uri, tablouri (obiecte simple), date primitive sau obiecte complexe. Ea
este definit astfel:
public final void writeObject(Object obj) throws IOException,
InvalidClassException, NotSerializableException
Citirea obiectelor se face cu:
public final Object readObject() throws OptionalDataException,
ClassNotFoundException, IOException
Clasele care sunt serializate trebuie s implementeze interfaa Serializable
sau Externalizable.
Exempul de implementare a interfeei Serializable este dat n clasa Vector
(definit diferit de cea din pachetul java.util) a programului urmtor.
Tiberiu Leia: Software Engineering Input-output operations

96

Cnd se utilizeaz interfaa Serializable, utilizatorul poate folosi


modificatorul transient pentru a marca atributele care nu trebuie s fie
serializate.
Use: login (user, password) the
<Interface> Serializable
password is not stored.
Private attributes are stored.
<Interface> Externalizable
+
+readExternal()
+writeExternal()

PersistentObjectClass

Externalizable interface
adds() the methods
writeExternal() and
readExternal().

+attribute1
+method1()

Tiberiu Leia: Software Engineering Input-output operations

97

The difference between Serializable and Externalizable:


1) writeExternal() and readExternal() they are automatically called for
object during serialization and deserialization
2) Serializable the object is constructed entirely from its stored bits no
constructor call
Externalizable all normal default construction behavior occurs and
then is called readObject()
Homework: Test the effect of modifiers transient and private.

Tiberiu Leia: Software Engineering Input-output operations

98

Specificaia programului:
Construiete un obiect (obj1) de tip String
Construiete un obiect (obj2) de tip Vector.
Construiete un flux de ieire de tip fiier fisIesire care construiete un
fiier temp.tmp
Construiete un flux de ieire de tip obiect obIesireSerie
Serializeaz obiectul obj1 i-l scrie n fiierul temp.tmp
Serializeaz obiectul obj2 i-l scrie n fiierul temp.tmp
nchide fluxul de ieire obIesireSerie
Construiete un flux de intrare de tip fiier fisIntrare pe fiierul temp.tmp
Construiete un flux de intrare de tip obiect obIntrareSerie
Citete serial primul obiect din fiierul temp.tmp i-l depune n obiectul
obInS1
Afieaz coninutul obiectului obInS1
Tiberiu Leia: Software Engineering Input-output operations

99

Citete serial al doilea obiect din fiierrul temp.tmp i-l depune n obiectul
vctRezultat.
Afieaz coninutul obiectului vctRezultat.
Verific utilizarea obiectului vctRezultat prin apelarea metodelor sale
(scrieVector(), citesteVector())
Afiseaz rezultatele operaiilor asupra obiectului vctRezultat
nchide fluxul de intrare obIntrareSerie.

Tiberiu Leia: Software Engineering Input-output operations

100

Clasa cu obiectul de serializat i deserializat


class Vector implements Serializable{
/*implementeaza interfata Serializable pt. ca obiectul
instantiat sa fie serializabil*/
private int[] tab = new int[3];
public Vector() {
tab[0]=0;
tab[1]=1;
}
public void scrieVector(int i,int j){
tab[i]=j;
}
public int citesteVector(int i) {
return tab[i];
}
}

Tiberiu Leia: Software Engineering Input-output operations

101

/**Testarea serializarii si deserializarii obiectelor */


import java.util.*;
import java.io.*;
public class SerDeser
{
public static void main (String[] args)
{
String obj1="Sir de caractere";//primul obiect
Vector obj2=new Vector();//al doilea obiect
try {
//construieste un flux de iesire pt. fisier
FileOutputStream fisIesire=
new FileOutputStream("temp.tmp");
//construieste un flux de iesire pt. obiecte
ObjectOutputStream obIesireSerie=
new ObjectOutputStream(fisIesire);

Tiberiu Leia: Software Engineering Input-output operations

102

//scrie primul obiect


obIesireSerie.writeObject(obj1);
//afiseaza starea celui de al doilea obiect
System.out.println("Vector initial: tab[0]="+
obj2.citesteVector(0)+" tab[1]="+
obj2.citesteVector(1)+" tab[2]="+obj2.citesteVector(2));
//scrie al doilea obiect serial
obIesireSerie.writeObject(obj2);
obIesireSerie.close();//inchide fisierul de iesire
}
catch(IOException e) {
System.out.println("Eroare la serializare!");
}
System.out.println("S-a terminat serializarea si stocarea");
System.out.println("Sa se inceapa deserializarea si
reconstituirea obiectului?");
Tiberiu Leia: Software Engineering Input-output operations

103

try {System.in.read();}catch(IOException e) {}
try {
//construieste un flux de intrare pt. fisier
FileInputStream fisIntrare=
new FileInputStream("temp.tmp");
//construieste un flux de intrare pt. obiecte
ObjectInputStream obIntrareSerie=
new ObjectInputStream(fisIntrare);
//primul obiect primit din fisier este:
String obInS1=(String)obIntrareSerie.readObject();
System.out.println(obInS1);//scrie primul obiect
//al doilea obiect primit din fisier este:
Vector vctRezultat=(Vector)obIntrareSerie.readObject();
System.out.println("Vector citit serial: tab[0]="+
vctRezultat.citesteVector(0)+
" tab[1]="+vctRezultat.citesteVector(1)+" tab[2]="+
vctRezultat.citesteVector(2));
Tiberiu Leia: Software Engineering Input-output operations

104

//verificare daca se poate lucra cu obiectul citit


vctRezultat.scrieVector(1,5);//scrie ceva in el
int k=vctRezultat.citesteVector(2);//citeste din el
System.out.println("Vector preluat modificat: tab[0]="+
vctRezultat.citesteVector(0)+
" tab[1]="+vctRezultat.citesteVector(1)+
" tab[2]="+vctRezultat.citesteVector(2));
fisIntrare.close();//inchide fisierul de intrare
}
catch(IOException e) {
System.out.println("Eroare la deserializare");
}
catch(ClassNotFoundException e) {
System.out.println("Eroare: n-a gasit clasa!");
}
}
}
Tiberiu Leia: Software Engineering Input-output operations

105

Transferul obiectelor cu referine multiple


I/O of multiple reffered-to objects
Obiecte complexe agregheaz mai multe (alte) obiecte.
Cum se transfer? Se transfer i obiectele agregate?
Se conserv i asocierile dintre obiecte? Dac se transmit dou obiecte
associate, dup transferul lor, ele vor rmne associate (dup restaurare)?
Cnd dou obiecte refer acelai obiect, dup transfer vor referii acelai unic
obiect?

Tiberiu Leia: Software Engineering Input-output operations

106

Aggregation

ClassB

ClassA

+link(ClassD)
+metB()

+link(ClassE)
+metA()
Association by
method

Association by
constructor
ClassC

Association by method

ClassD

ClassE

+metC()

+link(ClassD)
+metE()

+link(CLassE)
+metD()

Association by method

MainClass
+main()

Tiberiu Leia: Software Engineering Input-output operations

ClassF
+metF()

107

public void metX() {


System.out.println("Scrie metX()"+this);
}
public void link(ClassY y){
refY=y;
}
Scrie metB()ClassB@1e0bc08
Scrie metC()ClassC@19dfbff

Tiberiu Leia: Software Engineering Input-output operations

108

Tem: Construii un program care corespunde la diagrama claselor de mai


sus.
Dac metoda main() efectueaz X, este valabil Y?
X: Salveaz ntr-un
fiier un obiect de tip
ClassA

Y: Salveaz i obiectul
agregat de tip ClassB
pe care l agregheaz

Salveaz i obiectele asociate?


Salveaz i asociatele asociatelor?
Salveaz i asociatele asociatelor agregatelor?
Ce condiie trebuie ndeplinit pentru salvarea unui agregat?
Ce condiie trebuie ndeplinit pentru salvarea unui grup de obiecte asociate?
Tiberiu Leia: Software Engineering Input-output operations

109

Aggregate or composition persistency


Serializable <<Interface>>

File

Student
ArrayList
+add(Object)

+1

+name, grupa: String


+toString(): String
+*

ObjectOutputStream
+writeObject(Object)

1
ListaExcursie
+add(Object)

MainClass

ObjectInputStream

+lista, lista1, lista2: ListaExcursie


+st1,st2, st3: Student

+readObject(): Object

+main()

Specification: Build 3 lists with the same students. Verify the list
persistency: Save one on a file and delete it. After that, bring back the
deleted list from the file.
Tiberiu Leia: Software Engineering Input-output operations

110

import java.util.*;
import java.io.*;
public class ListaExcursie extends ArrayList implements Serializable{
String nume;
public ListaExcursie(String numeExcursie) {
super();
nume=numeExcursie;
}
}

Tiberiu Leia: Software Engineering Input-output operations

111

import java.io.*;
public class Student implements Serializable{
String nume;
String grupa;
public Student(String nm, String gr) {
nume=new String(nm);
grupa=new String(gr);
}
public String toString() {
return "Student"+nume+"; grupa"+grupa;
}
}

Tiberiu Leia: Software Engineering Input-output operations

112

//Testarea remanentei obiectelor agregate


import java.io.*;
import java.util.*;
public class MainClass {
public static void main(String[] args) {
ListaExcursie lista=new ListaExcursie("Constanta");
Student st1=new Student("Popa X", "3342");
Student st2=new Student("Pop Y", "3341");
Student st3=new Student("Popescu Z", "3343");
lista.add(st1);
lista.add(st2);
lista.add(st3);
System.out.println("lista: "+lista);
ListaExcursie lista1=new ListaExcursie("Tarnita");
lista1.add(st1);
lista1.add(st3);
System.out.println("lista1: "+lista1);

Tiberiu Leia: Software Engineering Input-output operations

113

try{
ObjectOutputStream os=new ObjectOutputStream(
new FileOutputStream("temp.tmp"));
os.writeObject(lista);
os.close();
lista=null;
st1=null;
System.out.println(st1);
ObjectInputStream is=
new ObjectInputStream(new FileInputStream("temp.tmp"));
ArrayList lista2=(ArrayList) is.readObject();
System.out.println("lista: "+lista);
System.out.println("st1: "+st1);
System.out.println("lista2: "+lista2);
}catch(IOException e) {System.out.println("Eroare la deserializare");}
catch(ClassNotFoundException e) {System.out.println("Eroare: n-a gasit clasa!");
}
}
}
Tiberiu Leia: Software Engineering Input-output operations

114

4. Communication on parallel and serial ports


pachet javax.
Porturi:
paralele
seriale
intrare
ieire
Problem semnalizarea momentului cnd informaia este disponibil.
Cum se semnaleaz aceasta?

Tiberiu Leia: Software Engineering Input-output operations

115

javax.comm
Class ParallelPort
java.lang.Object
javax.comm.CommPort
javax.comm.ParallelPort
public abstract class ParallelPort
extends CommPort
A parallel communications port. ParallelPort describes the low-level interface to a parallel
communications port made available by the underlying system. ParallelPort defines the
minimum required functionality for parallel communications ports.

Tiberiu Leia: Software Engineering Input-output operations

116

Field Summary
static int LPT_MODE_ANY
Picks the best available mode.
static int LPT_MODE_ECP
Enhanced capabilities port.
static int LPT_MODE_EPP
Extended parallel port.
static int LPT_MODE_NIBBLE
Nibble Mode.
static int LPT_MODE_PS2
Byte mode.
static int LPT_MODE_SPP
Compatibility mode.
Fields inherited from class javax.comm.CommPort
name
Constructor Summary
Tiberiu Leia: Software Engineering Input-output operations

117

ParallelPort()

Method Summary
abstract void addEventListener(ParallelPortEventListener lsnr)
Registers a ParallelPortEventListener object for
ParallelPortEvents.
abstract int getMode()
Gets the currently configured mode.
abstract int getOutputBufferFree()
Gets the number of bytes available in the output buffer.
abstract boolean isPaperOut()
Checks if the port is indicating an "Out of Paper" state.
abstract boolean isPrinterBusy()
Checks if the port is indicating a "Printer Busy" state.
abstract boolean isPrinterError()
Checks if the printer has encountered an error.
abstract boolean isPrinterSelected()
Checks if the printer is in selected state.
Tiberiu Leia: Software Engineering Input-output operations

118

boolean isPrinterTimedOut()
Checks if the printer has timed out.
abstract void notifyOnBuffer(boolean notify)
Expresses interest in being notified when the output buffer is
empty.
abstract void notifyOnError(boolean notify)
Expresses interest in being notified of port errors.
abstract void removeEventListener()
Deregisters event listener registered using
addEventListener.
abstract void restart()
Restarts output after an error.
abstract int setMode(int mode)
Sets the printer port mode.
abstract void suspend()
Suspends output.

abstract

Methods inherited from class javax.comm.CommPort


close, disableReceiveFraming, disableReceiveThreshold,
Tiberiu Leia: Software Engineering Input-output operations

119

disableReceiveTimeout, enableReceiveFraming,
enableReceiveThreshold, enableReceiveTimeout, getInputBufferSize,
getInputStream, getName, getOutputBufferSize, getOutputStream,
getReceiveFramingByte, getReceiveThreshold, getReceiveTimeout,
isReceiveFramingEnabled, isReceiveThresholdEnabled,
isReceiveTimeoutEnabled, setInputBufferSize, setOutputBufferSize,
toString

Tiberiu Leia: Software Engineering Input-output operations

120

javax.comm
Class SerialPort
java.lang.Object
javax.comm.CommPort
javax.comm.SerialPort
public abstract class SerialPort
extends CommPort
An RS-232 serial communications port. SerialPort describes the low-level interface to a serial
communications port made available by the underlying system. SerialPort defines the
minimum required functionality for serial communications ports.
Author:
Jagane Sundar
See Also:
CommPort, CommPortIdentifier
Field Summary
static int DATABITS_5
5 data bit format.
Tiberiu Leia: Software Engineering Input-output operations

121

static int DATABITS_6


6 data bit format.
static int DATABITS_7
7 data bit format.
static int DATABITS_8
8 data bit format.
static int FLOWCONTROL_NONE
Flow control off.
static int FLOWCONTROL_RTSCTS_IN
RTS/CTS flow control on input.
static int FLOWCONTROL_RTSCTS_OUT
RTS/CTS flow control on output.
static int FLOWCONTROL_XONXOFF_IN
XON/XOFF flow control on input.
static int FLOWCONTROL_XONXOFF_OUT
XON/XOFF flow control on output.
static int PARITY_EVEN
EVEN parity scheme.
static int PARITY_MARK
Tiberiu Leia: Software Engineering Input-output operations

122

static
static
static
static
static
static

MARK parity scheme.


int PARITY_NONE
No parity bit.
int PARITY_ODD
ODD parity scheme.
int PARITY_SPACE
SPACE parity scheme.
int STOPBITS_1
Number of STOP bits - 1.
int STOPBITS_1_5
Number of STOP bits - 1-1/2.
int STOPBITS_2
Number of STOP bits - 2.

Fields inherited from class javax.comm.CommPort


name
Constructor Summary
SerialPort()
Tiberiu Leia: Software Engineering Input-output operations

123

Method Summary
abstract void addEventListener(SerialPortEventListener lsnr)
Registers a SerialPortEventListener object to listen for
SerialEvents.
abstract int getBaudRate()
Gets the currently configured baud rate.
abstract int getDataBits()
Gets the currently configured number of data bits.
abstract int getFlowControlMode()
Gets the currently configured flow control mode.
abstract int getParity()
Get the currently configured parity setting.
abstract int getStopBits()
Gets the currently defined stop bits.
abstract boolean isCD()
Gets the state of the CD (Carrier Detect) bit in the UART, if
supported by the underlying implementation.
Tiberiu Leia: Software Engineering Input-output operations

124

boolean isCTS()
Gets the state of the CTS (Clear To Send) bit in the UART, if
supported by the underlying implementation.
abstract boolean isDSR()
Gets the state of the DSR (Data Set Ready) bit in the UART, if
supported by the underlying implementation.
abstract boolean isDTR()
Gets the state of the DTR (Data Terminal Ready) bit in the
UART, if supported by the underlying implementation.
abstract boolean isRI()
Gets the state of the RI (Ring Indicator) bit in the UART, if
supported by the underlying implementation.
abstract boolean isRTS()
Gets the state of the RTS (Request To Send) bit in the UART, if
supported by the underlying implementation.
abstract void notifyOnBreakInterrupt(boolean enable)
Expresses interest in receiving notification when there is a break
interrupt on the line.
abstract void notifyOnCarrierDetect(boolean enable)
abstract

Tiberiu Leia: Software Engineering Input-output operations

125

abstract

abstract

abstract

abstract

abstract

abstract

Expresses interest in receiving notification when the CD (Carrier


Detect) bit changes.
void notifyOnCTS(boolean enable)
Expresses interest in receiving notification when the CTS (Clear
To Send) bit changes.
void notifyOnDataAvailable(boolean enable)
Expresses interest in receiving notification when input data is
available.
void notifyOnDSR(boolean enable)
Expresses interest in receiving notification when the DSR (Data
Set Ready) bit changes.
void notifyOnFramingError(boolean enable)
Expresses interest in receiving notification when there is a
framing error.
void notifyOnOutputEmpty(boolean enable)
Expresses interest in receiving notification when the output buffer
is empty.
void notifyOnOverrunError(boolean enable)
Expresses interest in receiving notification when there is an

Tiberiu Leia: Software Engineering Input-output operations

126

abstract

abstract

abstract

abstract
abstract

abstract

overrun error.
void notifyOnParityError(boolean enable)
Expresses interest in receiving notification when there is a parity
error.
void notifyOnRingIndicator(boolean enable)
Expresses interest in receiving notification when the RI (Ring
Indicator) bit changes.
void removeEventListener()
Deregisters event listener registered using
addEventListener.
void sendBreak(int millis)
Sends a break of millis milliseconds duration.
void setDTR(boolean dtr)
Sets or clears the DTR (Data Terminal Ready) bit in the UART, if
supported by the underlying implementation.
void setFlowControlMode(int flowcontrol)
Sets the flow control mode.
void setRcvFifoTrigger(int trigger)
Deprecated. This was advisory only.

Tiberiu Leia: Software Engineering Input-output operations

127

abstract

abstract

void setRTS(boolean rts)


Sets or clears the RTS (Request To Send) bit in the UART, if
supported by the underlying implementation.
void setSerialPortParams(int baudrate, int dataBits,
int stopBits, int parity)
Sets serial port parameters.

Methods inherited from class javax.comm.CommPort


close, disableReceiveFraming, disableReceiveThreshold,
disableReceiveTimeout, enableReceiveFraming,
enableReceiveThreshold, enableReceiveTimeout, getInputBufferSize,
getInputStream, getName, getOutputBufferSize, getOutputStream,
getReceiveFramingByte, getReceiveThreshold, getReceiveTimeout,
isReceiveFramingEnabled, isReceiveThresholdEnabled,
isReceiveTimeoutEnabled, setInputBufferSize, setOutputBufferSize,
toString

Tiberiu Leia: Software Engineering Input-output operations

128

javax.comm
Class ParallelPortEvent
java.lang.Object
java.util.EventObject
javax.comm.ParallelPortEvent
All Implemented Interfaces:
java.io.Serializable
public class ParallelPortEvent
extends java.util.EventObject
A parallel port event.

Tiberiu Leia: Software Engineering Input-output operations

129

Field Summary
int eventType
Deprecated. Replaced by getEventType method.
static int PAR_EV_BUFFER
The port's output buffer is empty.
static int PAR_EV_ERROR
An error occurred on the port.
Fields inherited from class java.util.EventObject
source
Constructor Summary
ParallelPortEvent(ParallelPort srcport,
int eventtype, boolean oldvalue, boolean newvalue)
Tiberiu Leia: Software Engineering Input-output operations

130

Constructs a ParallelPortEvent with the specified parallel port,


event type, old and new values.
Method Summary
int getEventType()
Gets the type of this event.
boolean getNewValue()
Gets the new value of the state change that caused the
ParallelPortEvent to be propagated.
boolean getOldValue()
Gets the old value of the state change that caused the
ParallelPortEvent to be propagated.
Methods inherited from class java.util.EventObject
getSource, toString
Tiberiu Leia: Software Engineering Input-output operations

131

javax.comm
Class SerialPortEvent
java.lang.Object
java.util.EventObject
javax.comm.SerialPortEvent
All Implemented Interfaces:
java.io.Serializable
public class SerialPortEvent
extends java.util.EventObject
A serial port event.
Author:
Jagane Sundar
See Also:
SerialPort, SerialPortEventListener, EventObject, Serialized Form
Field Summary
static int BI
Break interrupt.
Tiberiu Leia: Software Engineering Input-output operations

132

static int CD
Carrier detect.
static int CTS
static
static

static
static
static
static
static

Clear to send.
int DATA_AVAILABLE
Data available at the serial port.
int DSR
Data set ready.
int eventType
Deprecated. Replaced by getEventType method.
int FE
Framing error.
int OE
Overrun error.
int OUTPUT_BUFFER_EMPTY
Output buffer is empty.
int PE
Parity error.
int RI

Tiberiu Leia: Software Engineering Input-output operations

133

Ring indicator.
Fields inherited from class java.util.EventObject
source
Constructor Summary
SerialPortEvent(SerialPort srcport, int eventtype,
boolean oldvalue, boolean newvalue)
Constructs a SerialPortEvent with the specified serial port, event type, old and new
values.
Method Summary
int getEventType()
Gets the type of this event.
boolean getNewValue()
Gets the new value of the state change that caused the SerialPortEvent to
be propagated.
boolean getOldValue()
Gets the old value of the state change that caused the SerialPortEvent to
Tiberiu Leia: Software Engineering Input-output operations

134

be propagated.
Methods inherited from class java.util.EventObject
getSource, toString

Tiberiu Leia: Software Engineering Input-output operations

135

5. Native Methods (Metode native)


Lansarea unui program scris n alt cod (C,C++ etc.) din Java
Metodele native se utilizeaz din urmtoarele motive:
Biblioteca Java nu are trsturile necesare n aplicaie cum ar fi cele care
sunt dependente de platform.
Exist o aplicaie sau o bibliotec scris n alte limbaje i acestea trebuie s
fie utilizate din programe scrise n Java.
Exist o secven de activiti critic din punctul de vedere al timpului,
aceasta se scrie n limbaj de asamblare pentru a reduce la minim durata de
execuie, iar aplicaiile Java apeleaz funciile incluse.

Tiberiu Leia: Software Engineering Input-output operations

136

Lansarea n execuie a programelor din fiiere executabile sau


compilate
n acest scop se poate utiliza clasa Runtime din pachetul java.lang. Aceasta
are metodele:
public Process exec(String command) throws IOException - returneaz
un obiect Process pentru gestionarea subprocesului i execut comanda
specificat de command. Comanda este executat ntr-un proces separat.
public Process exec(String command, String envp[]) throws IOException
- idem, cu envp[] reprezentnd un tablou coninnd mediul sub forma
nume=valoare
public Process exec(String comdarray[]) throws IOException - idem, cu
precizarea unui tablou de comenzi
public Process exec(String comdarray[], String envp[]) throws
IOException - idem, cu precizarea unor tablouri pentru comenzi i
parametrii
Tiberiu Leia: Software Engineering Input-output operations

137

public void synchronized load(String filename) - ncarc fiierul specificat


ca o bibliotec dinamic. Argumentul filename trebuie s fie un nume
complet de cale. Poate s apar o excepie de securitate.
public void synchronized loadlibrary(String filename) - ncarc o bibliotec
dinamic cu numele specificat. Dac exist un gestionar de securitate este
apelat metoda acestuia checkLink cu numele fiierului dat ca argument.
Poate s apar o excepie de securitate.
public static Runtime getRuntime() - returneaz obiectul Runtime asociat
cu aplicaia curent.
public native long freeMemory() - returneaz o aproximarea numrului de
octei disponibil n memorie pentru alocarea viitoare a obiectelor
public native long totalMemory() - returneaz numrul de octei disponibili
(rezervat n total) n memorie pentru alocarea obiectelor.

Tiberiu Leia: Software Engineering Input-output operations

138

Pentru ncrcarea unei biblioteci sau pentru lansarea n execuie a unui


program dintr-un fiier executabil se pot utiliza instruciunile:
Runtime.getRuntime().load("/home/lib/numeBib.dll");
Runtime.getRuntime().exec("NumeProg.exe");
Dezavantajul lansrii altor programe n acest mod este c nu deschide cte
o fereastr de consol pentru fiecare program nou lansat n execuie. Prin
urmare, aceste programe trebuie s afieze rezultatele n ferestre grafice pe
care le creeaz ele.
Ex.: Program care lanseaz n execuie alte dou programe:
unul executabil numit Forme.exe i
altul doar compilat numit Numarator (fiier cu extensia class).

Tiberiu Leia: Software Engineering Input-output operations

139

/**Program de test pentru lansarea in executie a unui fisier exe*/


public class ApelFisExec
{
public static void main (String[] args)
{
try {
Runtime.getRuntime().exec("Forme.exe");
Runtime.getRuntime().exec("c:\\jdk1.3\\bin\\java Numarator");
}
catch(Exception e) {
System.out.println(
"Exceptie nu are fisierul "+e);
}
System.out.println("Firul principal" +
Thread.currentThread().getName());
System.out.println("Memoria totala= " +
Runtime.getRuntime().totalMemory());
System.out.println("Memoria libera= " +
Runtime.getRuntime().freeMemory());
}
}
Tiberiu Leia: Software Engineering Input-output operations

140

Realizarea metodelor native


Java Native Interface (cu acronimul JNI).
Aceasta este parte component a JDK i se garanteaz c programele sunt
portabile pe orice platform.
JNI servete ca un liant ntre programele scrise n Java i aplicaiile
native.
Cadrul JNI permite metodelor native s utilizeze obiectele Java n acelai
mod n care acestea sunt utilizate de metodele Java.
Metodele native pot apela i ele metode Java transferndu-le parametri i
obinnd rezultatele returnate.
Invocation API permite nglobarea metodelor native n JVM.
Utiliznd metode speciale JNI, metodele native pot ncrca clase Java la
care s le utilizeze metodele sau de la care pot obine informaii de clas.
Se pot arunca i prinde excepii din metodele native.
Tiberiu Leia: Software Engineering Input-output operations

141

Nu este recomandat s se utilizeze metode native n applet-uri deoarece unele


browser-e nu accept apelarea lor.
Deoarece metodele native sunt compilate ntr-o variant dependent de
platform, aceasta trebuie luat n considerare cnd se urmrete portabilitatea
aplicaiilor.
Modul de realizare a metodelor native este urmtorul:
1. Se scrie codul surs Java (Nume.java).
2. Se compileaz codul surs Java rezultnd fiierul cu extensia class
(Nume.class).
3. Se utilizeaz javah -jni Nume.class pentru generarea fiierului antet (header
file) rezultnd fiierul Nume.h.
4. Se scriu implementrile metodelor native (adugnd fiierele de care este
nevoie ca jni.h, stdio.h etc.) obinndu-se fiierul NumeImpl.c.
5. Se compileaz codul nativ rezultnd fiierul biblioteca.dll sau biblioteca.so.
6. Se execut programul Java folosind interpretorul java utiliznd fiierul
Nume.class.
Tiberiu Leia: Software Engineering Input-output operations

142

Apelarea metodelor native


Pentru ca o metod nativ s poat fi apelat dintr-un program Java, ea
trebuie declarat ca i oricare alt metod ntr-o clas. Clasa respectiv
conine doar semntura, implementarea metodei native fiind dat n alt fiier.
Declararea metodelor native se face ca n exemplele urmtoare:
public native void metodaNativa1();
public native int metodaNativa2(int x, int y);
Prima metod nu are parametrii i nu returneaz nimic. Cea de a doua are
parametri de tip int i returneaz o valoare de tip int.

Tiberiu Leia: Software Engineering Input-output operations

143

Deoarece implementarea metodelor native trebuie s fie coninute n


biblioteci, acestea trebuie s fie ncrcate precum n exemplul de mai jos:
static {
System.loadLibrary("biblioteca");
}
Clasa care urmeaz s apeleze metoda nativ trebuie s implementeze un
obiect de tipul celei care a declarat metoda nativ. De exemplu, dac clasa
care a declarat metoda nativ este NumeClasa, metoda main a clasei
principale va conine secvena urmtoare:
public static void main(String[] args) {
.....................
new NumeClasa().metodaNativa1();
....................
}
Tiberiu Leia: Software Engineering Input-output operations

144

Dac metodele native sunt utilizate n aplicaii multifir i acceseaz


variabile globale (n seciuni critice) pentru a nu duce la stri inconsistente
trebuie s fie declarate synchronized.
Toate funciile din Java sunt metode ale unor obiecte sau clase. Se poate
construi o clase care au att declaraii de metode native ct i implementri
ale unor metode Java.
Se poate compila codul Java ca la orice alt program cu javac cu o
comand ca n exemplul de mai jos:
javac ClasaPrincipala.java
Ca urmare a acesteia s-a creat fiierul ClasaPrincipla.class, mpreun cu
celelalte clase dac exist aa ceva. Cu aceasta, partea referitoare la Java este
ncheiat.
Tiberiu Leia: Software Engineering Input-output operations

145

Crearea fiierului antet


Un program Java nu poate apela direct o metod nativ.
El are nevoie de un liant cu aceste metode native.
Liantul const din fiiere antet creat cu utilitarul javah din JDK.
Exemplu de utilizare este urmtoarea comand:
javah ClasaPrincipala -jni ClasaPrincipala
Folosind opiunea d a utilitarului javah se poate pune fiierele rezultate i n
alt director care este specificat.
javah genereaz fiierul antet C i fiiere surs care sunt necesare pentru
implementarea metodelor native. Acestea sunt utilizate de programele C
pentru a referi variabilele de instan ale unui obiect din codul surs nativ.
Fiierul .h conine definiia unei structuri c crei aranjare este paralel cu cea
a clasei corespunztoare. Cmpurile ei corespund variabilelor de instan din
clas.
Tiberiu Leia: Software Engineering Input-output operations

146

Se creeaz cte un fiier antret pentru fiecare fiier .class. Metodele apar n
fiierul ClasaPrincipala.h n urmtoarea form:
JNIExport modificator JNICALL
Java_ClasaPrincipala_metodaNativa1(JNIEnv *, jobject);
Aceasta are doi parametrii chiar dac nu a fost declarat n metod nici unul.
Primul este un pointer (indicator) de interfa JNIEnv. Prin aceasta codul
nativ acceseaz parametrii i obiectele transferate din aplicaia Java. Al
doilea parametru este jobject care se refer tocmai la obiectul curent. Este
echivalent cu this din Java. Pentru o metod de instan nativ, argumentul
jobject este o referin la obiectul curent. Pentru o metod de clas nativ,
argumentul va referi clasa Java a metodei.

Tiberiu Leia: Software Engineering Input-output operations

147

Crearea metodelor native


Trebuie s se creeze un fiier cu un nume care conine numele clasei cu
metode native la care se adaug Imp i extensia c.
Exemplu, pentru cazul anterior acesta este ClasaPrincipalaImp.c.
Fiierul de mai sus conine urmtoarele:
precizarea c include fiierul jni.h care informeaz despre codul limbajului
nativ care necesit interaciunea cu sistemul de execuie Java,
ClasaPrincipala.h care specific fiierul antet i alte fiiere care conin
funciile apelate n implementare, de exemplu stdio.h dac se utilizeaz
funcia printf()
implementarea funciilor native.

Tiberiu Leia: Software Engineering Input-output operations

148

Exemplu:
#include <jni.h>
#include "ClasaPrincipala.h"
#include <stdio.h>
JNIExport void JNICALL Java_ClasaPrincipala_metodaNativa1(JNIEnv *,
jobject obj) {
printf("Mesaj scris de metoda nativa! \n");
}
.................

Tiberiu Leia: Software Engineering Input-output operations

149

Transmiterea argumentelor unei metode native dintr-o aplicaie Java


difer de cel n care se face pentru o metod Java. Astfel tipul int devine jint.
Tip Java
boolean
byte
char
short
int
long
float
double
void

Tip nativ
jboolean
jbyte
jchar
jshort
jint
jlong
jfloat
jdouble
void

Tiberiu Leia: Software Engineering Input-output operations

Lungime n bii
8, fr semn
8
16, fr semn
16
32
64
32
64
n/a

150

Obiectele Java dac sunt date ca argumente, ele sunt transmise prin
referine.
Toate referinele obiectelor Java au tipul jobject.
Se pot crea obiecte Java n metode native i returnate ca rezultate
apelatorului.
Dup implementarea metodelor native, trebuie s se construiasc
biblioteca dinamic ce este ncrcat de ctre clasa care declar metodele
native.

Tiberiu Leia: Software Engineering Input-output operations

151

Aplicaie cu metode native


Se consider o clas numit ClCuNative care are trei metode native: add,
mult i comp.
Ea mai are ca metode Java set i get.
Clasa principala ClPrinc o instaniaz i apeleaz metodele native pentru
efectuarea unor calcule.
/** Clasa care are definite metode native pentru
* adunare - add(int x,int y)
* inmultire - mult(int x, int y)
* comparare - comp(int x,int y) */
public class ClCuNative {
private int xVal, yVal;
public ClCuNative(int x,int y) {
xVal=x;
yVal=y;
}
Tiberiu Leia: Software Engineering Input-output operations

152

static {
System.loadLibrary("aritmetica");
}
//declara metodele native
public native int add(int x,int y);
public native int mult(int x,int y);
public native int comp(int x,int y);
//declara si implementeaza metode Java
public void set(int x, int y) {
xVal=x;
yVal=y;
}
public int get(int i) {
if (i==1) return xVal;
else return yVal;
}
}

Tiberiu Leia: Software Engineering Input-output operations

153

/** Clasa care instantiaza o alta clasa ce are metode native pe


care
* le apeleaza */
public class ClPrinc {
static int xv,yv;
public static void main (String[] args) {
ClCuNative obCuNative=new ClCuNative(2,3);
int z=obCuNative.add(3,2);
System.out.println("Rezultat adunare="+z);
xv =obCuNative.get(1);
yv=obCuNative.get(2);
System.out.println("x="+xv+"; y="+yv);
z=obCuNative.mult(xv,yv);
System.out.println("Rezultat inmultire ="+z);
obCuNative.set(10,2);
z=obCuNative.comp(obCuNative.get(1),xv);
System.out.println("Rezultat comparare:cel mai mare este" +
z);
}
}
Tiberiu Leia: Software Engineering Input-output operations

154

/* DO NOT EDIT THIS FILE - it is machine generated */


#include <jni.h>
/* Header for class ClCuNative */
#ifndef _Included_ClCuNative
#define _Included_ClCuNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:
ClCuNative
* Method:
add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_ClCuNative_add
(JNIEnv *, jobject, jint, jint);
/*
* Class:
ClCuNative
* Method:
comp
* Signature: (II)I
Tiberiu Leia: Software Engineering Input-output operations

155

*/
JNIEXPORT jint JNICALL Java_ClCuNative_comp
(JNIEnv *, jobject, jint, jint);
/*
* Class:
ClCuNative
* Method:
mult
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_ClCuNative_mult
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif

Tiberiu Leia: Software Engineering Input-output operations

156

/* Implementarea metodelor native add, mult si comp in C */


#include <jni.h>
#include "ClCuNative.h"
#include <stdio.h>
JNIEXPORT jint JNICALL
Java_ClCuNative_add(JNIEnv *env, jobject obj, jint x, jint y)
{
printf("S-a accesat in C metoda add(");
printf("%d",x);
printf(",");
printf("%d",y);
printf(")");
printf("\n");
return(x+y);
}
JNIEXPORT jint JNICALL
Java_ClCuNative_mult(JNIEnv *env, jobject obj, jint x, jint y)
Tiberiu Leia: Software Engineering Input-output operations

157

{
printf("S-a accesat in C metoda mult(");
printf("%d",x);
printf(",");
printf("%d",y);
printf(")");
printf("\n");
return(x*y);
}
JNIEXPORT jint JNICALL
Java_ClCuNative_comp(JNIEnv *env, jobject obj, jint x, jint y)
{
printf("S-a accesat in C metoda comp(");
printf("%d",x);
printf(",");
printf("%d",y);
printf(")");
printf("\n");
if(x<=y) return y;
if(x>y) return x;
}
Tiberiu Leia: Software Engineering Input-output operations

158

Au mai rmas ca posibilitti pentru intrri i ieiri de


informaii Interfee grafice (GUI)

Tiberiu Leia: Software Engineering Input-output operations

159

*
****
*********
****
*

Tiberiu Leia: Software Engineering Input-output operations

160

You might also like