"Amigo, gubug sepuluh!"

"Aku seneng sinau basa Jawa, Juragan!"

"Tenang, Amigo. Dina iki kita duwe topik sing menarik banget. Kita bakal ngomong babagan carane program Jawa sesambungan karo sumber daya eksternal lan kita bakal sinau siji statement Jawa sing menarik banget. Luwih becik ora nutup kuping."

"Aku kabeh kuping."

"Nalika program Java mlaku, kadhangkala sesambungan karo entitas ing njaba mesin Java. Contone, karo file ing disk. Entitas iki biasane disebut sumber daya eksternal."

"Banjur apa sing dianggep sumber daya internal?"

"Sumber daya internal minangka obyek sing digawe ing mesin Java. Biasane, interaksi kasebut ngetutake skema iki:

Pernyataan Try-with-resources

"Sistem operasi kanthi ketat nglacak sumber daya sing kasedhiya , lan uga ngontrol akses bareng saka macem-macem program. Contone, yen program siji ngganti file, program liya ora bisa ngganti (utawa mbusak) file kasebut. Prinsip iki ora diwatesi kanggo file, nanging menehi conto sing paling gampang dingerteni.

"Sistem operasi nduweni fungsi (API) sing ngidini program kanggo ndarbeni lan / utawa ngeculake sumber daya. Yen sumber daya sibuk, mung program sing entuk bisa digunakake. Yen sumber daya gratis, program apa wae bisa entuk. iku.

"Bayangake yen kantor duwe cangkir kopi bareng. Yen ana sing njupuk cangkir, wong liya ora bisa njupuk maneh. Nanging yen cangkir wis digunakake, dicuci lan dilebokake maneh ing panggonane, sapa wae bisa njupuk maneh."

"Get it. Iku kaya kursi ing subway utawa transportasi umum liyane. Yen kursi gratis, sapa wae bisa njupuk. Yen kursi wis dikuwasani, banjur dikontrol dening wong sing njupuk."

"Bener. Lan saiki ayo ngomong babagan entuk sumber daya eksternal . Saben program Java sampeyan wiwit nggarap file ing disk, mesin Java njaluk akses eksklusif menyang sistem operasi kasebut. Yen sumber daya gratis, mesin Java entuk. iku.

"Nanging sawise sampeyan rampung nggarap file kasebut, sumber daya (berkas) iki kudu dirilis, yaiku sampeyan kudu ngabari sistem operasi yen sampeyan ora butuh maneh. Yen sampeyan ora nindakake iki, sumber kasebut bakal terus dadi. dianakake dening program sampeyan."

"Swara adil."

"Kanggo tetep kaya ngono, sistem operasi njaga dhaptar sumber daya sing dikuwasani saben program sing mlaku. Yen program sampeyan ngluwihi watesan sumber daya sing ditugasake, sistem operasi ora bakal menehi sumber daya anyar maneh.

"Iku kaya program sing bisa mangan kabeh memori ..."

"Soko kaya ngono. Kabar apik yaiku yen program sampeyan mandheg, kabeh sumber daya bakal dirilis kanthi otomatis (sistem operasi dhewe nindakake iki)."

"Yen iku kabar apik, apa tegese ana kabar ala?"

"Satemene. Kabar ala yen sampeyan nulis aplikasi server ... "

"Nanging apa aku nulis aplikasi kaya ngono?"

"Akeh aplikasi server sing ditulis nganggo basa Jawa, mula kemungkinan sampeyan bakal nulis kanggo kerja. Kaya sing dakkandhakake, yen sampeyan nulis aplikasi server, mula server sampeyan kudu mbukak tanpa mandheg nganti pirang-pirang dina, minggu, wulan, lsp."

"Ing tembung liyane, program ora siksa, lan tegese memori ora dirilis kanthi otomatis."

"Pancen. Lan yen sampeyan mbukak 100 file saben dina lan ora nutup, banjur ing sawetara minggu aplikasi sampeyan bakal tekan watesan sumber daya lan kacilakan."

"Sing kurang sawetara wulan kerja stabil! Apa sing bisa ditindakake?"

"Kelas sing nggunakake sumber daya eksternal duwe cara khusus kanggo ngeculake: close().

"Iki conto program sing nulis soko menyang file banjur nutup file yen wis rampung, yaiku mbebasake sumber daya sistem operasi. Kira-kira kaya iki:

Kode Cathetan
String path = "c:\\projects\\log.txt";
FileOutputStream output = new FileOutputStream(path);
output.write(1);
output.close();
Path menyang file.
Entuk obyek file: entuk sumber daya.
Tulis menyang file
Nutup file - ngeculake sumber daya

"Ah ... Dadi, sawise nggarap file (utawa sumber daya eksternal liyane), aku kudu nelpon metode close()ing obyek sing disambung menyang sumber eksternal."

"Ya, kabeh katon prasaja. Nanging pangecualian bisa kedadeyan nalika program mlaku, lan sumber daya eksternal ora bakal dirilis."

"Lan iku ala banget. Apa sing kudu ditindakake?"

"Kanggo mesthekake yen close()metode kasebut tansah diarani, kita kudu mbungkus kode ing blok try- catch- finallylan nambahake close()metode kasebut menyang finallyblok kasebut. Bakal katon kaya iki:

