You are on page 1of 25

Јава – Токови података

Циљеви

• Дефиниција тока података


• Разлике између токова података који раде на
нивоу бајтове и карактере
• Коришћење токова који раде на нивоу батова
InputStream и OutputStream
• Коришћење токова који раде са карактерима
Reader и Writer класе
• Приступ датотеци
• Серијализација објекта
• Коришћење серијализованих објеката
• Коришћење XML објеката

2/25
Шта су токови података

Ток података представља пут података


од изворишта до одредишта

3/25
InputStream, OutputStream,
Reader и Writer

4/25
Конверзија токова

• InputStreamReader конвертује улазни бајтовски ток у


ток карактера

• InputStreamReader isr = new InputStreamReader(System.in);

• OutputStreamWriter конвертује излазни ток


карактера у бајтовски ток

• OutputStreamWriter osw = new OutputStreamWriter(System.out);

5/25
Омотачи токова

• Поступак обмотавања токова податак

6/25
Пример

import java.io.*;
Public class StreamExample{
public static void main(String[] args){
InputStream is = System.in;
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
try{
String s;
while((s = br.readLine()) != null){
System.out.println(s);
}
br.close();
}
catch(IOException e){
System.out.println("main(): " + e);
}
}
}

7/25
Улазно-излазни токови податак

8/25
Рад са датотекама

• Класе FileReader и FileWriter се користе за


читање и упис података

9/25
Рад са датотекама

public class StreamExample {


public static void main(String[] args) {
FileReader fr = null;
BufferedReader br = null;
FileWriter fw = null;
PrintWriter pw = null;
try {
fr = new FileReader("input.txt");
fw = new FileWriter("output.txt");
br = new BufferedReader(fr);
pw = new PrintWriter(fw);
String s;
while((s = br.readLine()) != null){
pw.write(s);
pw.flush();
}
}

10/25
Рад са датотекама

catch(IOException e1){System.out.println("main(): " + e1);}


finally {
try {
if (br != null) br.close();
if (pw != null) pw.close();
} catch (IOException e2) {}
}
}
}

11/25
Серијализација објекта

• Серијализација објекта представља стандардни


начин за чување објекта који могу да се користе
на разним системима.
• Приликом серијализације се чува:
• Тип објекта
• Унутрашње информације
• Референце на друге објекте

12/25
Серијализација објекта

13/25
Серијализација објекта

• Када се променљива инстанце декларише као


transient, њена вредност не мора да се очува
при снимању објекта.

• На пример:
public class T implements Serializable {
transient int a; // neće se očuvati
int b; // očuvaće se
}

14/25
Серијализација објекта

• Сва поља која нису


статичка или обележена
модификатором transient
се серијализују
• Поступак серијализације
укључује и поља супер
класе
• Чува се комплетан граф
објекта, уз елиминацију
петљи, чувањем
референци унутар класе
ObjectStream

15/25
Интерфејс Externalizable

• Интерфејс Externalizable је под интерфејс


интерфејса Serializable
interface Externalizable extends Serializable {}
• Класа која имплементира мора да има:
public void readExternal (ObjectInput stream)throws
IOException {}
public void writeExternal (ObjectOutput stream)throws
IOException {}
• Овај поступак прилагођава начин смештања
поља у ток података

16/25
Упис објекта у бинарну датотеку

import java.io.*;
public class TestKreirajBin {
public static void main(String[] args) {
ObjectOutputStream oos = null;
try {
Racun racun1 = new Racun(0, "Pera Peric", 200);
Racun racun2 = new Racun(1, "Mika Mikic", 300);
FileOutputStream fos = null;
fos = new FileOutputStream("SerializedObj.ser");
oos = new ObjectOutputStream(fos);
oos.writeObject(racun1);
oos.writeObject(racun2);
} catch (Exception e) {e.printStackTrace();}
finally {
try {if (oos != null) oos.close();
} catch (Exception e) { }
}
}
}

17/25
Читање објекта из бинарне датотеке

import java.io.*;

public class TestUcitajBin {


public static void main(String[] args) {
try {
FileInputStream fis = null;
ObjectInputStream ois = null;
fis = new FileInputStream("SerializedObj.ser");
ois = new ObjectInputStream(fis);
Racun racun1 = (Racun) ois.readObject();
Racun racun2 = (Racun) ois.readObject();
ois.close();
System.out.println("Racun 1: " + racun1);
System.out.println("Racun 2: " + racun2);
} catch (Exception e) {
e.printStackTrace();
}
}
}

18/25
XML кодирање објекта

• Серијализација објеката коришћењем класе


ObjectOutputStream и коришћење бинарних
датотека за њихово чување представљају једа
вид чувања објеката.
• Рад са класом XMLEncoder представља
алтернативу овом приступу
• Класа XMLEncoder се користи за генерисање
текстуалне репрезентације објеката типа
JavaBean у XML формату

19/25
XML кодирање објекта

20/25
XML кодирање објекта

• Класа XMLEncoder пружа јединствено


означавање за JavaBeans које је у складу са XML
1.0 спецификацијом уз коришћење UTF-8 сета
карактера за Unicode/ISO 10646 сет
• XML документи које креира XMLEncoder су:
– Преносиви и независтан од верзије
– Структурно компактни
– Отпорани на грешке

21/25
XML кодирање објекта

• Креирање XML документа заснованог на објекту


типа JavaBean:
XMLEncoder e = new XMLEncoder(
new BufferedOutputStream(
new FileOutputStream(fileName)));
e.writeObject(someObject);
e.close();

22/25
XML кодирање објекта

• Креирање JavaBean објекта заснованог на


XML документу:
XMLDecoder d = new XMLDecoder(
new BufferedInputStream(
new FileInputStream(fileName)));
Object result = d.readObject();
d.close();

23/25
Упис објекта у XML датотеку

import java.beans.*;
import java.io.*;
public class TestKreirajXML {
public static void main(String[] args) {
ObjectOutputStream oos = null;
try {
Racun racun1= new Racun(0, “Pera Peric”, 200);
Racun racun2= new Racun(1, “Mika Mikic”, 300);
FileOutputStream fos = new FileOutputStream("SerializedObj.xml");
BufferedOutputStream bos = new BufferedOutputStream(fos);
coder = new XMLEncoder(bos);
coder.writeObject(racun1);
coder.writeObject(racun2);
} catch(Exception e) {System.out.println(e);}
finally {oos.close();}
}
}

24/25
Читање објекта из XML датотеке

import java.beans.*;
import java.io.*;
public class TestUcitajXML {
public static void main(String[] args) {
try {
FileInputStream fis
= new FileInputStream("SerializedObj.xml");
BufferedInputStream bis
= new BufferedInputStream(fis);
XMLDecoder decoder = new XMLDecoder(bis);
Racun racun1 = (Racun) decoder.readObject();
Racun racun2 = (Racun) decoder.readObject();
decoder.close();
System.out.println("Racun 1: " + racun1);
System.out.println("Racun 2: " + racun2);
} catch (Exception e) {System.out.println(e);}
}
}

25/25

You might also like