1. OutputStreamklase

Kamakailan lang ay nag-explore kami ng mga input stream. Oras na para pag-usapan ang mga output stream.

Ang OutputStreamklase ay ang parent class para sa lahat ng klase na sumusuporta sa byte na output. Isa itong abstract na klase na walang ginagawa sa sarili nitong, ngunit mayroon itong mga descendant na klase para sa bawat okasyon.

Parang sobrang kumplikado. Upang ilagay ito nang mas simple, ang klase na ito ay tumatakbo sa mga byte, at hindi, halimbawa, mga character o iba pang mga uri ng data. At ang katotohanan na ito ay abstract ay nangangahulugan na karaniwan ay hindi natin ito ginagamit, ngunit sa halip ay isa sa mga descendant na klase nito. Halimbawa, FileOutputStreamat iba pa.

Ngunit bumalik sa OutputStreamklase. Ang klase na ito ay may mga pamamaraan na dapat ipatupad ng lahat ng descendant class nito. Narito ang mga pangunahing:

Paraan Paglalarawan
void write(int b)
Nagsusulat ng isang byte (hindi isang int) sa stream.
void write(byte[] buffer)
Nagsusulat ng hanay ng mga byte sa stream
void write(byte[] buffer, off, len)
Nagsusulat ng bahagi ng isang hanay ng mga byte sa stream
void flush()
Isinulat ang lahat ng data na nakaimbak sa buffer sa stream
void close()
Isinasara ang stream

Kapag gumawa ka ng object ng isang klase na nagmamana ng InputStream, karaniwan mong tinutukoy ang source object kung saan InputStreamnagbabasa ang data. Kapag gumawa ka ng object ng isang klase na nagmamana ng OutputStream, karaniwan mo ring tinutukoy ang target na object o stream kung saan isusulat ang data.

Sa madaling sabi, suriin natin ang lahat ng mga pamamaraan ng OutputStreamklase:

write(int b)paraan

Ang pamamaraang ito ay nagsusulat ng isang byte (hindi isang int) sa output stream. Ang naipasa na halaga ay inihagis sa isang byte, at ang unang tatlong byte ng int ay itatapon.

write(byte[] buffer)paraan

Isinulat ang ibinigay na hanay ng mga byte sa output stream. Ayan yun.

write(byte[] buffer, int offset, int length)paraan

Nagsusulat ng isang bahagi ng naipasa na hanay ng mga byte sa output stream. Ang offset variable ay nagpapahiwatig ng index ng unang elemento ng array, at lengthang haba ng subset na isusulat.

flush()paraan

Ang flush()pamamaraan ay ginagamit upang pilitin ang anumang data na posibleng na-buffer sa kasalukuyang stream na maisulat sa target na stream. May kaugnayan ito kapag gumagamit ng buffering at/o maramihang stream object na nakaayos sa isang chain.

close()paraan

Nagsusulat ng anumang hindi nakasulat na data sa target na bagay. Ang close()pamamaraan ay hindi kailangang tawagan kung gumagamit ka ng isang try-with-resourcesbloke.

Halimbawa ng pagkopya ng file

Code Tandaan
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);
   }
}



InputStreampara sa pagbabasa mula sa isang file
OutputStreampara sa pagsulat sa isang file

Buffer kung saan babasahin natin ang data
Hangga't mayroong data sa stream

Basahin ang data sa buffer
Isulat ang data mula sa buffer hanggang sa pangalawang stream

2. Writerklase

Ang Writerklase ay eksaktong kapareho ng OutputStreamklase, ngunit isang pagkakaiba lang muli: gumagana ito sa mga character ( char) sa halip na mga byte.

Isa itong abstract na klase: hindi ka makakagawa ng mga object ng Writerklase. Ang pangunahing layunin nito ay maging isang karaniwang parent class para sa daan-daang mga descendant na klase at bigyan sila ng mga karaniwang pamamaraan para sa pagtatrabaho sa mga stream ng character.

