1. Aliran data

Jarang ana program minangka pulo dhewe. Program biasane sesambungan karo "donya njaba". Iki bisa kedadeyan liwat maca data saka keyboard, ngirim pesen, ngundhuh kaca saka Internet, utawa, kosok balene, ngunggah file menyang server remot.

Kita bisa ngrujuk marang kabeh prilaku kasebut ing siji tembung: ijol-ijolan data antarane program lan donya njaba. Enteni, iku ora mung siji tembung.

Mesthi, ijol-ijolan data dhewe bisa dipérang dadi rong bagéan: nampa data lan ngirim data. Contone, sampeyan maca data saka keyboard nggunakake Scannerobyek - iki nampa data. Lan sampeyan nampilake data ing layar nggunakake System.out.println()printah - iki ngirim data.

Ing pemrograman, istilah "stream" digunakake kanggo njlèntrèhaké pertukaran data. Saka ngendi asale istilah kasebut?

Ing urip nyata, sampeyan bisa duwe aliran banyu utawa aliran kesadaran. Ing pemrograman, kita duwe aliran data .

Aliran minangka alat serbaguna. Padha ngidini program kanggo nampa data saka ngendi wae (input stream) lan ngirim data ing ngendi wae (output stream). Dadi, ana rong jinis:

  • Aliran input kanggo nampa data
  • A stream output kanggo ngirim data

Kanggo nggawe stream 'nyata', pangripta Jawa nulis rong kelas: InputStreamlan OutputStream.

Kelas kasebut InputStreamnduweni read()metode sing ngidini sampeyan maca data saka iku. Lan OutputStreamkelas kasebut duwe write()metode sing ngidini sampeyan nulis data kasebut. Dheweke uga duwe cara liyane, nanging luwih akeh babagan mengko.

Byte stream

Apa jenis data sing kita ngomong babagan? Apa format njupuk? Ing tembung liya, jinis data apa sing didhukung kelas kasebut?

Iki minangka kelas umum, saengga ndhukung jinis data sing paling umum - byte. Bisa OutputStreamnulis bita (lan array bait), lan InputStreamobyek bisa maca bait (utawa array bait). Mekaten — padha ora ndhukung jinis data liyane.

Akibaté, aliran iki uga disebut stream byte .

Salah sawijining fitur stream yaiku data mung bisa diwaca (utawa ditulis) kanthi urutan. Sampeyan ora bisa maca data saka tengah stream tanpa maca kabeh data sing sadurunge.

Mangkene carane maca data saka keyboard bisa digunakake ing Scannerkelas: sampeyan maca data saka keyboard kanthi urutan, baris demi baris. Kita maca baris, banjur baris sabanjuré, banjur baris sabanjuré, lan ing. Kanthi pas, cara maca baris diarani nextLine().

Nulis data menyang an OutputStreamuga kedadeyan kanthi urut. Conto sing apik yaiku output konsol. Sampeyan output baris, ngiring dening liyane lan liyane. Iki minangka output urutan. Sampeyan ora bisa output baris pisanan, banjur kaping sepuluh, lan banjur kaloro. Kabeh data ditulis menyang stream output mung sequentially.

Aliran karakter

Sampeyan bubar sinau manawa senar minangka jinis data sing paling populer nomer loro, lan pancen bener. A akèh informasi liwati watara ing wangun karakter lan kabèh strings. Komputer unggul ing ngirim lan nampa kabeh minangka bait, nanging manungsa ora sampurna.

Akuntansi kanggo kasunyatan iki, programer Java nulis rong kelas liyane: Readerlan Writer. Kelas kasebut Readeranalog karo InputStreamkelas kasebut, nanging read()cara kasebut ora diwaca bita, nanging karakter ( char). Kelas Writercocog karo OutputStreamkelas. Lan kaya Readerkelas, bisa digunakake karo karakter ( char), ora bita.

Yen kita mbandhingake papat kelas kasebut, kita entuk gambar ing ngisor iki:

Byte (byte) Karakter (karakter)
Maca data
InputStream
Reader
Nulis data
OutputStream
Writer

Aplikasi praktis

Kelas InputStream, OutputStream, Readerlan Writerkelas dhewe ora digunakake langsung dening sapa wae, amarga ora ana hubungane karo obyek konkrit sing bisa diwaca data (utawa data bisa ditulis). Nanging kelas papat iki akeh kelas turunan sing bisa nindakake akeh.


2. InputStreamkelas

Kelas kasebut InputStreammenarik amarga dadi kelas induk kanggo atusan kelas turunan. Ora duwe data dhewe, nanging duwe metode sing diwarisake kabeh kelas asale.

Umumé, iku arang kanggo obyek stream kanggo nyimpen data internal. A stream minangka alat kanggo maca / nulis data, nanging dudu panyimpenan. Sing jarene, ana pangecualian.

Metode kelas InputStreamlan kabeh kelas turunane:

Metode Katrangan
int read()
Maca siji bait saka stream
int read(byte[] buffer)
Maca array bita saka stream
byte[] readAllBytes()
Maca kabeh bita saka stream
long skip(long n)
Mlayu nbita ing stream (maca lan dibuwang)
int available()
Priksa jumlah bita sing isih ana ing stream
void close()
Nutup stream

Ayo dadi ringkes babagan cara iki:

read()cara

Cara kasebut read()maca siji bait saka stream lan ngasilake. Sampeyan bisa uga bingung karo intjinis bali. Jinis iki dipilih amarga intjinis integer standar. Telung bait pisanan intbakal dadi nol.

