Predavanje br. index|1|2|3|4|5|6|7|8|9|10|11|12|13|14|HOME


Deseto predavanje – ulaz i izlaz

Operacije ulaza i izlaza - što je stream? – klase streamova – odakle streamovi dolaze? – klasa InputStream – čitanje byteova – čitanje više byteova odjednom – prebrojavanje dostupnih byteova – preskakanje byteova – markiranje i resetiranje – zatvaranje streamova – izlazni streamovi – primjer izlaznog streama – čitanje iz datoteke primjer čitanja iz datoteke – pisanje u datoteku – primjer pisanja u datoteku – dodavanje na kraj datoteke – filtriranje streamova – filtrirani streamovi – bufferirani streamovi – klase podatkovnih streamova – klasa PrintStream – klasa PushBackInputStream – klasa File – konstruktori klase File – metode klase File – primjeri metoda iz klase File – klasa FileDialog – klasa RandomAccessFile – sučelje FilenameFilter – klase Reader i Writer – klasa Reader – klasa Writer – klasa InputStreamReader – klasa OutputStreamWriter – dostupne kodne stranice – klasa FileWriter – klasa FileReader – klasa BufferedReader – klasa LineNumberReader – klasa BufferedWriter


Operacije ulaza i izlaza

Podaci se ponekad umjesto na zaslon računala ispisuju u datoteku. Unix i DOS za tu svrhu imaju redirekcijske operatore < i >. Ponekad je potreban i finiji pristup, na primjer ako želite neke podatke uputiti u datoteku, a druge ostaviti na zaslonu. Ili možda želite istovremeno imati pristup u više datoteka. Također, možda želite tražiti od korisnika da unese podatke ne samo preko komandne linije nego i na neki drugi način. Ili želite pročitati datoteku koja je napisana u određenom formatu, poslati podatke preko mreže ili ih s nje učitati. U Javi se sve ove operacije obavljaju uz pomoć streamova. Stream je na primjer i System.out koji ste susreli već u prvom predavanju.


Što je Stream?

Stream je niz podataka koji ima neodređenu duljinu. Naziv stream (struja, tok) je odabran jer ta struktura nalikuje struji vode koja neprekidno teče i nema definiranog kraja. Još bolja analogija je rep (red čekanja). Za vrijeme dok se uslužuju ljudi na početku repa, novi dolaze na njegov kraj. Rep je diskretna struktura, ali to ne znači da njegovi članovi nisu međusobno povezani raznim relacijama.

U Javi se stream sastoji od niza diskretnih byteova. Oni mogu predstavljati znakove ili neke druge vrste podataka. Mogu dolaziti brže nego što ih je moguće obraditi ili pak process može čekati dok ne dođe sljedeći za obradu.

Ključ obrade streama je while petlja koja obrađuje svaki pojedini element streama dok ne učita znak za kraj streama ili dok se ne pojavi neki drugi iznimni uvjet. Na Unixu je <Ctrl-D> znak za završetak streama. Windows za tu svrhu koristi <Ctrl-Z>.


Klase streamova

Gotove sve klase koje izravno rade sa streamovima dijelovi su paketa java.io. (Postoji također nekoliko dodatnih u paketima sun.io i sun.net, ali te su namjerno skrivene. Ima i nekoliko klasa u paketu java.util.zip.) Dvije glavne klase su java.io.InputStream i java.io.OutputStream. To su apstraktne klase i one čine temelj mnogih potklasa sa specijaliziranim mogućnostima. Među njima se najčešće koriste:


Odakle streamovi dolaze?

Stream System.out je, recimo, OutputStream; i to posebno, PrintStream. Postoji odgovarajući System.in koji je InputStream namijenjen čitanju podataka s konzole.

Podaci za streamove dolaze također i iz datoteka. Kasnije ćete vidjeti kako koristiti klasu File te klase FileInputStream i FileOutputStream za čitanje podataka iz datoteka i pisanje u njih.

