Programming Basics SQL HTML CSS JavaScript React Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Linux Learn Typing

Javaالكلاس URL في جافا

  • مقدمة
  • كونستركتورات الكلاس URL
  • دوال الكلاس URL
  • أمثلة شاملة

مقدمة

الكلمة URL إختصار لـ Uniform Resource Locator و هي تعني كل المعلومات المذكورة في الرابط و التي تشير إلى مصدر محدد للبيانات.

الكلاس URL مصمم بشكل عام لتجهيز روابط الملفات التي سنتعامل معها عن بعد عبر شبكة الإنترنت.


بناؤه

public final class URL
extends Object
implements Serializable 

المعلومات الأساسية في أي رابط هي: protocol://host:port/path/filename

  • protocol: نضع مكانها إسم البروتوكول المستخدم في عملية الإتصال مثل http أو https.
  • host: نضع مكانها إسم الموقع مثل harmash.com.
  • port: نضع مكانها بورت البرنامج ( أو البروتوكول ) المستخدم من قبل العميل, فمثلاً https يستخدم البورت 443.
  • path: نضع مكانها إسم المجلد الذي نريد الدخول إليه على السيرفر مثل مجلد home.
  • filename: نضع مكانها إسم الملف الذي نريد تصفحه أو تحميله إلخ.. مثل الملف index.php.

إذا قمنا بتركيب جميع المعلومات المتفرقة الذتي ذكرناها, سنحصل على رابط واحد و هو رابط الدرس الأول في دروس جافا.

كونستركتورات الكلاس URL

بشكل عام عندما تنشئ كائن نوعه URL فأنت تنشئ كائن يمثل رابط.

الجدول التالي يحتوي على بعض الكونستركتورات الموجودين في الكلاس URL.

الكونستركتور مع تعريفه
1 public URL(String url)
throws MalformedURLException
ينشئ كائن نوعه URL من خلال النص الذي نمرره له.
النص الذي نقوم بإدخاله يمثل كافة المعلومات التي تشكل رابط.
في حال وجود أي خطأ في المعلومات المدخلة فيه يتم رمي الإستثناء MalformedURLException.
2 public URL(String protocol, String host, int port, String file)
throws MalformedURLException
ينشئ كائن نوعه URL مع تحديد البروتوكول + إسم الموقع + رقم البورت + إسم الملف الذي سيتم الوصول إليه من خلاله.
في حال وجود أي خطأ في المعلومات المدخلة فيه يتم رمي الإستثناء MalformedURLException.
3 public URL(String protocol, String host, String file)
throws MalformedURLException
ينشئ كائن نوعه URL مع تحديد البروتوكول + إسم الموقع + إسم الملف الذي سيتم الوصول إليه من خلاله.
عندما لا تقوم بتحديد رقم البورت بنفسك, يقوم باستخدام رقم البورت الإفتراضي للبروتوكول المذكور.
في حال وجود أي خطأ في المعلومات المدخلة فيه يتم رمي الإستثناء MalformedURLException.

دوال الكلاس URL

الجدول التالي يحتوي على دوال الكلاس URL.

الدالة مع تعريفها
1 public String getHost() ترجع نص يمثل البروتوكول + إسم الموقع الموضوعين في كائن الـ URL.
2 public String getAuthority() ترجع نص يمثل البروتوكول + إسم الموقع + رقم البورت (في حال كان مذكور في الرابط) الموضوعين في كائن الـ URL.
3 public String getProtocol() ترجع إسم البروتوكول الذي يستخدمه كائن الـ URL للإتصال بالشبكة.
4 public int getPort() ترجع رقم البورت الخاص بالبروتوكول الذي يستخدمه كائن الـ URL للإتصال بالشبكة.
ترجع 1- في حال عدم تحديد رقم البورت.
5 public int getDefaultPort() ترجع رقم البورت الإفتراضي للبروتوكول الذي يستخدمه كائن الـ URL للإتصال بالشبكة.
ترجع 1- في حال عدم وجود رقم بورت إفتراصي.
6 public String getPath() ترجع نص يمثل مسار الملف المراد الوصول إليه عن طريق كائن الـ URL.
ترجع نص فارغ في حال كان مسار الملف غير محدد.
7 public String getFile() ترجع نص يمثل مسار الملف المراد الوصول إليه عن طريق كائن الـ URL + الـ Query (في حال كان يوجد Query في الرابط).
في حال عدم وجود Query في الرابط, تعطي نفس نتيجة الدالة getPath().
ترجع نص فارغ في حال كان المسار غير محدد في الرابط.
8 public String getQuery() ترجع جزئية الـ Query الموضوعة في كائن الـ URL.
ترجع null في حال عدم وجود Query في كائن الـ URL.
9 public String getRef() ترجع جزئية الـ Anchor في كائن الـ URL.
Anchor تعني عنصر محدد موجود في صفحة الويب, و يقال له مرجع الصفحة.
لتحديد الـ Anchor في كائن الـ URL, يجب وضعه بعد إسم الملف ( الذي شير إلى صفحة محددة في الويب ) و نضع الرمز # قبله.