read(byte[] buffer)cara

Iki minangka varian liya saka read()metode kasebut. Ngidini sampeyan maca array byte saka InputStreamkabeh bebarengan. Array sing bakal nyimpen bait kudu dilewati minangka argumen. Cara kasebut ngasilake nomer - jumlah bita sing bener diwaca.

Contone, sampeyan duwe buffer 10 kilobyte lan sampeyan lagi maca data saka file nggunakake kelas FileInputStream. Yen file mung ngemot 2 kilobyte, kabeh data bakal dimuat menyang buffer array, lan cara kasebut bakal ngasilake nomer 2048 (2 kilobyte).

readAllBytes()cara

Cara sing apik banget. Iku mung maca kabeh data saka InputStreamnganti entek lan bali minangka Uploaded byte siji. Iki migunani banget kanggo maca file cilik. File gedhe bisa uga ora pas fisik ing memori, lan cara bakal uncalan pangecualian.

skip(long n)cara

Cara iki ngidini sampeyan ngliwati n bita pisanan saka InputStreamobyek kasebut. Amarga data diwaca kanthi urutan, cara iki mung maca n bita pisanan saka stream lan dibuwang.

Ngasilake jumlah bita sing bener-bener dilewati (yen stream rampung sadurunge nbait dilewati).

int available()cara

Cara kasebut ngasilake jumlah bita sing isih ana ing stream kasebut

void close()cara

Cara kasebut close()nutup aliran data lan ngeculake sumber daya eksternal sing ana gandhengane. Sawise stream ditutup, ora ana data maneh sing bisa diwaca.

Ayo nulis conto program sing nyalin file sing gedhe banget. Kita ora bisa nggunakake readAllBytes()cara kanggo maca kabeh file menyang memori. Tuladha:

Kode Cathetan
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileInputStream input = new FileInputStream(src);
FileOutputStream output = new FileOutputStream(dest))
{
   byte[] buffer = new byte[65536]; // 64Kb
   while (input.available() > 0)
   {
      int real = input.read(buffer);
      output.write(buffer, 0, real);
   }
}



InputStreamkanggo maca saka file
OutputStreamkanggo nulis menyang file

Buffer menyang ngendi kita bakal maca data
Anggere ana data ing stream

Waca data menyang buffer
Tulis data saka buffer menyang stream kapindho

Ing conto iki, kita nggunakake rong kelas: FileInputStreamminangka turunan InputStreamkanggo maca data saka file, lan FileOutputStreamminangka turunan OutputStreamkanggo nulis data menyang file. Kita bakal ngomong babagan kelas loro mengko.

Titik menarik liyane ing kene yaiku realvariabel. Nalika pamblokiran data pungkasan diwaca saka file, bisa gampang duwe data kurang saka 64KB. Patut, kita kudu output ora kabeh buffer, nanging mung bagean - realbyte pisanan. Iki persis apa sing kedadeyan ing write()metode kasebut.



3. Readerkelas

Kelas Readerminangka analog lengkap saka InputStreamkelas. Bentenipun mung siji iku bisa karo karakter ( char), ora karo bita. Kaya InputStreamkelas kasebut, Readerkelas kasebut ora digunakake ing ngendi wae: iku kelas induk kanggo atusan kelas turunan lan nemtokake cara umum kanggo kabeh.

Metode kelas Reader(lan kabeh kelas turunane):

Metode Katrangan
int read()
Maca siji charsaka stream
int read(char[] buffer)
Maca chararray saka stream
long skip(long n)
Skips n charsing stream (maca lan mbuwang wong-wong mau)
boolean ready()
Priksa manawa isih ana sing isih ana ing aliran kasebut
void close()
Nutup stream

Cara kasebut meh padha karo kelas InputStream, sanajan ana bedane tipis.

int read()cara

Cara iki maca siji charsaka stream lan ngasilake. Jinis charwidens menyang int, nanging loro bita pisanan asil tansah nul.

int read(char[] buffer)cara

Iki minangka varian liya saka read()metode kasebut. Ngidini sampeyan maca array char saka Readerkabeh bebarengan. Array sing bakal nyimpen karakter kudu dilewati minangka argumen. Cara ngasilake nomer - jumlah karakter sing bener diwaca.

skip(long n)cara

Cara iki ngidini sampeyan ngliwati n karakter pisanan saka Readerobyek kasebut. Kerjane persis padha karo cara analog saka kelas InputStream. Ngasilake jumlah karakter sing bener dilewati.

boolean ready()cara

Ngasilake trueyen ana bait sing durung diwaca ing stream.

void close()cara

Cara kasebut close()nutup aliran data lan ngeculake sumber daya eksternal sing ana gandhengane. Sawise stream ditutup, ora ana data maneh sing bisa diwaca.

Kanggo mbandhingake, ayo nulis program sing nyalin file teks:

Kode Cathetan
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileReader reader = new FileReader(src);
FileWriter writer = new FileWriter(dest))
{
   char[] buffer = new char[65536]; // 128Kb
   while (reader.ready())
   {
      int real = reader.read(buffer);
      writer.write(buffer, 0, real);
   }
}



Readerkanggo maca saka file
Writerkanggo nulis menyang file

Buffer ing ngendi kita bakal maca data
Anggere ana data ing stream

Waca data menyang buffer
Tulis data saka buffer menyang stream kapindho