Mrežne konekcije obično daju streamove. O tome će biti riječi u zasebnom predavanju. Kad se povežete na neki web ili ftp ili neki drugi poslužitelj, čitate podatke koje on šalje tako da s njim povežete jedan InputStream i jedan OutputStream.

Java programi i sami proizvode streamove. Na primjer, ByteArrayInputStream, ByteArrayOutputStream, StringBufferInputStream, PipedInputStream, i PipedOutputStream se koriste za prijenos podataka iz jednog dijela Java programa u drugi.

Ponešto neočekivano, komponente kao što je TextArea ne proizvode streamove. Međutim, stringove koje oni stvaraju uvijek možete koristiti da biste kreirali ByteArrayInputStream ili StringBufferInputStream.


Klasa InputStream

Klasa java.io.InputStream je apstraktna klasa koja sadrži osnovne metode za čitanje čistih byteova podataka iz streama. Iako je to apstraktna klasa, mnoge metode u biblioteci vraćaju objekt tipa InputStream, tako da ćete često trebati raditi direktno s nekom od metoda deklariranih u toj klasi.

 
public abstract int read() throws IOException
public int read(byte[] data) throws IOException
public int read(byte[] data, int offset, int length) throws IOException
public long skip(long n) throws IOException
public int available() throws IOException
public void close() throws IOException
public synchronized void mark(int readlimit)
public synchronized void reset() throws IOException
public boolean markSupported()
 

Primijetite da gotovo sve ove metode mogu izbaciti IOException. To vrijedi za uglavnom sve što se odnosi na ulaz i izlaz. Jedina iznimka od tog pravila je klasa PrintStream koja će progutati sve iznimke.


Čitanje byteova

Osnovna read() metoda iz klase java.io.InputStream čita pojedinačni neoznačeni byte podataka i vraća njegovu int vrijednost. To je broj između 0 i 255. Kad se naiđe na kraj streama, vraća se -1, i to možete koristiti kao flag pomoću kojeg ćete ustanoviti da ste došli do kraja streama.

 
public abstract int read() throws IOException
 

Evo jednog jednostavnog programa koji vraća kao echo korisnikov unos na komandnoj liniji. Byte se prije ispisa pretvara u ekvialentni ISO Latin-1 znak. Ovaj program neće pravilno raditi sa Unicode znakovima. Možete ga dakle koristiti samo za čiste podatke, a za tekstove i osobito ne-ASCII podatke koristiti klase java.io.Reader i java.io.Writer.

 
/* Note that as a general rule on most platforms characters
are only sent to System.in a line at a time, not as each character
is typed. This allows the user to backspace over mistakes and 
correct them.  Java does not allow you to put the console into
"raw" mode.  */
 
import java.io.*;
 
 
public class Echo {
 
  public static void main(String[] args) {
  
    echo(System.in);
  
  }
  
  public static void echo(InputStream in) {
  
    try {
      while (true) {
        // Notice that although a byte is read, an int
        // with value between 0 and 255 is returned.
        // Then this is converted to an ISO Latin-1 char 
        // in the same range before being printed.   
        int i = in.read();
        // -1 is returned to indicate the end of stream
        if (i == -1) break;
        
        // without the cast a numeric string like "65"
        // would be printed instead of the character "A"
        char c = (char) i; 
        System.out.print(c);    
      }
    }
    catch (IOException e) {
      System.err.println(e); 
    }
    System.out.println();  
  
  }
 
}
 
% javac Echo.java
% java Echo
abcdefg
abcdefg
<Ctrl-C>
%

Čitanje više byteova odjednom

Dok osnovna read() metoda čita byte po byte, sljedeće dvije overloaded varijante čitaju polja byteova.

 

public int read(byte[] data) throws IOException
public int read(byte[] data, int offset, int length) throws IOException

 

Prva metoda čita onoliko byteova koliko joj treba da napuni polje data. Druga čita onoliko byteova iz ulaznog streama koliko joj je zadano u argumentu length i sprema ih u polje data počevši od pozicije offset.

