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 |
|---|---|
|
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ışı |
|---|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
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 |
|---|
|
İ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 |
|---|
|
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.
GO TO FULL VERSION