1. URLवर्ग

हमने I/O स्ट्रीम के साथ काम करना सीखा है। हमने फाइलों के साथ काम करना सीखा है। हमें आगे क्या पढ़ना चाहिए? इंटरनेट सहित नेटवर्क के साथ काम करने के बारे में क्या? आशाजनक लगता है, है ना?

जावा में, इंटरनेट के साथ काम करना फाइलों के साथ काम करने से ज्यादा मुश्किल नहीं है। ठीक है, शायद थोड़ा सा।

इंटरनेट संसाधनों के साथ काम करने के लिए, जावा में एक विशेष वर्ग है — URL. यह स्टूल की तरह सरल है, जैसा कि अब आप देखेंगे।

एक वेब पेज प्राप्त करना

आपको क्या लगता है कि इंटरनेट से कुछ टेक्स्ट फ़ाइल डाउनलोड करने और उसकी सामग्री को स्क्रीन पर प्रदर्शित करने के लिए आपको कोड की कितनी पंक्तियों को लिखने की आवश्यकता है? 10? 100? 1000? या शायद 5?

कोड टिप्पणी
URL url = new URL("https://codegym.cc");
InputStream input = url.openStream();
byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
पृष्ठ के पथ के साथ एक URL ऑब्जेक्ट बनाता है URL ऑब्जेक्ट से
प्राप्त करता है सभी बाइट्स पढ़ता है और बाइट्स की एक सरणी देता है सरणी को एक स्ट्रिंग में बदलें स्ट्रिंग प्रदर्शित करें InputStream


HTML फ़ाइल की सामग्री स्क्रीन पर प्रदर्शित होगी:

कंसोल आउटपुट
<!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″>
    ...

Fileके साथ काम करने की तुलना करनाURL

URLFileया के समान है Path, लेकिन Pathफ़ाइल सिस्टम में संसाधन के पथ को संग्रहीत करता है, और URLइंटरनेट पर संसाधन के पथ को संग्रहीत करता है।

सभी जादू तब होता है जब हम विधि InputStreamके लिए एक कॉल के लिए एक वस्तु धन्यवाद प्राप्त करते हैं। openStream()यह एक साधारण वस्तु है, और हम पहले ही इसका अंदर और बाहर अध्ययन कर चुके हैं। वस्तु मिलने के बाद सब कुछ स्पष्ट हो जाता है InputStream। आखिरकार, हम पहले से ही जानते हैं कि इससे डेटा कैसे प्राप्त किया जाए।

एक नज़र डालें: केवल पहली दो पंक्तियाँ भिन्न हैं, और केवल थोड़ी सी। और अब आप इसे देख सकते हैं - मानकीकरण का लाभ और डेटा स्ट्रीम की श्रृंखलाओं के साथ काम करना:

इंटरनेट के साथ काम करना एक फाइल के साथ काम करना
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. URLConnectionवर्ग

इंटरनेट से केवल डेटा पढ़ने के अलावा, हम डेटा अपलोड भी कर सकते हैं। डेटा अपलोड करना इसे पढ़ने से कहीं अधिक जटिल है। आपको कुछ और तरीकों की आवश्यकता होगी। उदाहरण के लिए:

कोड टिप्पणी
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
पृष्ठ के पथ के साथ एक URL ऑब्जेक्ट बनाएँ
एक दो-तरफ़ा कनेक्शन बनाएँ


एक आउटपुट स्ट्रीम प्राप्त करें
इसमें डेटा डालें


एक इनपुट स्ट्रीम प्राप्त करें
इससे डेटा पढ़ें

ध्यान दें कि अब हम url.openStream()यहां विधि नहीं कहते हैं। इसके बजाय, हम एक लंबा रास्ता अपनाते हैं:

  • URLConnection.openConnection()हम पहले विधि का उपयोग करके एक स्थिर दो-तरफ़ा कनेक्शन स्थापित करते हैं
  • फिर हमें विधि का उपयोग करके डेटा भेजने connection.getOutputStream()और सर्वर को डेटा भेजने के लिए एक स्ट्रीम मिलती है
  • फिर हम विधि का उपयोग करके डेटा पढ़ने के लिए एक धारा प्राप्त करते हैं connection.getInputStream()और उससे डेटा पढ़ना शुरू करते हैं।

संसाधन प्रबंधन

कड़ाई से बोलना, हमें try-with-resourcesसुरक्षित संचालन के लिए सभी धाराओं को एक ब्लॉक में लपेट देना चाहिए। और नंगे InputStreamऔर OutputStreamकुछ और सुविधाजनक में लपेटने में कोई दिक्कत नहीं होगी। उदाहरण के लिए, में PrintStreamऔर BufferedReader

यदि हम वह सब करते हैं, तो हमारा कोड कुछ इस प्रकार दिखाई देगा:

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. नेटवर्क के साथ काम करने के उदाहरण

आइए इंटरनेट से कुछ डाउनलोड करें। और न केवल इसे डाउनलोड करें, बल्कि इसे डिस्क पर सेव करें।

उदाहरण के लिए, चलिए एक प्रोग्राम लिखते हैं जो गूगल होमपेज से डिस्क में इमेज सेव करता है।

सिद्धांत रूप में, यहाँ कुछ भी जटिल नहीं है। अपने सरलतम रूप में, यह कोड इस तरह दिखेगा:

फ़ाइल को डिस्क पर सहेजना
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);

पहली तीन पंक्तियों की मदद से, हम एक इंटरनेट संसाधन से एक डेटा स्ट्रीम प्राप्त करते हैं - एक चित्र से।

चौथी पंक्ति में, हम उस फ़ाइल का नाम बनाते हैं जिसमें हम छवि को सहेजेंगे। नाम कुछ भी हो सकता है, लेकिन फ़ाइल एक्सटेंशन को इंटरनेट पर चित्र के विस्तार से मेल खाना चाहिए। इससे स्थानीय छवि दर्शक इसे सही तरीके से खोल सकेंगे।

और अंत में, अंतिम पंक्ति Filesक्लास के copyतरीकों में से एक है। कक्षा Filesमें उनमें से कई हैं। यह विधि, जिसका हमने उपयोग किया है, एक बाइट स्ट्रीम ( InputStream) को इसके पहले पैरामीटर के रूप में लेती है, और दूसरे पैरामीटर के रूप में - फ़ाइल का नाम जहां डेटा लिखा जाना चाहिए।

सैद्धांतिक रूप से, यदि URLछवि छोटी होती, तो यह कोड एक पंक्ति में भी लिखा जा सकता था:

डेटा को स्ट्रीम से फ़ाइल में कॉपी करना
Files.copy(
   new URL("https://www.google.com/logo.png").openStream(),
   Path.of("c:\\GoogleLogo.png")
);

बेशक, आपको इसे इस तरह लिखने की ज़रूरत नहीं है , लेकिन यह उदाहरण दर्शाता है कि जावा में I/O स्ट्रीम कितनी सुविधाजनक और शक्तिशाली हैं।