مثال
هذا الرابط يفتح الصفحة الأولى في المجلد الذي يحتوي على دروس جافا و يضعك مباشرةً في الفقرة الثانية.
https://harmash.com/tutorials/java/overview#article_2
10 public String getUserInfo() ترجع معلومات المستخدم الموضوعة في كائن الـ URL في حال كانت ظاهرة فيه.
ترجع null في حال كان لا يوجد أي معلومة خاصة بالمستخدم في كائن الـ URL.

أمثلة
  • http://info@hamash.com
    هذا رابط يحتوي على إيميل شخص من موقع harmash.com، إذاً الدالة هنا ترجع info.
  • http://info:1234@hamash.com
    هذا رابط يحتوي على إيميل و كلمة مرور شخص من موقع harmash.com، إذاً الدالة هنا ترجع info:123.

ملاحظة: هذه مجرد أمثلة, كملة المرور يجب عدم إظهارها أبداً في الرابط حتى لا يتم سرقة الحساب.

11 public String toExternalForm() ترجع محتوى كائن URL كنص واحد نوعه String.
12 public String toString() ترجع محتوى كائن URL كنص واحد نوعه String.
13public boolean equals(Object obj) تقارن كائن الـ URL الذي قام باستدعائها مع الكائن الذي نمرره لها كـ Argument.
إذاً تقارن الرابط الذي قام باستدعائها مع الرابط الذي نمرره لها كـ Argument.
ترجع true في حال كانا متطابقين.
14 public boolean sameFile(URL otherURL) تقارن كائن الـ URL الذي قام باستدعائها مع كائن الـ URL الذي نمرره لها كـ Argument.
إذاً تقارن الرابط الذي قام باستدعائها مع الرابط الذي نمرره لها كـ Argument.
ترجع true في حال كانا متطابقين.
15 public InputStream openStream() throws IOException تنشئ إتصال مباشر بين البرنامج و الملف الموجود في الموقع الذي يشير له كائن الـ URL.
في حال نجح الإتصال, ترجع كائن نوعه InputStream يتيح لك قراءة محتوى هذا الملف فقط.
في حال فشل الإتصال يتم رمي إستثناء.
16 public URLConnection openConnection()
throws IOException
تنشئ إتصال مباشر بين البرنامج و الملف الموجود في الموقع الذي يشير له كائن الـ URL.
في حال نجح الإتصال, ترجع كائن نوعه URLConnection يتيح لك قراءة محتوى هذا الملف أو الكتابة فيه.
في حال فشل الإتصال يتم رمي إستثناء.
17 public URLConnection openConnection(Proxy proxy)throws IOException تنشئ إتصال بين البرنامج و الملف الموجود في الموقع الذي يشير له كائن الـ URL عن طريق Proxy Server.
إذاً هنا يوجد طرف ثالث يلعب دور الوسيط بين البرنامج الذي يحاول الوصول للملف و الموقع الذي يملك الملف.
  • في حال نجح الإتصال, ترجع كائن نوعه URLConnection يتيح لك قراءة محتوى هذا الملف أو الكتابة فيه.
  • في حال كان البروتوكول المستخدم لا يعمل مع Proxy Server, يتم تجاهل Proxy Server و يتم وصل طرفي الإتصال مباشرةً مع بعضهما.
  • في حال وضعت الثابت Proxy.NO_PROXY كـ Argument, أيضاً يتم تجاهل Proxy Server و يتم وصل طرفي الإتصال مباشرةً مع بعضهما.
  • في حال حدث خطأ بسبب الملف يتم رمي الإستثناء IOException.
  • في حال كان المستخدم لا يملك صلاحية لإستخدام الـ Proxy Server, يتم رمي الإستثناء SecurityException.
  • في حال وضعنا null كـ Argument أو لم نحدد الـ Proxy Server بشكل صحيح, يتم رمي الإستثناء IllegalArgumentException.