Te su metode blokorane dok ne stignu raspoloživi podaci. Tada učitaju onoliko podataka koliko stane u polje ili koliko je navedeno u length.

Nakon toga vraćaju broj byteova koje su učitale. Ne smijete pretpostaviti da će polje biti uvijek napunjeno ili da će zaista biti učitano length byteova. Ako naiđe kraj streama, vraća se -1.


Prebrojavanje dostupnih byteova

Metoda available() ispituju koliko byteova sa uzlaznog streama je spremno za učitavanje bez blokiranja.

public int available() throws IOException

Na primjer, sljedeći program je efikasnija verzija prethodnog programa Echo jer koristi metodu available() za ispitivanje koliko byteova je spremno za učitavanje, a zatim kreira polje točno te veličine, učitava byteove u polje i konvertira ga u String koji zatim ispisuje.

import java.io.*;
 
 
public class EfficientEcho {
 
  public static void main(String[] args) {
  
    echo(System.in);
  
  }
  
  public static void echo(InputStream in) {
  
    try {
      while (true) {
        int n = in.available();
        if (n > 0) {
          byte[] b = new byte[n];
          int result = in.read(b);
          if (result == -1) break;
          String s = new String(b);
          System.out.print(s); 
        } // end if   
      } // end while
    } // end try
    catch (IOException e) {
      System.err.println(e); 
    }
  
  }
 
}
 
% javac Echo.java
% java Echo
abcdefg
abcdefg
<Ctrl-C>
%

Preskakanje byteova

Metoda skip() čita i odbacuje specificirani broj byteova.

public int skip(long n) throws IOException

Možete je koristiti, na primjer, ako želite brzo prođi standardni header ili prefiks nekih podataka. U sljedećem fragmentu koda koristi se skip() za preskakanje praznina uključenih u DataInputStream dis.

     case 171: // lookupswitch     
         pad = 3 - (position % 4);
         dis.skip(pad);
         defaultByte = dis.readInt();
         int npairs = dis.readInt();
         result = position + "    lookupswitch " + defaultByte + " " + npairs;
         for (int i = 0; i < npairs; i++) {
           int newPosition = position + pad + 12 + i*8;
           result += "\n" + newPosition + "    " 
            + dis.readInt() + " " + dis.readInt();
         }

Markiranje i resetiranje

Često je korisno ako možete učitati nekoliko byteova, a zatim se vratiti natrag i učitati ih ponovo. Na primjer, pri oblikovanju nekog kompajlera ne možete znati da li trebate učitati znak <, <<, ili <<= sve dok ne učitate dva ili više byteova. Bilo bi korisno ako biste se mobli vratiti natrag i ponovo učitati token nakon što ste okrili o kojem se radi. Dizajniranje kompajlera i problemi parsiranja uvijek osiguravaju mnoštvo primjera, no slične potrebe se pojavljuju i drugdje.

Neki, ali ne svi streamovi dopuštaju vam da markirate određenu poziciju u streamu i onda se vratite na nju. To se radi pomoću sljedećih metoda:

public synchronized void mark(int readlimit)
public synchronized void reset() throws IOException
public boolean markSupported()
 

Metoda markSupported() vraća true ako taj stream podržava markiranje, a false inače.

Pod pretpostavkom da je markiranje podržano, metoda mark() stavlja bookmark na mjesto gdje se kasnije želite vratiti pomoću metode reset(). Istodobno u jednom streamu može postojati samo jedan takav bookmark. Sljedeće markiranje izbrisat će prethodno. Ako markiranje nije podržano, ove će metode izbaciti IOException.


Zatvaranje streamova

Kad ste završili s nekim streamom, trebali biste ga zatvoriti kako bi se otpustili resursi koji su s njim povezani. Jednom kad je stream zatvoren, svaki pokušaj čitanja iz njega izbacit će IOException.

Stream (u ovom slučaju ulazni) zatvarate pomoću metode close():

public void close() throws IOException

Ako se stream ne može zatvoriti, izbacit će se IOException.