try
{
   FileOutputStream output = new FileOutputStream(path);
   output.write(1);
   output.close();
}
catch (IOException e)
{
   e.printStackTrace();
}
finally
{
   output.close();
}

"Hmm... ana sing salah?"

"Bener. Kode iki ora bakal dikompilasi, amarga outputvariabel kasebut diumumake ing jero try{}blok, lan mulane ora katon ing finallyblok kasebut.

Ayo didandani:

FileOutputStream output = new FileOutputStream(path);

try
{
   output.write(1);
   output.close();
}
catch (IOException e)
{
   e.printStackTrace();
}
finally
{
   output.close();
}

"Apa kabeh saiki apik?"

"Ora apa-apa, nanging ora bakal bisa digunakake yen ana kesalahan nalika nggawe FileOutputStreamobyek, lan iki bisa kedadeyan kanthi gampang.

Ayo didandani:

FileOutputStream output = null;

try
{
   output = new FileOutputStream(path);
   output.write(1);
   output.close();
}
catch (IOException e)
{
   e.printStackTrace();
}
finally
{
   output.close();
}

"Lan apa kabeh bisa saiki?"

"Isih ana sawetara kritik. Kaping pisanan, yen ana kesalahan nalika nggawe FileOutputStreamobyek kasebut, outputvariabel kasebut bakal null. Kemungkinan iki kudu dipertanggungjawabake ing finallyblok kasebut.

"Kapindho, close()cara kasebut tansah diarani ing finallyblok, tegese ora perlu ing tryblok kasebut. Kode pungkasan bakal katon kaya iki:

FileOutputStream output = null;

try
{
   output = new FileOutputStream(path);
   output.write(1);
}
catch (IOException e)
{
   e.printStackTrace();
}
finally
{
   if (output!=null)
      output.close();
}

"Sanajan kita ora nganggep catchblok kasebut, sing bisa diilangi, banjur 3 baris kode dadi 10. Nanging kita mung mbukak file lan nulis 1."

"Phew... Iku apik sing nyimpulake prakara iki. Relatif dingerteni, nanging rada nyenyet, ta?"

"Mulane, para pangripta Jawa nulungi kita kanthi nambahake gula sintaksis. Saiki ayo pindhah menyang sorotan program, utawa luwih tepat, pelajaran iki:

try-karo-sumber daya

"Miwiti karo versi 7th, Jawa duwe trystatement -with-resources anyar.

"Iki digawe kanthi tepat kanggo ngatasi masalah kanthi telpon wajib kanggo close()metode kasebut."

"Iku muni janji!"

"Kasus umum katon cukup prasaja:

try (ClassName name = new ClassName())
{
   Code that works with the name variable
}

"Dadi iki variasi liyane saka try statement ?"

"Ya. Sampeyan kudu nambah kurung sawise trytembung kunci, banjur nggawe obyek kanthi sumber daya eksternal ing jero kurung. Kanggo saben obyek ing kurung, compiler nambah bagean finallylan telpon kanggo close()metode.

"Ing ngisor iki ana rong conto sing padha:

Kode dawa Kode karo nyoba-karo-sumber daya
FileOutputStream output = null;

try
{
   output = new FileOutputStream(path);
   output.write(1);
}
finally
{
   if (output!=null)
   output.close();
}
try(FileOutputStream output = new FileOutputStream(path))
{
   output.write(1);
}

"Cool! Kode nggunakake try-with-resources akeh luwih cendhek lan luwih gampang diwaca. Lan kode kurang kita duwe, kurang kasempatan kanggo salah ketik utawa kesalahan liyane."

"Aku bungah sing seneng. Miturut cara, kita bisa nambah catchlan finallypamblokiran kanggo try-with-resources statement. Utawa sampeyan ora bisa nambah yen padha ora needed.

Sawetara variabel ing wektu sing padha

"Sampeyan bisa uga kerep nemoni kahanan nalika sampeyan kudu mbukak sawetara file ing wektu sing padha. Coba sampeyan nyalin file, dadi sampeyan butuh rong obyek: file saka ngendi sampeyan nyalin data lan file sing sampeyan nyalin data. .

"Ing kasus iki, trystatement -with-resources ngijini sampeyan nggawe siji nanging sawetara obyek ing. Kode sing nggawe obyek kudu dipisahake dening titik koma. Punika tampilan umum statement iki:

try (ClassName name = new ClassName(); ClassName2 name2 = new ClassName2())
{
   Code that works with the name and name2 variables
}

Tuladha file salinan:

Kode singkat Kode dawa
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 = input.readAllBytes();
   output.write(buffer);
}
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

FileInputStream input = null;
FileOutputStream output = null;

try
{
   input = new FileInputStream(src);
   output = new FileOutputStream(dest);

   byte[] buffer = input.readAllBytes();
   output.write(buffer);
}
finally
{
   if (input!=null)
      input.close();
   if (output!=null)
      output.close();
}

"Inggih, apa sing bisa kita ucapake ing kene? try-with-resources iku apik banget!"

"Apa sing bisa kita ucapake yaiku kita kudu nggunakake."