مقدمة
الكلمة 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
يشير إلى رابط درس معين من موقعنا, ثم حاولنا عرض كافة المعلومات التي يمكن استخراجها من الرابط.
ملاحظة: تعمدنا عرض جميع المعلومات التي يمكن استخراجها من الرابط سواء كانت موجودة أو غير موجودة, لاحظ أن أي معلومة حاولنا عرضها و كانت غير موجودة في الرابط ستوضع القيمة 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/java/java-overview/index.php#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:80/java/java-overview/index.php#article_2
Protocol : https
Authority : harmash.com:80
Host name : harmash.com
File name : /java/java-overview/index.php
Path : /java/java-overview/index.php
Port : 80
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/java/java-overview/index");
// 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/java/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 || [];
...
المثال الثالث
هنا سنعيد نفس المثال الثاني من حيث الفكرة و لكننا إستخدمنا هذه المرة الـ 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/java/java-overview/index");
// 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/java/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 || [];
...