Izlazni streamovi

Klasa java.io.OutputStream šalje čiste byteove podataka na neko odredište, npr. konzolu ili mrežni poslužitelj. Ova je klasa apstraktna, isto kao i InputStream. Međutim, mnoge metode u biblioteci klasa napravljene su tako da vraćaju objekte tipa OutputStream umjesto objekte iz njenih specifičnih podklasa. Također, mnoge metode klase OutputStream su općenito korisne. To su:

 
public abstract void write(int b) throws IOException
public void write(byte[] data) throws IOException
public void write(byte[] data, int offset, int length) throws IOException
public void flush() throws IOException
public void close() throws IOException
 

Nekoliko različitih write() metoda šalju čiste byteove podataka svakom procesu koji osluškuje dani stream.

Ponekad operacijski sustav bufferira izlazne streamove zbog boljih performansi. To znači da se byteovi prije ispisa akumuliraju u spremnik čija veličina može biti od nekoliko byteova do nekoliko tisuća byteova. Kad se on napuni, svi podaci se ispisuju odjednom. Metoda flush() pokrenut će, međutim, ispis bez obzira da li je spremnik pun ili nije.

Primijetite da to nije isto što i bufferiranje koje provodi klasa BufferedOutputStream koje izvodi Java runtime. Ovdje se radi o native bufferiranju, dakle procesu na razini operacijskog sustava. Međutim, poziv metode flush() trebao bi isprazniti oba spremnika.

Metoda close() zatvara stream i otpušta resurse koji su s njim povezani. Jednom kad je stream zatvoren, pokušaj pisanja u njega izbacit će IOException.


Primjer izlaznog streama

Jedini izlazni streamovi koje ste do sad upoznali su System.out i System.err. Sljedeći primjer koristi metode write() and flush() iz klase OutputStream da bi na System.out ispisao string “Hello World”

 
import java.io.*;
 
 
public class HelloOutputStream {
 
  public static void main(String[] args) {
 
    String s = "Hello World\r\n";
 
    // Convert s to a byte array
    byte[] b = new byte[s.length()];
    s.getBytes(0, s.length()-1, b, 0);
    try {
      System.out.write(b);
      System.out.flush();
    }
    catch (IOException e) {
      System.err.println(e);
    }
 
  }
 
}
 
% javac HelloOutputStream.java
% java HelloOutputStream
 ello World
%
 

Primijetite da program ne radi baš onako kako bi se očekivalo nego proguta prvi znak.


Čitanje iz datoteke

Klasa java.io.FileInputStream predstavlja InputStream koji čita byteove iz datoteke. Ima sljedeće public konstruktore i metode:

 
public FileInputStream(String name) throws FileNotFoundException
public FileInputStream(File file) throws FileNotFoundException
public FileInputStream(FileDescriptor fdObj)
 
public native int read() throws IOException
public int read(byte[] data) throws IOException
public int read(byte[] data, int offset, int length) throws IOException
public native long skip(long n) throws IOException
public native int available() throws IOException
public native void close() throws IOException
public final FileDescriptor getFD() throws IOException
 

S iznimkom konstruktora te metode getFD(), ove metode samo prekrivaju istoimene metode klase java.io.InputStream. Jedina je razlika što čitaju podatke iz datoteke.


Primjer čitanja iz datoteke

Novi objekt tipa FileInputStream konstruirate tako da konstruktoru proslijedite ime datoteke, na primjer:

FileInputStream fis = new FileInputStream("ulaz.txt");

Ako datoteka ne postoji, izbacit će se iznimka FileNotFoundException, podklasa od IOException. Općenito, Java će tražiti datoteke u aktivnom direktoriju, no one se ne moraju nužno nalaziti u direktoriju u kojem se nalazi .class datoteka.

Sljedeća aplikacija čita datoteke koje su navedene na komandnoj liniji i ispisuje njihov sadržaj na System.out.

import java.io.*;
 
 
public class Type {
 
