1. Sumber daya eksternal

Minangka program Java mlaku, kadhangkala sesambungan karo entitas njaba mesin Java. Contone, karo file ing disk. Entitas kasebut biasane disebut sumber daya eksternal. Sumber daya internal yaiku obyek sing digawe ing mesin Java.

Biasane, interaksi ngetutake skema iki:

Pernyataan Try-with-resources

sumber daya nelusuri

Sistem operasi kanthi ketat nglacak sumber daya sing kasedhiya, lan uga ngontrol akses bareng saka macem-macem program. Contone, yen siji program ngganti file, program liyane 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 entuk lan / utawa ngeculake sumber daya. Yen sumber sibuk, mung program sing entuk bisa digunakake. Yen sumber daya gratis, program apa wae bisa entuk.

Bayangake yen kantor sampeyan wis nuduhake cangkir kopi. Yen wong njupuk cangkir, wong liya ora bisa njupuk maneh. Nanging yen cangkir wis digunakake, dikumbah, lan dilebokake maneh ing panggonane, banjur sapa wae bisa njupuk maneh. Kahanan karo kursi ing bis utawa subway padha. Yen kursi gratis, sapa wae bisa njupuk. Yen kursi wis dikuwasani, banjur dikuwasani dening wong sing njupuk.

Entuk sumber daya eksternal .

Saben program Java wiwit nggarap file ing disk, mesin Java njaluk akses eksklusif menyang sistem operasi. Yen sumber daya gratis, mesin Java entuk.

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

Sistem operasi njaga dhaptar sumber daya sing dikuwasani saben program sing mlaku. Yen program sampeyan ngluwihi watesan sumber daya sing ditemtokake, sistem operasi ora bakal menehi sumber daya anyar maneh.

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

Kabar ala yaiku yen sampeyan nulis aplikasi server (lan akeh aplikasi server sing ditulis ing Jawa), server sampeyan kudu bisa mlaku nganti pirang-pirang dina, minggu, lan wulan tanpa mandheg. 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 saka sasi kerja stabil.


2. close()cara

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

Ing ngisor iki kita nyedhiyakake conto program sing nulis soko menyang file lan banjur nutup file kasebut yen wis rampung, yaiku mbebasake sumber daya sistem operasi. Iku katon 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

Sawise nggarap file (utawa sumber daya eksternal liyane), sampeyan kudu nelpon close()metode kasebut ing obyek sing disambung menyang sumber eksternal.

Pangecualian

Iku kabeh katon prasaja. Nanging pangecualian bisa kedadeyan nalika program mlaku, lan sumber daya eksternal ora bakal dirilis. Lan iku ala banget.

Kanggo mesthekake yen close()cara 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();
}

Kode iki ora bakal dikompilasi, amarga outputvariabel kasebut diumumake ing try {}blok kasebut, 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();
}

Ora apa-apa, nanging ora bakal bisa yen ana kesalahan nalika nggawe obyek FileOutputStream, 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();
}

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

Kapindho, close()cara kasebut tansah diarani ing finallyblok, sing 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();
}

Sanadyan kita ora nganggep catchblok kasebut, sing bisa diilangi, banjur 3 baris kode kita dadi 10. Nanging kita mung mbukak file kasebut lan nulis 1. A sethitik cumbersome, ora sampeyan mikir?


3. try-karo-sumber daya

Lan ing kene para pangripta Jawa mutusake kanggo naburake gula sintaksis marang kita. Diwiwiti karo versi 7th, Jawa duwe trystatement -with-resources anyar.

Iki digawe kanthi tepat kanggo ngatasi masalah kanthi telpon wajib kanggo close()metode kasebut. Kasus umum katon cukup prasaja:

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

Iki minangka variasi liya saka try pernyataan kasebut . Sampeyan kudu nambah kurung sawise trytembung kunci, banjur nggawe obyek kanthi sumber daya eksternal ing njero kurung. Kanggo saben obyek ing kurung, compiler nambah finallybagean lan telpon kanggo close()cara.

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

Kode sing nggunakake try-with-resources luwih cendhak lan luwih gampang diwaca. Lan kode kurang kita duwe, kurang kasempatan kanggo nggawe typo utawa kesalahan liyane.

Miturut cara, kita bisa nambah catchlan finallymblokir trystatement -with-resources. Utawa sampeyan ora bisa nambah yen ora perlu.



4. Sawetara variabel ing wektu sing padha

Miturut cara, sampeyan bisa uga kerep nemoni kahanan nalika sampeyan kudu mbukak sawetara file ing wektu sing padha. Contone, sampeyan nyalin file, dadi sampeyan butuh rong obyek: file sing 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 kanthi titik koma. Punika tampilan umum saka statement iki:

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

Tuladha file salinan:

Kode dawa Kode singkat
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();
}
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);
}

Nah, apa sing bisa kita ucapake ing kene? try-karo-sumber daya iku apik banget!


5. AutoCloseableantarmuka

Nanging ora mung kuwi. Sing maca enten bakal langsung golek pitfalls sing mbatesi carane statement iki bisa Applied.

Nanging kepiye trystatement -with-resources bisa digunakake yen kelas ora duwe close()metode? Inggih, umpamane ora ana sing diarani. Ora ana cara, ora masalah.

Nanging kepiye trystatement -with-resources bisa digunakake yen kelas duwe sawetara close()metode? Lan dheweke butuh argumentasi sing kudu diterusake? Lan kelas ora duwe close()cara tanpa paramèter?

Muga-muga sampeyan bisa takon dhewe pitakonan iki, lan bisa uga liyane.

Kanggo ngindhari masalah kasebut, para pangripta Jawa nggawe antarmuka khusus sing diarani AutoCloseable, sing mung nduweni siji metode — close(), sing ora ana paramèter.

Dheweke uga nambahake watesan sing mung obyek kelas sing dileksanakakeAutoCloseable bisa diumumake minangka sumber daya ing trystatement -with-resources. Akibaté, obyek kasebut mesthi duwe close()metode tanpa paramèter.

Ngomong-ngomong, apa sampeyan mikir yen statement -with-resources bisa trynyatakake minangka sumber daya obyek sing kelas duwe close()metode dhewe tanpa paramèter nanging ora dileksanakake AutoCloseable?

Kabar ala: Jawaban sing bener ora - kelas kudu ngetrapake AutoCloseableantarmuka.

Kabar apik: Jawa nduweni akeh kelas sing ngleksanakake antarmuka iki, saengga kabeh bisa mlaku kaya sing dikarepake.