أمثلة شاملة


المثال الأول

في المثال التالي قمنا بتعريف كائن نوعه URL يشير إلى رابط درس معين من موقعنا, ثم حاولنا عرض كافة المعلومات التي يمكن استخراجها من الرابط.

ملاحظة: تعمدنا عرض جميع المعلومات التي يمكن استخراجها من الرابط سواء كانت موجودة أو غير موجودة, لاحظ أن أي معلومة حاولنا عرضها و كانت غير موجودة في الرابط ستوضع القيمة null أو 1- مكانها كما ذكرنا في الجدول السابق.

Main.java
import java.net.URL;        // URL هنا قمنا باستدعاء الكلاس
 
public class Main {
 
    public static void main(String[] args) {
 
        // الآن سنحاول إجراء إتصال عبر الشبكة للوصول إلى ملف محدد
        try
        {
            // يشير إلى رابط الدرس الأول في دورة جافا و بالتحديد الفقرة الثانية في الدرس url إسمه URL هنا قمنا بتعريف كائن نوعه
            URL url = new URL("https://harmash.com:443/tutorials/java/overview#article_2");
 
            // هنا قمنا بعرض المعلومات المتوفرة و الغير متوفرة في الرابط
            System.out.println("URL: " + url.toString());
            System.out.println("Protocol: " + url.getProtocol());
            System.out.println("Authority: " + url.getAuthority());
            System.out.println("Host name: " + url.getHost());
            System.out.println("File name: " + url.getFile());
            System.out.println("Path: " + url.getPath());
            System.out.println("Port: " + url.getPort());
            System.out.println("Default Port: " + url.getDefaultPort());
            System.out.println("Reference: " + url.getRef());
            System.out.println("Query: " + url.getQuery());
            System.out.println("User Info: " + url.getUserInfo());
        }
        catch( Exception e ) {
            e.printStackTrace();
        }
 
    }
 
}

سنحصل على النتيجة التالية عند التشغيل.

URL: https://harmash.com:443/tutorials/java/overview#article_2
Protocol: https
Authority: harmash.com:443
Host name: harmash.com
File name: /tutorials/java/overview
Path: /tutorials/java/overview
Port: 443
Default Port: 443
Reference: article_2
Query: null
User Info: null


المثال الثاني

في المثال التالي قمنا بتعريف كائن نوعه URL يشير إلى رابط درس معين من موقعنا.
بعدها قمنا باستدعاء الدالة openStream() و التي ترجع كائن نوعه URLConnection يتيح لنا قراءة محتوى الملف الذي يشير إليه الرابط.
كائن الـ URLConnection قمنا بتخزينه في كائن نوعه InputStream حتى نستطيع قراءة محتوى الملف في البرنامج.

في الأخير قمنا بإنشاء حلقة while لقراءة محتوى الملف و تخزينه في متغير نوعه String إسمه data.

ملاحظة: هنا ستتعلم طريقة قراءة محتوى أي ملف من موقع ما مهما كان نوعه سواء صورة, فيديو ملف نصي.

Main.java
import java.net.URL;               // URL هنا قمنا باستدعاء الكلاس
import java.io.InputStream;        // InputStream هنا قمنا باستدعاء الكلاس
 
public class Main {
 