  public static void main(String[] args) {
  
    for (int i = 0; i < args.length; i++) {
      try {
        FileInputStream fis = new FileInputStream(args[i]); 
        int n;     
        while ((n = fis.available()) > 0) {
          byte[] b = new byte[n];
          int result = fis.read(b);
          if (result == -1) break;
          String s = new String(b);
          System.out.print(s); 
        } // end while
        fis.close();
      } // end try
    // Is this catch strictly necessary?
      catch (FileNotFoundException e) {
        System.err.println("Could not find file " + args[i]); 
      }
      catch (IOException e) {
        System.err.println(e); 
      }
      System.out.println();
    } // end for
 
  } // end main
 
}
 
% javac Type.java
% java Type "../html/TricksterApplet.html"
<APPLET CODE="TricksterApplet.class" 
CODEBASE="http://student.math.hr/~vedris/java/classes" 
ARCHIVE="Trickster.jar"
WIDTH=1 HEIGHT=1>
</APPLET>
%

Pisanje u datoteku

Klasa java.io.FileOutputStream predstavlja OutputStream koji upisuje byteove u datoteku. Ima sljedeće public konstruktore i metode:

 
public FileOutputStream(String name) throws IOException
public FileOutputStream(String name, boolean append) throws IOException
public FileOutputStream(File file) throws IOException
public FileOutputStream(FileDescriptor fdObj)
 
public native void write(int b) throws IOException
public void write(byte[] data) throws IOException
public void write(byte[] data, int offset, int length) throws IOException
public native void close() throws IOException
public final FileDescriptor getFD() throws IOException

 

S iznimkom konstruktora te metode getFD(),ove metode samo prekrivaju istoimene metode klase java.io.OutputStream. Jedina je razlika što pišu podatke u datoteku.


Primjer pisanja u datoteku

Novi objekt tipa FileOutputStream konstruirate tako da konstruktoru proslijedite ime datoteke, na primjer:

FileOutputStream fos = new FileOutputStream("izlaz.txt");

Ako datoteka postoji u aktivnom direktoriju, bit će prebrisana i u nju upisani novi podaci. Ako ne postoji, kreirat će se.

U sljedećem primjeru čita se korisnikov input sa System.in i ispisuje se u datoteke specificirane na komandnoj liniji.

import java.io.*;
 
 
public class MultiType {
 
  public static void main(String[] args) {
 
    FileOutputStream[] fos = new FileOutputStream[args.length];
 
    for (int i = 0; i < args.length; i++) {
      try {
        fos[i] = new FileOutputStream(args[i]); 
      }
      catch (IOException e) {
        System.err.println(e); 
      }
    } // end for
    
    try {
       while (true) {
        int n = System.in.available();
        if (n > 0) {
          byte[] b = new byte[n];
          int result = System.in.read(b);
          if (result == -1) break;
          for (int i = 0; i < args.length; i++) {
            try {
              fos[i].write(b, 0, result); 
            }
            catch (IOException e) {
              System.err.println(e); 
            }
          } // end for
        } // end if   
      } // end while
    } // end try
    catch (IOException e) {
      System.err.println(e); 
    }
 
    for (int i = 0; i < args.length; i++) {
      try {
        fos[i].close(); 
       }
       catch (IOException e) {
         System.err.println(e); 
       }
    }
 
 
  } // end main
  
}
 
% javac MultiType.java
% java MultiType izlaz1.txt izlaz2.txt
nebo je plavo 
<Ctrl-C>
%
% ls izlaz*.txt
izlaz1.txt
izlaz2.txt
 
% more izlaz1.txt
nebo je plavo
% more izlaz2.txt
nebo je plavo
%

Dodavanje na kraj datoteke

Ako želite da se novi sadržaj doda na kraj datoteke umjesto da prebriše prethodni sadržaj, proslijedit ćete vrijednost true kao drugi argument konstruktoru FileOutputStream(). Na primjer:

FileOutputStream fos = new FileOutputStream("izlaz.txt", true);

