1. URLवर्ग

आम्ही I/O प्रवाहांसह काम करण्याचा अभ्यास केला आहे. आम्ही फाइल्ससह काम करण्याचा अभ्यास केला आहे. आपण पुढे काय अभ्यास केला पाहिजे? इंटरनेटसह नेटवर्कसह कार्य करण्याबद्दल काय? आशादायक वाटते, नाही का?

जावामध्ये, फायलींसह काम करण्यापेक्षा इंटरनेटसह कार्य करणे कठीण नाही. बरं, कदाचित थोडेसे.

इंटरनेट संसाधनांसह कार्य करण्यासाठी, Java मध्ये एक विशेष वर्ग आहे — 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. नेटवर्कसह कार्य करण्याची उदाहरणे

चला इंटरनेटवरून काहीतरी डाउनलोड करूया. आणि ते फक्त डाउनलोड करू नका, परंतु डिस्कवर जतन करा.

उदाहरणार्थ, चला एक प्रोग्राम लिहूया जो Google होमपेजवरून डिस्कवर प्रतिमा जतन करतो.

तत्वतः, येथे काहीही क्लिष्ट नाही. त्याच्या सर्वात सोप्या स्वरूपात, हा कोड यासारखा दिसेल:

फाइल डिस्कवर सेव्ह करत आहे
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")
);

अर्थात, तुम्हाला ते असे लिहिण्याची गरज नाही , परंतु हे उदाहरण Java मध्ये किती सोयीस्कर आणि शक्तिशाली I/O प्रवाह आहेत हे दाखवते.