මේ වනවිට අපි ඉතා වැදගත් stream වර්ග කිහිපයක් ගැන කතාකලා. byte stream, character stream, buffered stream එම stream පිලිබඳ ඔබට මේ වනවිට හොඳ අවබෝධයක් ඇති බව උපකල්පනය කරමින් අපි මෙම පාඩමෙන් සාකච්ඡා කිරීමට යන්නේ data streams පිලිබඳවයි.
Data stream බාවිතයෙන් stream එකකට primitive data ලිවීමට සහ data stream එකකින් primitive data කියවීමට පුලුවන්. එනම් int, float, double, long, boolean, char, byte මෙන්ම primitive data type එකක් නොවුවද String සඳහා data streams සහය දක්වනවා.
DataInputStream සහ DataOutputStream නම් class වර්ග 2 යොදාගෙන data streams නිරූපණය කෙරෙනවා. එවන් stream එකකින් දත්ත කියවීමට DataInputStream ද ඒවාට ලිවීමට DataOutputStream class එකද යොදාගැනෙනවා. හොඳින් මතක තබාගත යුතු කාරණාවක් තමයි සෑම විටම data stream object එකක් construct කල යුත්තේ byte stream එකක් wrap කිරීමෙන් බව.
DataInputStream භාවිතාකරන අන්දම...
මෙහිදී readInt(), readLong(), readUTF()... යනාදී වශයෙන් primitive data කියවීමට වැදගත් methods ගණනාවක් යොදාගන්න පුලුවන්. Java Documentation එක බැලිමෙන් මෙම methods සවිස්තරාත්මකව දැනගැනීමට පුලුවන්.
කලින් අධ්යයනය කල stream වලදී මෙන් නොව data stream වලදී File එකේ අවසානය (EOF) හඳුනාගැනීමට සෘජු ක්රමයක් නැහැ. එම නිසා EOFException එක catch කිරීමෙන් file එකක අවසානය හඳුනාගතයුතු වනවා.
DataOutputStream භාවිතාකරන අන්දම...
මෙහිදී writeInt(), writeLong(), writeUTF()... යනාදී වශ්යෙන් primitive data ලිවීමට වැදගත් වන methods ගනණාවක් තිබෙනවා. මීට පෙර stream වලට පොදුවූ flush(), close() යනාදී methods ද මෙම data stream විසින් inherit කරගෙන සිටිනවා.
අපි දැන් බලමු data stream එකක ක්රියාකාරීත්වය වටහාගැනීමට පහසුවන අන්දමේ සරල ජාවා වැඩසටහනක්.
/**
*class : Test
*Author : Kanishka Dilshan
*Purpose: Demonstrate how to use data streams
*Blog : http://javaxclass.blogspot.com
*/
import java.io.*;
class Test {
public static void main(String args[]){
try{
DataOutputStream dout=new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream("myDataFile.dat")));
dout.writeUTF("Kanishka");
dout.writeFloat(83.23f);
dout.writeBoolean(true);
dout.writeUTF("Ravindu");
dout.writeFloat(98.12f);
dout.writeBoolean(false);
dout.writeUTF("Madhawa");
dout.writeFloat(84.65f);
dout.writeBoolean(false);
dout.close();
DataInputStream din=new DataInputStream(
new BufferedInputStream(
new FileInputStream("myDatafile.dat")));
try{
while(true){
String name=din.readUTF();
float marks=din.readFloat();
boolean val=din.readBoolean();
System.out.println(name+" "+marks+" "+val);
}
}catch(EOFException e){
System.out.println("End of the data file");
}finally{
try{
}catch(Exception e){
din.close();
}
}
}catch(Exception e){
System.err.println(e.getMessage());
}
}
}
Output :
ඉහත code එක මගින් සිදුවන ක්රියාවලිය වටහා ගැනීමට උත්සාහ කරමු. Line 13,14,15 මගින් සුදුසු byte stream එකක් output data stream එකක් මගින් wrap කිරීම සිදුකර ඇත.
Line 17,18,19 මෙහිදී කිසියම් පිලිවෙලකට අනුව data stream එකට දත්ත ලිවීම සිදුකර ඇත. එනම් මුලින් String data ද දෙවනුව float data ද අවසන boolean data ද stream එකට එනම් myDataFile.dat file එකට ලියා ඇත.
Line 31,31,33 මෙහිදී byte stream එකක් input data stream එකක් මගින් wrap කිරීම සිදුකර ඇත. මෙහිදී සාදාගන්නා din object එක හරහා data කියවීම සිදුකෙරේ.
Line 34 - Line 48 මෙහිදී අදාල data file එක අවසන් වනතෙක් කියවීම සිදුකර එම දත්ත console එකෙහි දර්ශනය කරයි. line 35 න් ආරම්භ වන while loop එක infinite loop එකක් ලෙස පෙනුනද file එකේ අවසානයේ EOFException එකක් throw කරන නිසා file එක අවසානය වනතෙක් පමණක් loop එක ක්රියාත්මක වේ.
Streaming වල තවත් වැදගත් කොටසක් වන Standard streams පිලිබඳ අපි මීලඟ පාඩමෙන් සාකච්ඡා කරමු.