U sljedećem primjeru čita se korisnikov input sa System.in i dodaje na kraj datoteka specificiranih na komandnoj liniji.

import java.io.*;
 
 
public class Append {
 
  public static void main(String[] args) {
 
    FileOutputStream[] fos = new FileOutputStream[args.length];
 
    for (int i = 0; i < args.length; i++) {
      try {
        fos[i] = new FileOutputStream(args[i], true); 
      }
      catch (IOException e) {
        System.err.println(e); 
      }
    } // end for
    
    try {
       while (true) {
        int n = System.in.available();
        if (n > 0) {
          byte[] b = new byte[n];
          int result = System.in.read(b);
          if (result == -1) break;
          for (int i = 0; i < args.length; i++) {
            try {
              fos[i].write(b, 0, result); 
            }
            catch (IOException e) {
              System.err.println(e); 
            }
          } // end for
        } // end if   
      } // end while
    } // end try
    catch (IOException e) {
      System.err.println(e); 
    }
 
    for (int i = 0; i < args.length; i++) {
      try {
        fos[i].close(); 
      }
      catch (IOException e) {
        System.err.println(e); 
      }
    } // end for
 
 
  } // end main
  
}
 
% javac Append.java
% java Append izlaz1.txt izlaz2.txt
a trava je zelena. 
<Ctrl-C>
% more izlaz1.txt
nebo je plavo
a trava je zelena. 
% more izlaz2.txt
nebo je plavo 
a trava je zelena.
%

Filtriranje streamova

Klase java.io.FilterInputStream i java.io.FilterOutputStream su konkretne podklase od InputStream i OutputStream koje na neki način modificiraju podatke osnovnih streamova. Rijetko ćete ih koristiti izravno, ali njihove su podklase iznimno važne, posebno DataInputStream i DataOutputStream.

Filtar-stream povezujete s osnovnim tako da da osnovni proslijedite konstruktoru filtar-streama. Na primjer, da biste kreirali novi objekt tipa DataOutputStream iz objekta FileOutputStream mogli biste postupiti ovako:

FileOutputStream fos = new FileOutputStream("ln.txt");
DataOutputStream dos = new DataOutputStream(fos);
 

To se može kombinirati i u jednoj liniji:

 
DataOutputStream dos = new DataOutputStream(new FileOutputStream("ln.txt"));

Filtrirani streamovi

BufferedInputStream i BufferedOutputStream

Ove klase bufferiraju čitanje i pisanje tako da podatke najprije učitavaju u spremnik (buffer, interrno polje byteova). Tako neka aplikacija može čitati byteove iz streama bez pozivanja native metoda koje iza toga stoje. Podaci se učitavaju iz buffera ili u njega upisuju u blokovima, a naknadni pristupi usmjeravaju se direktno prema spremniku.

 

DataInputStream i DataOutputStream

Ove klase čitaju i pišu podatke koji pripadaju primitivnim Java tipovima, kao i podatke tipa String na način koji ne ovisi o mašini (Big-endian za integer, IEEE-754 za float i double, UTF-8 za Unicode)

 

PrintStream

Ova ste klasu već susretali preko njenih implementacija System.out i System.err. Omogućuje vrlo jednostavno ispisivanje primitivnih vrijednosti, objekata i string literala. Klasa hvata sve iznimke tipa IOException i namijenjena je ponajprije za debugging.

 

PushbackInputStream

Ova klasa osigurava pushback spremnik pomoću kojeg je moguće "poništiti" čitanje byteova sa streama. Kod sljedećeg čitanja sa streama bit će učitani ti “poništeni” byteovi.

 

GZIPInputStream i GZIPOutputStream

Ovo su klase iz paketa java.util.zip i obavljaju kompresiju i dekompresiju podataka.

 

DigestInputStream i DigestOutputStream

Ovo su klase iz paketa java.security i izračunavaju tzv. MessageDigest za streamove koristeći neku jaku hash funkciju, npr SHA.

 

CipherInputStream i CipherOutputStream

