1. OutputStreamklase

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

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.

Ito tunog lubhang 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.



3. PrintStreamklase

Ang mga klase ng stream ng output ay maaari ding ilagay sa isang chain na may mga intermediary stream na nagsusulat ng data sa target na stream na ipinasa sa kanila. Ang pangkalahatang view ng pakikipag-ugnayan ng mga stream na ito ay ganito ang hitsura:

klase ng PrintStream

Ang pinakakawili-wili at maraming nalalaman sa lahat ng mga intermediate na output stream ay PrintStream. Mayroon itong sampu-sampung pamamaraan at kasing dami ng 12 constructor.

Ang PrintStreamklase ay nagmamana ng FilterOutputStreamklase, na nagmamana ng OutputStream. Nangangahulugan iyon na ang PrintStreamklase ay may lahat ng mga pamamaraan ng mga magulang na klase bilang karagdagan sa sarili nitong mga pamamaraan . Narito ang mga pinaka-kawili-wili:

Paraan Paglalarawan
void print(obj)
Kino-convert ang naipasa na bagay sa isang string at inilalabas ito sa target na stream.
void println(obj)
Kino-convert ang naipasa na bagay sa isang string at inilalabas ito sa target na stream. Nagdaragdag ng line break sa dulo
void println()
Naglalabas ng isang line break na character sa target na stream
PrintStream format(String format, args...)
Bumubuo at naglalabas ng string batay sa format na string at sa mga naipasa na argumento; katulad ng String.format()pamamaraan

At nasaan ang mga sampung mga pamamaraan na ito, itatanong mo?

Well, mayroon itong maraming mga variant ng print()at println()mga pamamaraan na may iba't ibang mga parameter. Maaari silang ibuod sa talahanayang ito.

Hindi kami sisibakin sa mga pamamaraang ito, dahil kilala mo na ang mga ito. Maaari mo bang hulaan kung ano ang nakukuha ko?

Tandaan System.out.println()? Ngunit maaari itong isulat sa dalawang linya:

Code Output ng console
PrintStream stream = System.out;
stream.println("Hello!");
Hello!

Ang aming paboritong utos ay isang tawag sa pamamaraan sa static na variable ng klase. At ang uri ng variable na ito ay .System.out.println()println()outSystemPrintStream

Sa maraming antas ng CodeGym, at sa halos bawat gawain, tumatawag ka sa mga pamamaraan ng PrintStreamklase nang hindi mo alam!

Praktikal na paggamit

Ang Java ay may ganitong kagiliw - giliw na klase na tinatawag na ByteArrayOutputStream, na isang dynamic na lumalagong byte array na nagmamana OutputStream.

Ang isang ByteArrayOutputStreambagay at PrintStreambagay ay maaaring i-chain tulad nito:

Code Paglalarawan
ByteArrayOutputStream baos = new ByteArrayOutputStream();

try(PrintStream stream = new PrintStream(baos))
{
   stream.println("Hello");
   stream.println(123);
}

String result = baos.toString();

System.out.println(result);
Gumawa ng write buffer sa memory

I-wrap ang buffer sa isang PrintStreamobject

Sumulat ng data sa console



I-convert ang array sa isang string!

Output ng console:
Hello!
123