Mga pamamaraan ng Writerklase (at lahat ng mga descendant na klase nito):

Paraan Paglalarawan
void write(int b)
Nagsusulat ng isang character (hindi isang int) sa stream.
void write(char[] buffer)
Nagsusulat ng hanay ng mga character sa stream
void write(char[] buffer, off, len)
Nagsusulat ng bahagi ng hanay ng mga character sa stream
void write(String str)
Nagsusulat ng string sa stream
void write(String str, off, len)
Nagsusulat ng bahagi ng isang string sa stream
void flush()
Isinulat ang lahat ng data na nakaimbak sa buffer sa stream
void close()
Isinasara ang stream

Ang mga pamamaraan ay halos kapareho sa mga pamamaraan ng OutputStreamklase, ngunit gumagana ang mga ito sa mga character sa halip na mga byte.

Paglalarawan ng mga pamamaraan:

write(int b)paraan

Ang pamamaraang ito ay nagsusulat ng isang character ( char— hindi isang int) sa output stream. Ang naipasa na halaga ay na-cast sa isang char, at ang unang dalawang byte ay itatapon.

write(char[] buffer)paraan

Isinulat ang ibinigay na hanay ng mga character sa output stream.

write(char[] buffer, int offset, int length)paraan

Nagsusulat ng bahagi ng naipasa na hanay ng mga character sa output stream. Ang offsetvariable ay nagpapahiwatig ng index ng unang elemento ng array, at lengthang haba ng subset na isusulat.

write(String str)paraan

Isinulat ang ibinigay na string sa output stream.

write(String str, int offset, int length)paraan

Nagsusulat ng isang bahagi ng ibinigay na string sa output stream: ang string ay na-convert sa isang array ng mga character. Ang offsetvariable ay nagpapahiwatig ng index ng unang elemento ng array, at lengthang haba ng subset na isusulat.

flush()paraan

Ang flush()pamamaraan ay ginagamit upang pilitin ang anumang data na posibleng na-buffer sa kasalukuyang stream na maisulat sa target na stream. May kaugnayan ito kapag gumagamit ng buffering at/o maramihang stream object na nakaayos sa isang chain.

close()paraan

Nagsusulat ng anumang hindi nakasulat na data sa target na bagay. Ang close()pamamaraan ay hindi kailangang tawagan kung gumagamit ka ng isang try-with-resourcesbloke.

Halimbawa ng program na kumukopya ng text file:

Code Tandaan
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);
   }
}



Readerpara sa pagbabasa mula sa isang file
Writerpara sa pagsulat sa isang file

Buffer kung saan babasahin natin ang data
Hangga't mayroong data sa stream

Basahin ang data sa isang buffer
Isulat ang data mula sa buffer hanggang sa pangalawang stream

StringWriterklase

May isa pang kawili-wiling klase na nagmamana ng Writerklase: ito ay tinatawag na StringWriter. Naglalaman ito ng nababagong string — isang StringBufferbagay. At sa tuwing "isusulat" mo ang isang bagay sa StringWriterbagay, ang teksto ay idinaragdag lamang sa panloob na buffer nito.

Halimbawa:

Code Tandaan
StringWriter writer = new StringWriter();
writer.write("Hello");
writer.write(String.valueOf(123));

String result = writer.toString();
Ang isang target na stream ng character ( StringWriter) ay nilikha
Isang string ay nakasulat sa buffer sa loob ng StringWriter
Isang string ay nakasulat sa buffer sa loob ng StringWriter

Pag-convert ng mga nilalaman ng isang bagay sa isang string

Sa kasong ito, ang StringWriterklase ay mahalagang isang wrapper sa StringBufferklase, ngunit ang StringWriterklase ay isang inapo ng Writerstream class, at maaari itong magamit sa mga chain ng stream object. Ito ay isang medyo kapaki-pakinabang na ari-arian sa pagsasanay.