1. URLklase

Pinag-aralan namin ang pagtatrabaho sa mga stream ng I/O. Nag-aral kami ng pagtatrabaho sa mga file. Ano ang susunod nating pag-aaralan? Paano ang tungkol sa pagtatrabaho sa network, kabilang ang Internet? Mukhang may pag-asa, hindi ba?

Sa Java, ang pagtatrabaho sa Internet ay hindi mas mahirap kaysa sa pagtatrabaho sa mga file. Well, siguro konti lang.

Upang gumana sa mga mapagkukunan ng Internet, ang Java ay may espesyal na klase — URL. Ito ay kasing simple ng isang dumi, tulad ng makikita mo ngayon.

Pagkuha ng web page

Ilang linya ng code sa tingin mo ang kailangan mong isulat upang mag-download ng ilang text file mula sa Internet at ipakita ang mga nilalaman nito sa screen? 10? 100? 1000? O baka 5?

Code Tandaan
URL url = new URL("https://codegym.cc");
InputStream input = url.openStream();
byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
Gumagawa ng URL object na may path patungo sa page
Kumuha ng InputStreammula sa URL object
Binabasa ang lahat ng byte at nagbabalik ng array ng byte
I-convert ang array sa isang string
Ipakita ang string

Ang mga nilalaman ng isang HTML file ay ipapakita sa screen:

Output ng console
<!DOCTYPE html><html lang="ru" class="light"><head>
    <meta charset="utf-8″>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1″>
    ...

Paghahambing ng pagtatrabaho sa FileatURL

URLay katulad ng Fileo Path, ngunit Pathiniimbak ang landas patungo sa isang mapagkukunan sa file system, at URLiniimbak ang landas patungo sa isang mapagkukunan sa Internet.

Ang lahat ng magic ay nangyayari kapag nakakuha tayo ng isang InputStreambagay salamat sa isang tawag sa openStream()pamamaraan. Ito ay isang ordinaryong bagay, at napag-aralan na natin ito sa loob at labas. Ang lahat ay nagiging halata pagkatapos nating makuha ang InputStreambagay. Pagkatapos ng lahat, alam na natin kung paano kumuha ng data mula dito.

Tingnan: ang unang dalawang linya lamang ang naiiba, at bahagyang lamang. At ngayon ay makikita mo na ito — ang bentahe ng standardisasyon at pagtatrabaho sa mga chain ng data stream:

Paggawa gamit ang Internet Paggawa gamit ang isang file
URL url = new URL("https://codegym.cc");
InputStream input = url.openStream();

byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
File file = new File("c:\\readme.txt");
InputStream input = new FileInputStream(file);

byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);


2. URLConnectionklase

Bilang karagdagan sa simpleng pagbabasa ng data mula sa Internet, maaari rin tayong mag-upload ng data. Ang pag-upload ng data ay mas kumplikado kaysa sa pagbabasa nito. Kakailanganin mo ang ilang higit pang mga pamamaraan. Halimbawa:

Code Tandaan
URL url = new URL("https://codegym.cc");
URLConnection connection = url.openConnection();

// Get a stream for sending data
OutputStream output = connection.getOutputStream();
output.write(1); // Send data

// Get a stream for reading data
InputStream input = connection.getInputStream();
int data = input.read(); // Read data
Gumawa ng URL object na may path sa page
Lumikha ng two-way na koneksyon


Kumuha ng output stream
Maglagay ng data dito


Kumuha ng input stream
Magbasa ng data mula dito

Tandaan na hindi na namin tinatawag ang url.openStream()pamamaraan dito. Sa halip, mas mahabang ruta ang dadaan namin:

  • Magtatag muna kami ng isang matatag na two-way na koneksyon gamit ang URLConnection.openConnection()pamamaraan
  • Pagkatapos ay nakakakuha kami ng isang stream upang magpadala ng data gamit ang connection.getOutputStream()pamamaraan at magpadala ng data sa server
  • Pagkatapos ay makakakuha kami ng isang stream para sa pagbabasa ng data gamit ang connection.getInputStream()pamamaraan at simulan ang pagbabasa ng data mula dito.

Pamamahala ng mapagkukunan

Sa mahigpit na pagsasalita, dapat nating balutin ang lahat ng mga stream sa isang try-with-resourcesbloke para sa ligtas na paghawak. At hindi masakit na balutin ang hubad InputStreamat OutputStreamsa isang bagay na mas maginhawa. Halimbawa, sa PrintStreamat BufferedReader.

Kung gagawin natin ang lahat ng iyon, magiging ganito ang hitsura ng ating code:

URL url = new URL("https://codegym.cc");
URLConnection connection = url.openConnection();

// Send data
try (OutputStream output = connection.getOutputStream();
   PrintStream sender = new PrintStream(output))
{
   sender.println("Hello");
}

// Read data
try(InputStream input = connection.getInputStream();
   BufferedReader reader = new BufferedReader(new InputStreamReader(input)))
{
   while (reader.ready())
      System.out.println(reader.readLine());
}

3. Mga halimbawa ng pagtatrabaho sa network

Mag-download tayo ng isang bagay mula sa Internet. At hindi lamang i-download ito, ngunit i-save ito sa disk.

Halimbawa, magsulat tayo ng isang programa na nagse-save ng isang imahe mula sa homepage ng Google patungo sa disk.

Sa prinsipyo, walang kumplikado dito. Sa pinakasimpleng anyo nito, ang code na ito ay magiging ganito:

Nagse-save ng file sa disk
String image = "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png";
URL url = new URL(image);
InputStream input = url.openStream();

Path path = Path.of("c:\\GoogleLogo.png");
Files.copy(input, path);

Sa tulong ng unang tatlong linya, nakakatanggap kami ng stream ng data mula sa isang mapagkukunan ng Internet — mula sa isang larawan.

Sa ika-apat na linya, nilikha namin ang pangalan ng file kung saan namin ise-save ang imahe. Ang pangalan ay maaaring kahit ano, ngunit ang extension ng file ay dapat tumugma sa extension ng larawan sa Internet. Papayagan nito ang mga lokal na tumitingin ng imahe na buksan ito nang tama.

At sa wakas, ang huling linya ay isa sa mga pamamaraan Filesng klase copy. Ang Filesklase ay may ilan sa kanila. Ang pamamaraang ito, na ginamit namin, ay kumukuha ng byte stream ( InputStream) bilang unang parameter nito, at bilang pangalawang parameter — ang pangalan ng file kung saan dapat isulat ang data.

Sa teoryang, kung URLmaikli ang larawan, maaaring maisulat ang code na ito sa isang linya:

Pagkopya ng data mula sa isang stream patungo sa isang file
Files.copy(
   new URL("https://www.google.com/logo.png").openStream(),
   Path.of("c:\\GoogleLogo.png")
);

Siyempre, hindi mo kailangang isulat ito nang ganito, ngunit ang halimbawang ito ay nagpapakita kung gaano maginhawa at malakas ang mga stream ng I/O sa Java.