Klase su iz paketa javax.crypto koji je dio Java Cryptography Extension (JCE), standardnog proširenja Jave, a uključen je u JavaTM 2 Platform Std. Ed. v1.4.0. i izračunavaju enkripcije i dekripcije streamova koristeći razne algoritme kao DES, RSA, Blowfish i druge.

 

ObjectInputStream i ObjectOutputStream

Podklase od of DataInputStream i DataOutputStream koje mogu serijalizirati i deserijalizirati Java objekte u čiste byteove (i obratno). Koristi se kod udaljenog pozivanja metoda (RMI) i za JavaBeans.

 

Možete kreirati i svoje vlastite podklase od java.io.FilterInputStream i java.io.FilterOutputStream koje će izvoditi filtriranja prema vašim potrebama.


Bufferirani streamovi

Klase java.io.BufferedInputStream i java.io.BufferedOutputStream omogućuju čitanje i pisanje na način da se podaci prvo spremaju u spremnik (buffer) koji je zapravo interno polje byteova. Program tada čita byteove iz streama bez prethodnog pozivanja native metode dok god ima podataka u spremniku. Podaci se čitaju iz spremnika ili pišu u njega u blokovima, a nakon toga su dostupni izravno iz spremnika.

Sa stanovišta programera, jedina razlika između običnog i bufferiranog streama je u konstruktorima:

public BufferedInputStream(InputStream in)
public BufferedInputStream(InputStream in, int size)
public BufferedOutputStream(OutputStream out)
public BufferedOutputStream(OutputStream out, int size)
 

Argument size je broj byteova u spremniku. Ako nije naveden, podrazumijeva se 512.

Optimalna veličina spremnika jako ovisi o platformi i općenito je povezana sa veličinom bloka na disku, barem za datotečne streamove. Manje od 512 će vjerojatno biti premalo, a više od 4096 previše. Idealno bi bilo da veličina spremnika bude cjelobrojni višekratnik veličine bloka diska. Za nepouzdane mrežne konekcije bolje je odabrati manju veličinu spremnika. Na primjer,

URL u = new URL("http://java.developer.com");
BufferedInputStream bis = new BufferedInputStream(u.openStream(), 256);

Klase podatkovnih streamova

Klase java.io.DataInputStream i java.io.DataOutputStream čitaju i pišu primitivne Java tipove podataka i stringove na način koji ne ovisi o mašini. Općenito ćete DataInputStream koristiti za čitanje podataka koji su napisani pomoću DataOutputStream. Taj format koristi standard IEEE 754 za floating point, big-endian za integer, i modificirani UTF-8 za Unicode.

DataOutputStream deklarira sljedeće konstruktore i metode:

public DataOutputStream(OutputStream out)
 
public synchronized void write(int b) throws IOException
public synchronized void write(byte[] data, int offset, int length) throws IOException
public final void writeBoolean(boolean b) throws IOException
public final void writeByte(int b) throws IOException
public final void writeShort(int s) throws IOException
public final void writeChar(int c) throws IOException
public final void writeInt(int i) throws IOException
public final void writeFloat(float f) throws IOException
public final void writeDouble(double d) throws IOException
public final void writeBytes(String s) throws IOException
public final void writeChars(String s) throws IOException
public final void writeUTF(String s) throws IOException
public final int size()
public void flush() throws IOException
 

Metoda size() vraća broj byteova koji su ispisani na izlazni stream.


Klasa PrintStream

Klasa java.io.PrintStream je podklasa od FilterOutputStream. Implementirana je u System.out i System.err. Omogućuje jednostavan ispis primitivnih vrijednosti, objekata i string literala. Za konvertiranje znakova u byteove koristi kodiranje koje je na danoj platformi default.

Ta klasa će uhvatiti sve iznimke tipa IOException, Status pogreške možete uvijek doznati pomoću metode checkError(). Ona će vratiti true ako se greška pojavila, false inače.

public boolean checkError()

Ono što se najviše koristi u ovoj klasi su (overlodaded) metode print() i println(). Metode