I/O S TREAMS TOPIK Overview I/O Streams Byte stream & Character Stream Hirarki class pada package java.io Read & write streams ~ ~ ~ InputStream & OutputStream Reader & Writer RandomAccessFile Memfilter M filt stream t Membaca input melalui keyboard S TREAM I/O Semua data di Java dibaca dan ditulis dengan g menggunakan stream. Stream adalah representasi abstrak dari aliran data yang berjalan data yang berjalan dari sumber (input stream) ke (input stream) ke tujuan (output stream). Contoh: ~ ~ ~ Membaca dan menulis file di dan ke harddisk Memcaca dan menulis teks ke console. M b Membaca d menulis dan li melalui l l i network t k I/O S TREAMS Untuk membaca, program membuka stream pada sumber ( file, memory, socket) dan membaca informasi secara sekuensial. Untuk menulis, program mengirim informasi ke tujuan dengan cara membuka stream tujuan, selanjutnya menulis informasi secara sekuensial. S TREAM Byte stream (8 bit) Byte stream (8 bit) digunakan untuk byte, integer, dan simple yp y g data type yang lain. Misal: numerical data, executable programs, dll Character stream (16bit) digunakan untuk data tekstual (teks), mendukung unicode. Misal: text files B YTE S TREAM C HARACTER S TREAM K ARAKTER E NKODING OS menggunakan beberapa tipe skema pengkodingan berbeda dalam menyimpan karakter. Karakter dapat digambarkan dalam 1 byte (0‐255) atau 2 byte (0‐65535) atau dengan skema enkoding ( ) ( ) lainnya. Byte 0 mungkin menggambarkan karakter ‘a’ pada skema enkoding tertentu, tetapi mungkin menggambarkan karakter spasi pada skema enkoding lainnya. Java didesain sebagai bahasa yang tidak bergantung platform, sehingga menggunakan skema enkoding yang dikenal sebagai hi k k k di dik l b i karakter Unicode. Skema ini digunakan Java untuk menangani stream karakter. Masing2 OS memiliki tipe karakter enkoding yang mungkin berbeda. k b b d Contoh, Windows menggunakan ISO 8859‐1 (atau ANSI), dan M i t h Macintosh menggunakan Macintosh Latin‐2. Terdapat lebih dari k M i t h L ti 2 T d t l bih d i 100 set karakter berbeda yang dapat dikenali oleh Java. K ARAKTER E NKODING ( CONT.) T EXT R EPRESENTATION Java menggunakan Ja a e ggu a a 2 macam aca representasi ep ese tas te teks: s ~ Unicode | ~ Untuk merepresentasikan character dan string secara internal UTF | Untuk pertukaran data teks data teks melalui network | UTF = UCS Transformation Format | UCS = Universal Character Set UCS Universal Character Set C ARA MENGGUNAKAN STREAM PROSEDUR PENGGUNAAN BYTE STREAM DAN CHARACTER STREAM SAMA Input stream 1. Membuat obyek yg berasosiasi dg data source. Output stream 1. Mis : FileInputStream 2. Membaca informasi dari stream dg menggunakan method obyek tsb. Mis: read() 3. Bila selesai, panggil method close. Membuat obyek yg berasosiasi dg data destination. Mis : BufferedWriter 2. Menulis informasi ke stream tujuan dg menggunakan method obyek tsb. Mis: write() 3. Bila selesai, panggil method close. T HE JAVA . IO H IERARCHY Package java.io dibuat sedemikian rupa sehingga memudahkan d hk pengguna dalam d l melakukan l k k input i t atau output berbagai tipe data seperti Objects, g y g minimal amount of Strings, dan bytes dengan coding. Juga d didesain desa supaya b bisa sa menerima e e a input dan put da output dari berbagai sumber seperti keyboard, network, dan disk. I NPUT S TREAM AND O UTPUT S TREAM C LASSES Level tertinggi pada hirarki package java.io adalah dua abstract class: InputStream dan OutputStream Keduanya langsung dibuat dengan meng meng‐ extend extend class Object. Class InputStream Class InputStream dan OutputStream mempunyai beberapa method dasar untuk membaca dan menulis bytes. y I NPUT S TREAM DAN O UTPUT S TREAM InputStream dan OutputStream adalah putSt ea da OutputSt ea ada a abstract class untuk stream I/O, yaitu untuk membaca dan menulis data dari dan ke file. dan ke file Untuk membaca digunakan class yang mengimplementasikan InputStream mengimplementasikan InputStream, contoh : FileInputStream. Untuk menulis digunakan class yang Untuk menulis digunakan class yang mengimplementasikan OutputStream, contoh : FileOutputStream. H IRARKI C LASS I NPUT S TREAM DAN O UTPUT S TREAM InputStream FileInputStream ByteArrayInputStream FilterInputStream l DataInputStream BufferedInputStream PushbackInputStream ObjectInputStream PipedInputStream SequenceInputStream OutputStream FileOutputStream ByteArrayOutputStream FilterOutputStream p DataOutputStream BufferedOutputStream PrintStream ObjectOutputStream PipedOutputStream M EMBACA F ILE : F ILE I NPUT S TREAM Untuk membaca file dari disk, diperlukan langkah‐langkah: 1 Definisikan nama file yang akan 1. file yang akan dibaca melalui class File, atau nama file lengkap dengan path. 2. Periksa apakah file tersebut ada (exist) dan tipenya adalah file (bukan direktori). 3. Siapkan obyek FileInputStream untuk membaca isi file. 4 B 4. Baca input dengan i d menggunakan k method read(), h d d() dan d bila tidak ada input lagi, FileInputStream memberikan indikator ‐1 1 sebagai sebagai tanda tidak ada lagi data yang akan data yang akan dibaca. 5. Gunakan method close() untuk menutup FileStream. C ONTOH 1: M EMBACA F ILE Program yang menggunakan class FileInputStream untuk menghitung jumlah bytes yang dibaca dari File. Perhatikan bahwa membaca file dapat menyebabkan Exception, karena itu diperlukan penangkapan sinyal exception bila exception bila terjadi error. C ONTOH 2: M EMBACA F ILE Program yang membaca file dengan gg menggunakan FileInputStream dan menggunakan PrintStream untuk menampilkan data yang telah dibaca dari file. Contoh PrintStream: System.out Gunakan method println() atau print() untuk menampilkan p data. M ENULIS F ILE : F ILE O UTPUT S TREAM Untuk menulis file ke disk, diperlukan langkah‐langkah: 1. Definisikan nama file yang akan diupdate melalui class File, atau nama file lengkap dengan path. 2. Siapkan obyek FileOutputStream untuk menulis isi file. 3. Gunakan method write() dan getBytes() untuk menulis data. ‐ write() menulis array dari byte, maka data yang akan dit li harus ditulis h dit ditransfer f terlebih t l bih dahulu d h l ke k array. ‐ untuk memindah data dari tipe String ke array gunakan method getBytes() method getBytes(). 4. Gunakan method flush() untuk memaksa sistem untuk mentransfer isi buffer di memori ke disk. 5. Gunakan method close() untuk menutup FileStream. C ONTOH Program dengan menggunakan class FileOutputStream untuk menulis File. Perhatikan bahwa menulis file dapat menyebabkan Exception, karena itu diperlukan penangkapan sinyal exception bila terjadi error. R EADER DAN W RITER Digunakan untuk membaca dan menulis data tekstual. tekstual Lebih mudah daripada menggunakan InputStream dan OutputStream. Untuk mempercepat performance, gunakan fasilitas buffering dengan: BufferedReader. g g R EADER Untuk membaca teks baris per baris digunakan teknik sebagai berikut: File f = new File(“c:\\oop\\text.txt”); FileReader fr = new FileReader(f); BufferedReader fin= new BufferedReader(fr); FileReader adalah jalur yang disediakan yang disediakan untuk membaca File. BufferedReader membungkus FileReader agar input agar input tersebut dapat dikelola dengan teknik buffering, yaitu tidak membaca per satu karakter, melainkan menyimpan dalam b ff buffer, setelah t l h penuh h (atau ( t setelah t l h newline terdeteksi), li t d t k i) buffer akan diberikan ke program. H IRARKI C LASS R EADER Reader BufferedReader LineNumberReader CharArrayReader FilterReader PushBackReader InputStreamReader FileReader PipedReader StringReader Writer BufferedWriter CharArrayWriter FilterWriter OutputStreamWriter FileWriter PipedReader S i Wi StringWriter PrintWriter DAN W RITER R EADER Setelah obyek BufferedReader terbentuk, maka Setelah obyek BufferedReader terbentuk, maka String dapat diambil dengan method readLine() yang mengembalikan nilai balik String. Untuk menampilkan data ke layar gunakan print() atau println(). Contoh: membaca file dan menampilkan data ke layar. W RITER Untuk menulis teks baris per baris digunakan teknik sebagai berikut: File f = new File(“c:\\oop\\MyText.txt”); FileWriter fw = new FileWriter(f); PrintWriter fin = new PrintWriter(fw); ( ); Enkapsulasi file menjadi FileWriter diperlukan untuk mendefinisikan jalur output. Pembungkusan dengan PrintWriter diperlukan agar program dapat menggunakan method print() dan println() atas obyek tersebut. Contoh: Menulis file Contoh: Menulis R ANDOM A CCESS F ILE Perbedaan RandomAccessFile(RAF) dengan Perbedaan RandomAccessFile(RAF) dengan FileInputStream dan FileOutputStream adalah sekali RAF dibuat maka bisa dibaca dan sekaligus ditulis. dan sekaligus ditulis RAF bisa dibaca dan ditulis pada titik tertentu d l fil d dalam file dengan menggunakan file pointer. k fil i t file pointer adalah variabel bertipe long yang menyimpan dimana RandomAccessFile akan d d l k dibaca dan ditulis dalam file. R ANDOM A CCESS F ILE RandomAccessFile mengimplementasikan RandomAccessFile mengimplementasikan DataInput dan DataOutput, sehingga RAF mempunyai semua method yang dipunyai oleh DataInput dan DataOutput. D I d D O RAF juga mempunyai methodnya sendiri. S EEKING Methods that support seeking pp g ~ long getFilePointer() throws IOException Returns the current position within the file, in bytes. Subsequent reading and writing will take place Subsequent reading and writing will take place starting at this position. ~ long length() throws IOException Returns the length of the file, in bytes. ~ void seek(long position) throws IOException void seek(long position) throws IOException Sets Sets the current position within the file, in bytes. Subsequent reading and writing will take place starting at this position. Files start at position 0. R ANDOM -A CCESS F ILE M ETHODS FOR P RIMITIVE D ATA T YPES T HE R ANDOM A CCESS F ILE C LASS Constructors: RandomAccessFile(String file, String mode) RandomAccessFile(File String R d A Fil (Fil file, fil St i mode) Open file mode: Open file mode: ~ “r” : reading only ~ “rw” : reading and writing rw = This line of code will open a file or create one if it is not present already C ONTOH : public static void main(String[] args) throws IOException{ public static void main(String[] args) throws IOException{ ( ); File f = new File("test3.txt"); if (!f.isFile() || !f.canRead() || !f.canWrite()) throw new IOException(); RandomAccessFile raf = new = new RandomAccessFile(f, RandomAccessFile(f "rw"); rw ); } RANDOM - ACCESS FILES FUNCTIONALITY: Seeking to any position within a file Seeking to any position within a file Reading and writing single or multiple bytes Reading and writing groups of bytes, treated as higher‐level data types Closing C ONTOH : R ANDOM A CCESS F ILE Obyek RandomAccessFile dapat Obyek RandomAccessFile dapat menambahkan (append) data di akhir file. Berbeda dengan FileOutputStream yang Berbeda dengan FileOutputStream yang meng‐ overwrite semua data yang sebelumnya sudah ada. Jika menambahkan data pada file, data yang ada setelah pointer akan di overwrite. File yang ditulis oleh FileOutputStream dapat dibaca oleh RandomAccessFile. M EMBACA I NPUT D ARI K EYBOARD Gunakan System.in sebagai InputStream untuk mendapatkan input dari input dari keyboard. Ingat! System.in adalah InputStream Æ agar input bisa didapat melalui Reader, maka Reader, maka diperlukan enkapsulasi sebagai berikut: InputStreamReader isr = new InputStreamReader(System.in); InputStreamReader(System in); BufferedReader buf = new BufferedReader(isr); SSelanjutnya l j t St i d t diperoleh String dapat di l h dengan d mengaplikasikan readLine(). String i s = buf.readLine(); b f d i () Question??