    public static void main(String[] args) {
 
        // قمنا بتجهيز هذا المتغير من أجل تخزين محتوى الملف فيه
        String data = "";
 
        // الآن سنحاول إجراء إتصال عبر الشبكة للوصول إلى ملف محدد و قراءة محتواه
        try
        {
            // يشير إلى رابط الدرس الأول في دورة جافا url إسمه URL هنا قمنا بتعريف كائن نوعه
            URL url = new URL("https://harmash.com/tutorials/java/overview");
 
            // is في الكائن URL هنا قمنا بتخزين الملف الذي يشير له الكائن
            InputStream is = url.openStream();
 
            // data و تخزنهم في المتغير is هنا قمنا بإنشاء حلقة تمر على جميع الأحرف الموجودة في الكائن
            int c;
            while ((c = is.read()) != -1)
            {
                data += (char)c;
            }
 
            // هنا قمنا بإغلاق الإتصال مع الملف
            is.close();
 
            // هنا قمنا بعرض محتوى الملف
            System.out.println(data);
        }
        catch( Exception e ) {
            e.printStackTrace();
        }
 
    }
 
}

عند تشغيل البرنامج سيتم عرض محتوى الصفحة harmash.com/tutorials/java/overview, أي كود الصفحة التي يشير لها الرابط.

لاحظ أن الأحرف العربية لم تظهر بشكل صحيح, هذه المشكلة سببها عدم تحديد الترميز المستخدم في القراءة, و حللنا هذه المشكلة في المثال الثالث.

<!DOCTYPE html>
<html lang="ar">

<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="دورة شاملة في لغة جافا تبدأ معك من الصفر حتى الإحتراف">
    <meta name="keywords" content="">
   
    <!-- Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-66898688-2"></script>
    <script>
    window.dataLayer = window.dataLayer || [];
...


المثال الثالث

هنا سنعيد نفس المثال الثاني من حيث الفكرة و لكننا إستخدمنا هذه المرة الـ Buffer عند قراءة محتوى الملف لتسريع عملية القراءة و بالتالي لأداء أفضل.

ملاحظة: هنا ستتعلم طريقة قراءة محتوى أي ملف نصي من موقع ما مع مراعاة أي نوع ترميز مستخدم في الملف.

المثال الثالث

Main.java
import java.net.URL;                       // URL هنا قمنا باستدعاء الكلاس
import java.io.BufferedReader;             // BufferedReader هنا قمنا باستدعاء الكلاس
import java.io.InputStream;                // InputStream هنا قمنا باستدعاء الكلاس
import java.io.InputStreamReader;          // InputStreamReader هنا قمنا باستدعاء الكلاس
 
public class Main {
 
    public static void main(String[] args) {
 
        // قمنا بتجهيز هذا المتغير من أجل تخزين محتوى الملف فيه
        String data = "";
 
        // الآن سنحاول إجراء إتصال عبر الشبكة للوصول إلى ملف محدد و قراءة محتواه
        try
        {
            // يشير إلى رابط الدرس الأول في دورة جافا url إسمه URL هنا قمنا بتعريف كائن نوعه
            URL url = new URL("https://harmash.com/tutorials/java/overview");
 
            // is في الكائن URL هنا قمنا بتخزين الملف الذي يشير له الكائن
            InputStream is = url.openStream();
 
            // Buffer لحل مشكلة الترميز و وضع محتوى الملف في الـ InputStreamReader إلى النوع is هنا قمنا بتحويل نوع الكائن
            InputStreamReader isr = new InputStreamReader(is, "UTF-8");
 
            // Buffer يتيح لنا قراءة محتوى الملف الموجود في الـ br الكائن
            BufferedReader br = new BufferedReader(isr);
 
            // data و تخزنهم في المتغير br هنا قمنا بإنشاء حلقة تمر على جميع الأحرف الموجودة في الكائن
            int c;
            while ((c = br.read()) != -1)
            {
                data += (char)c;
            }
 
            // هنا قمنا بإغلاق الإتصال مع الملف
            is.close();
            isr.close();
            br.close();
 
            // هنا قمنا بعرض محتوى الملف
            System.out.println(data);
        }
        catch( Exception e ) {
            e.printStackTrace();
        }
 
    }
 
}

عند تشغيل البرنامج سيتم عرض محتوى الصفحة harmash.com/tutorials/java/networking, أي كود الصفحة التي يشير لها الرابط.

<!DOCTYPE html>
<html lang="ar">

<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="دورة شاملة في لغة جافا تبدأ معك من الصفر حتى الإحتراف">
    <meta name="keywords" content="">
   
    <!-- Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-66898688-2"></script>
    <script>
    window.dataLayer = window.dataLayer || [];
...