1. URLsınıf

G/Ç akışlarıyla çalışmayı inceledik. Dosyalarla çalışmayı inceledik. Bundan sonra ne çalışmalıyız? İnternet de dahil olmak üzere ağ ile çalışmaya ne dersiniz? Umut verici geliyor, değil mi?

Java'da İnternet ile çalışmak, dosyalarla çalışmaktan daha zor değildir. Şey, belki birazcık.

İnternet kaynaklarıyla çalışmak için Java'nın özel bir sınıfı vardır — URL. Şimdi göreceğiniz gibi, bir tabure kadar basit.

web sayfası alma

İnternetten bir metin dosyası indirmek ve içeriğini ekranda görüntülemek için kaç satır kod yazmanız gerektiğini düşünüyorsunuz? 10? 100? 1000? Ya da belki 5?

kod Not
URL url = new URL("https://codegym.cc");
InputStream input = url.openStream();
byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
Sayfanın yolu ile bir URL nesnesi oluşturur URL nesnesinden
bir alır Tüm baytları okur ve bir bayt dizisi döndürür Diziyi bir dizgeye dönüştürür Dizeyi görüntüler InputStream


Bir HTML dosyasının içeriği ekranda görüntülenecektir:

Konsol çıkışı
<!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″>
    ...

Fileve ile çalışmanın karşılaştırılmasıURL

URLFileveya ' ye benzer Path, ancak Pathdosya sisteminde bir kaynağa giden yolu saklar ve URLİnternet'teki bir kaynağa giden yolu saklar.

InputStreamYönteme yapılan tek bir çağrı sayesinde bir nesne elde ettiğimizde tüm sihir gerçekleşir openStream(). Bu sıradan bir nesne ve biz zaten onun içini ve dışını inceledik. Nesneyi aldıktan sonra her şey netleşir InputStream. Sonuçta, ondan nasıl veri alacağımızı zaten biliyoruz.

Bir göz atın: yalnızca ilk iki satır farklıdır ve yalnızca biraz farklıdır. Artık standardizasyonun ve veri akışı zincirleriyle çalışmanın avantajını görebilirsiniz:

İnternet ile çalışmak Bir dosya ile çalışma
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. URLConnectionsınıf

İnternetten veri okumaya ek olarak, veri de yükleyebiliriz. Veri yüklemek, onu okumaktan çok daha karmaşıktır. Birkaç yönteme daha ihtiyacınız olacak. Örneğin:

kod Not
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
Sayfanın yolu ile bir URL nesnesi oluşturun
İki yönlü bir bağlantı oluşturun


Bir çıkış akışı alın
İçine veri koyun


Bir giriş akışı alın
Ondan veri okuyun

Artık yöntemi burada çağırmadığımıza dikkat edin url.openStream(). Bunun yerine, daha uzun bir rota izliyoruz:

  • URLConnection.openConnection()Önce yöntemi kullanarak kararlı bir iki yönlü bağlantı kuruyoruz.
  • connection.getOutputStream()Ardından , yöntemi kullanarak veri göndermek ve sunucuya veri göndermek için bir akış elde ederiz.
  • Ardından, yöntemi kullanarak veri okumak için bir akış alırız connection.getInputStream()ve ondan veri okumaya başlarız.

Kaynak yönetimi

try-with-resourcesAçıkça söylemek gerekirse, güvenli kullanım için tüm akışları bir bloğa sarmalıyız . InputStreamVe çıplak ve OutputStreamdaha uygun bir şeye sarmanın zararı olmaz . Örneğin, içinde PrintStreamve BufferedReader.

Tüm bunları yaparsak, kodumuz şuna benzer:

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. Ağ ile çalışma örnekleri

İnternetten bir şeyler indirelim. Ve sadece indirmekle kalmayıp diske kaydedin.

Örneğin Google ana sayfasındaki bir görseli diske kaydeden bir program yazalım.

Prensip olarak, burada karmaşık bir şey yok. En basit haliyle, bu kod şöyle görünecektir:

Bir dosyayı diske kaydetme
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);

İlk üç satırın yardımıyla, bir İnternet kaynağından bir resimden bir veri akışı alıyoruz.

Dördüncü satırda ise görseli kaydedeceğimiz dosyanın adını oluşturuyoruz. Ad herhangi bir şey olabilir, ancak dosya uzantısı İnternet'teki resmin uzantısıyla eşleşmelidir. Bu, yerel resim görüntüleyicilerin onu doğru şekilde açmasına izin verecektir.

FilesVe son olarak, son satır, sınıfın yöntemlerinden biridir copy. Sınıfta Filesbirkaç tane var. Kullandığımız bu yöntem, InputStreamilk parametresi olarak bir bayt akışı ( ) ve ikinci parametre olarak verilerin yazılması gereken dosyanın adını alır.

Teorik olarak, URLgörüntünün kısa olması durumunda, bu kod tek bir satıra bile yazılabilir:

Bir akıştan bir dosyaya veri kopyalama
Files.copy(
   new URL("https://www.google.com/logo.png").openStream(),
   Path.of("c:\\GoogleLogo.png")
);

Elbette böyle yazmak zorunda değilsiniz , ancak bu örnek, Java'da I/O akışlarının ne kadar kullanışlı ve güçlü olduğunu gösteriyor.