۱۳۹۰ آذر ۱۱, جمعه

مقدمه ای بر Thread ها در جاوا

این مقاله شرح می‌دهد چگونه Thread ها در برنامه نویسی جاوا ایفای نقش می کنند. قبل از کنکاش در جزییات جاوا یک نگاه عمومی به thread ها مورد نیاز است.

به تعبیر ساده ، یک thread مسیر اجرای یک برنامه می‌باشد. امروزه بیشتر برنامه‌های نوشته شده مانند یک تک thread اجرا می‌شوند ، مسأله ای را فرض کنید باید در یک زمان چندین رویداد یا کنش اتفاق بیفتند. اجازه دهید بگوییم برای مثال، یک برنامه قادر نیست یک عکس را بکشد مادامیکه در حال خواندن اطلاعات ارسال شده از صفحه‌کلید است . این برنامه باید تمام توجه خود را معطوف به خواندن اطلاعات ارسال شده از صفحه‌کلید نماید و فاقد توانای برای کنترل بیش از یک رویداد در یک زمان می باشد.راه حل ایده‌آل برای این مشکل اجرای یکپارچه ی دو بخش یا بیشتر، از یک نرم‌افزار در یک زمان می باشد. Thread ها به ما این اجازه را می دهند.

نرم‌افزار های چند Thread همه ی توان خود را انجام می‌دهند تا چندین thread همزمان در یک تک برنامه اجرا شود.از یک نگاه منطقی مالتی تریدینگ به معنای این است که چندین خط از یک برنامه می‌تواند در یک زمان اجرا شود، به هر حال، این بدان معنی نیست که یک برنامه دو بار اجرا شود و بگوییم چندین خط از برنامه وجود دارد که در یک زمان اجرا شده است. در این حالت سیستم عامل با برنامه مثل دو فرایند مجزا رفتار می کند. در سیستم عامل یونیکس انشعاب یک جریان یک زیر شاخه با آدرس متفاوت برای هر دو کد و داده ایجاد می‌کند. به هر حال ()fork تعداد زیادی overhead برای سیستم عامل می‌سازد، باعث تمرکز عملیات بر روی cpu می شود. در عوض با شروع thread ، یک مسیر کار آمد برای اجرای برنامه ایجاد شده مادامی که هنوز در محدوده ی داده‌های اصلی می باشد. ایده ی تسهیم محدوده ی داده‌ها ایده ی بسیار مفیدی است، اما باعث برخی محدوده های به هم مرتبط می‌شود که بعداً در باره ی آن بحث خواهیم کرد.

ایجاد thread ها

آفریننده های جاوا دو روش دوست‌ داشتنی برای خلق thread ها ایجاد کرده اند: پیاده‌سازی یک رابط
(Interface)و توسعه ی یک کلاس. توسعه ی یک کلاس راهی است که جاوا، متد ها و متغییر ها را از کلاس‌های مادر به ارث می برد. این محدودیت در جاوا می‌تواند بوسیله ی پیاده‌سازی رابط برطرف شود که متداول ترین روش برای آفریدن thread هاست. ( توجه داشته باشید که عمل ارث بری فقط به کلاس این اجازه را می‌دهد که همانند یک thread اجرا شود. آن کلاس را شروع یا اجرا می کند.)

رابط ها(Interfaces) راهی را برای برنامه نویس تدارک می‌بیند تا این عمل را در زمینه یک کلاس قرار دهند.رابط ها برای آنکه ملزومات پیاده‌سازی کلاس‌ها را طراحی کنند به کار می‌روند. رابط همه چیز را تنظیم می کند و کلاس یا کلاس‌ها یی که رابط ها را پیاده‌سازی می‌کنند همه را به کار می اندازد. تنظیمات مختلف کلاس‌ها که رابط ها را پیاده‌سازی می‌کنند، همه و همه یک نقش را ایفا می کنند.

تفاوت‌هایی بین یک کلاس و یک رابط وجود دارد. اول، یک را بط می‌تواند فقط شامل متد های انتزاعی (abstract) و یا متغییرهای پایانی پایا ( static final variables )یا ثوابت باشند. به عبارت دیگر، کلاس‌ها می‌توانند متد ها را پیاده‌سازی کنند و همچنین شامل متغییر ها یی باشند که مقدار آنها ثابت نیست. دوم، یک رابط نمی‌تواند هر متدی را پیاده‌سازی کند. یک کلاسی که یک رابط را پیاده‌سازی می‌کند باید همه ی متد های تعریف شده در آن رابط را پیاده‌سازی کند. یک رابط توانایی آن را را دارد تا توسط دیگر رابط ها توسعه داده شود و (بر خلاف کلاس ها) می‌تواند توسط چندین رابط توسعه یابد. از این گذشته، یک رابط نمی‌تواند بوسیله ی یک عملگر جدید تعریف شود، برای مثال:

Runnable a=new Runnable();

مجاز نیست.
اولین روش برای آفریدن یک thread بست یک thread از کلاس آن است. این کار را فقط زمانی انجام دهید که کلاسی را که می‌خواهید به شکل thread بست دهید هرگز نیاز به بست آن کلاس به دیگر کلاس‌ها را نداشته باشید. این کلاس در بسته ی java.lang تعریف شده است که نیاز به وارد کردن این بسته دارید بنا بر این کلاس‌های ما از این تعریف آگاه می شوند.


import java.lang.*;
public class Counter extends Thread 
{                      
        public void run()                       
        {              
        ....            
        }
}
 
مثال بالایک کلاس جدید به نام Counter ایجاد میکند که کلاس Thread را بسط می‌دهد و متد Thread.run() را برای اجرای خود پیاده می کند. متد run جایی به کار می‌رود که همه ی وظایف کلاس Counter انجام شده باشد.


import java.lang.*;
public class Counter implements Runnable
{
        Thread T;                        
        public void run()                       
        {                              
        ....            
        }
}
 
 
در اینجا متد run در رابط Runnable تعریف و پیاده‌سازی شده است. توجه داشته باشید ما یک رابط از کلاس Thread همچون یک متغییر از کلاس Counter داریم. تنها تفاوت میان دو متد، پیاده‌سازی متد Runnable است، این کار انعطاف بیشتری در ایجاد کلاس Counter در اختیار ما قرار می دهد. در مثال بالا هنوز این فرصت وجود دارد که در صورت لزوم کلاس Counter، بسط داده شود. بیشتر کلاس‌های ساخته شده‌ای که نیاز به اجرا run به عنوان thread داشته ًباشند ، Runnable را پیاده ساری می‌کنند، از این رو آن‌ها برخی دیگر از وظایف کلاس‌های دیگر را احتمالاً بسط می‌دهند.

گمان نکنید که رابط Runnable هر کار واقعی را زمانی که Thread اجرا شده است انجام انجام می‌دهد. این تنها کلاس آفریده شده ایست، تا ایده ای برای طراحی کلاس thread باشد. در حقیقت، این یک محتوی بسیار کوچک است فقط یک متد انتزاعی (abstract). در اینجا تعریف رابط Runnable مستقیماً از منابع جاوا آمده است.

package java.lang;
public interface Runnable {    
        public abstract void run();
}
 
این همه ی آن چیزی است که رابط Runnable می نامیم.یک رابط فقط طرحی که کدام کلاس‌ها باید پیاده‌سازی شوند را ارائه می کند. در این حالت رابط Runnable،فقط بر روی متد run تمرکز می کند. بنا بر این، بیشتر کار در کلاس thread انجام می شود. یک نگاه نزدیک تر به یک بخش در تعریف کلاس thread این ایده رابه ما می‌دهد که چه چیز واقعاً در حال انجام است:

public class Thread implements Runnable {
...
        public void run() {    
                if (target != null) {  
                        target.run();   
                }
        }
...
} 
 
 
از کد بالا این مطلب آشکار است که کلاس thread همچنین رابط Runnable را پیاده‌سازی می کند.
 Thread.run چک می‌کند تا اطمینان یابد هدف کلاس ( کلاسی که می‌رود تا همانند یک thread اجرا شود)
 پوچ نیست، و سپس متد run  به عنوان هدف اجرا می شود. زمانی که این اتفاق بیفتد متد run هدف همانند thread خود
 اجرا خواهد شد.   
 
شروع و پایان
 
از آنجایی که روش‌های مختلفی برای ایجاد یک نمونه از thread در حال حاضر ارائه شده ، ما بحث خواهیم کرد که پیاده‌سازی 
 یک thread  ها با روش‌های در دسترس برای شروع و پایان آن‌ها با استفاده از یک اپلت کوچک شامل یک thread برای
 نمایش مکانیک:
مثال و کد:  CounterThread  
 
 اپلت بالا شمارش را از صفر شروع خواهد کرد و خروجی را  در یک پنجره و  در یک کنسول هردو به نمایش در خواهد آورد
 یک نگاه اجمالی این احساس را به ما می‌دهد که برنامه شمارش را شروع خواهد کرد و هر عدد را نمایش خواهد داد، اما این همه
 چیز نیست. یک نگاه دقیق‌تر به اجرای این اپلت هویت ,واقعی آن را آشکار خواهد کرد.

۱۳۸۹ بهمن ۱۰, یکشنبه

چگونه به نت بینز پلاگین بیفزاییم؟

۰- نت بینز را اجرا کنید
۱- از منو Tools گزینه ی Plugins را انتخاب کنید.
۲- سر برگ (تب) Download را انتخاب کنید.
۳- بر روی دکمه ی Add Plugins کلیک کنید.
۴- مسیر فایل پلاگین که به دات nbm ختم می شود را مشخص کنید.
۵- بر روی دکمه Install و در پایان بر روی دکمه OK کلیک کنید.

با سپاس از استاد شایسته علوی

۱۳۸۹ بهمن ۳, یکشنبه

مقدمه‌ای بر خطا یابی جاوا و نت بینز

English

نت بینز پشتیبانی قدرتمندی برای برنامه‌های جاوا تدارک دیده است. در این درسنامه ما نگاهی بر اصول خطا یابی می‌اندازیم ، ابتدا تنظیم نقطه شکست در برنامه و مقادیر بازجویی در مدتی که برنامه اجرا می‌شود.


شکل ۱ یک برنامه ساده جاوا نشان می‌دهد این یک برنامه پیشرفته ای نیست و فقط برای شروع درسنامه ما نوشته شده است.




برنامه ما شامل یک جمله چاپ می‌باشد ، چنین جمله‌ای بسیار ساده برای خطا یابی است . شکل ۲ خروجی برنامه را نمایش می دهد.

خب اجازه بدهید به قدم بعدی برویم و از ابزار خطا یابی که به وسیله نت بینز و جاوا تدارک دیده شده است استفاده کنیم. در شکل ۳ ما یک نقطه شکست ایجاد می کنیم. نقطه شکست باعث توقف برنامه می‌شود بنا بر این ما می‌توانیم ببینیم چه چیزی روی می‌دهد مادامی که برنامه هنوز در حال اجراست.

مابرنامه را با دست اجرا نمی‌کنیم، ابتدا نقطه شکست را تنظیم می‌کنیم و برنامه را در حالت خطایابی اجرا می نماییم سپس صبر می‌کنیم تا برنامه به نقطه شکست برسد.

قدم بعدی این است که برنامه را ا جرا کنیم اما ما آن رابه روشی ویژه اجرا می‌کنیم تا از مزیت نقطه شکست استفاده کنیم. شکل ۴ نشان می‌دهد چگونه برنامه را در حالت خطا یابی اجرا کنیم.در حالت خطا یابی برنامه در خط شکست خواهد ایستاد. اجرا در حالت خطا یابی باعث می‌شود برنامه آهسته تر از حالت عادی اجرا شود اما این هزینه کمی است که ما می‌پردازیم تا از قدرت و قابلیت انعطاف حالت خطا یابی استفاده کنیم. حالت خطا یابی یک اثرکند کنندگی ناچیز بر اکثر برنامه‌های کوچک دارد.


در شکل ۵ برنامه در حالت خطا یابی اجرا شده است ، این برنامه اجرا می‌شود و تا خط شکست پیش می‌رود و سپس می ایستد. وقتی خط بعدی اجرا می‌شود خط شکست بوسیله نت بینز سبز می شود.


توجه: مطمئن شوید که نقطه شکست شما در مسیر اجرای برنامه باشد. اگر در مسیر نبود برنامه در آن نقطه نمی ایستد و نتیجه‌ای حاصل نمی شود.

این قسمت خوب برنامه است. برنامه موقتآ از حرکت باز می‌ایستد . ما می‌توانیم حالت متغیر ها را تجربه کنیم و ببینیم چه رویدادی در حال وقوع است.

به خاطر داشته باشید که خط سبز روی خط بعدی است که اجرا شده است. خط کد هنوز اجرا نشده است.


در شکل ۶ موش واره بر روی متغیر آلفا است و نت بینز مقدار جاری متغیر را در یک بالن نما یش می دهد. خیلی خوب.

مقدار آلفا برابر ۳ است زیرا آن در خط ۱۱ به این صورت مقدار دهی شده است همان جایی که ابتدا اعلان شد .

شکل ۷

یکی دیگر از واژه‌هایی که معرفی می‌کنیم مفهوم گام منفرد single-stepping خواهد بود. چون خط سبز شده هنوز اجرا نشده است ما بر روی دکمه Debug/Step یا بر روی دکمه F8 می فشاریم تا آن خط اجرا شود. خط سبز به خط بعدی منتقل می‌شود.

می‌توانید از گام منفرد استفاده کنید تا مسیر کد را دنبال کرده و خطای منطقی را در کدی که نوشته‌اید پیدا کنید.

۱۳۸۹ دی ۲۶, یکشنبه

ارث بری در جاوا ۲

قسمت اول

Abstract انتزاعی

متد ها و کلاس‌ها در جاوا می‌توانند به شکل Abstract اعلان شوند. یک متد Abstract پیاده‌سازی ندارد، و یک کلاس Abstract نمی‌تواند داخل یک شی ساخته شود. با یک مثال این مسأله بهتر درک می‌شود ، ما از کلاس حیوان که پیش از این ساختیم استفاده می کنیم:



public abstract class Animal {

public boolean isAPet = true;

public String owner = “Fred”;



public void sleep() {

System.out.println(“Sleeping”);

}

public void eat() {

System.out.println(“Eating”);

}

}



با این کلاس شما نمی‌توانید از عبارتAnimal a = new Animal(); 0 استفاده کنید زیرا آن abstract است. به هر روی بقیه آن کلاس می‌تواند درست همانند دیگر کلاس‌ها تعریف شود. بجز اکنون ، شما نمی‌توانید هر حیوان ویژه ای را درست کنید، شما به خود و دیگر برنامه نویسان تحمیل می‌کنید که یک حیوان ویژه همانند گربه یا سگ درست کنند.



متدهای abstract گیراترین قسمت ارث بری در جاوا است. متدی می سازید اما داخل آن را از کد پر نمی کنید! در اینجا مثالی است از یک متد abstract که ما آن را به کلاس حیوان اضافه می‌کنیم، متد move :


public abstract class Animal {

public boolean isAPet = true;

public String owner = “Fred”;



public void sleep() {

System.out.println(“Sleeping”);

}

public void eat() {

System.out.println(“Eating”);

}

public abstract void move();

}



توجه: این خیلی مهم است که شما از آکولاد برای متد های abstract استفاده نکنید! همچنین به خاطر داشته باشید که یک سمیکلون در انتها قرار دهید، و چنانچه میدانید کد ها را به طور منظم بنویسید.

بنابر این چه کاری می‌توانید با این متد abstract انجام دهید در صورتی که هیچ چیزی در آن نیست؟ جواب در زیر کلاس قرار دارد. زیرا متد در سوپر کلاس به شکل abstract است و زیر کلاس باید این متد را پیاده‌سازی کند. این بدین معنی است که اکنون زیر کلاس در حال کار است تا تعیین کند کدام کد به متد می‌رود ، و متد در داخل زیر کلاس قرار دارد. اجازه دهید با پیاده‌سازی متد move در هردو کلاس سگ و گربه قدرت این روش را نشان دهیم.



Public class Dog extends Animals {

public void bark () {

System.out.println(“Woof!”) ;

}

public void move() {

System.out.println(“Running”) ;

}

}



public class Cat extends Animal {

public void meow () {

System.out.println(“Meow”) ;

}

public void move () {

System.out.println (“Prancing”);

}

}





اکنون همه حیوانات می‌توانند متد های مشترک داشته باشند اما هنوز آن متد ها را به طور متفاوت اجرا می کنند. توجه کنید که اگر شما متد های abstract را از سوپر کلاس به زیر کلاس پیاده‌سازی نکنید ، زیر کلاس شما یک خطا خواهد داشت. این بدین معنی است که شما باید متد های abstract را پیاده‌سازی کنید.



خب اکنون شما باید سر انجام یک فهم درستی در ارث بری جاوا داشته باشید. اگر هنوز روشن نشده‌اید مشکلی نیست . در مورد کلاس‌های abstract و extend بیشتر بیاموزید. ببینید چه چیز هایی اجازه دارند و چه چیز هایی اجازه ندارند. تلاش کنید از کلاسی ارث ببرید و به کلاس‌های دیگر ارث دهید و ببینید چه رویداد هایی انجام می‌شود. آزمایش بهترین راه یاد‌گیری است، بنا بر این به جلو بروید و تلاش کنید. اگر در مورد این مثال سؤالی داشتید لطفآ به صورت کامنت بپرسید..


لینک انگلیسی English

۱۳۸۹ دی ۲۴, جمعه

ارث بری در جاوا ۱

ارث بری در جاوا

English

برای درک بهتری از ارث بری حتمآ احتیاج دارید بدانید چگونه اشیاء کار می‌کنند تا بتوانید هر گونه احساسی نسبت به ارث بری در جاوا پیدا کنید. بنابر این پیشنهاد می‌کنم اگر می‌خواهید درک کاملی از این بحث داشته باشید به عقب برگردید و درس نامه های جاوای مقدماتی را مرور کنید، سه درسنامه در مورد اشیاء در جاوا.


به هر روی شما مجبور به استفاده از کلاس‌ها و اشیاء هستید تا قسمت‌های مختلف برنامه تان را نشان دهید. برای مثال می تونید یک کلاس سگ بسازید تا پس از آن اشیاء سگ که همه مشخصات یک سگ را دارد بسازید، و همچنین یک یک شی پرنده بسازید تا پس از آن اشیاء پرنده را خلق کنید که همچنین همه کرداری را که از یک پرنده انتظار دارید را داشته باشد. همانطور که می تونید تصور کنید شباهت‌هایی می تواند بین این دو شی وجود داشته باشد و برخی از این کد ها می توانند در هر دو کلاس تکراری شوند.


چه واکنشی خواهید داشت اگر بگویم که می‌توانید یک شی حیوان درست کنید که این کار را برای شما انجام دهد. یعنی مانع کد های تکراری شود..... اینجا است که ارث بری در جاوا وارد می شود!!


Superclass یا کلاس بالاتر



وقتی در مورد ارث بری در جاوا بحث می‌کنیم ،اولین چیزی که ما به آن می نگریم، مفهوم کلاس بالاتر است. یک سوپر کلاس از نظر پایه مثل بقیه کلاس‌های جاواست ، به جز آنکه ما می‌دانیم که می‌خواهیم دیگر کلاس‌ها از آن ساخته شوند. اندوه مخورید در مورد اینکه چطور این اتفاق می‌افتد، اول اجازه بدید ببینیم یک سوپر کلاس چگونه به نظر می رسد



public class Animal {


}


اما صبر کنید، این فقط شبیه یک کلاس معمولی به نظر می رسد؟ بله درست است. یک سوپر کلاس می‌تواند شبیه هر کلاس دیگر باشد. بنابر این جادوی یک سوپر کلاس در داخل خودش نیست بلکه به در زیر کلاس subclass است.


Subclass یا زیر کلاس



یک زیر کلاس بچه ی کلاس مادر است. به ویژه، زیر کلاس از سوپر کلاس گرفته می‌شود. مثال زیر از سوپر کلاس بالا استفاده می‌کند



public class Dog extends Animal{



}

در اینجا یک واژه کلیدی جدیدextends وجود دارد که شما برای ساخت کلاس استفاده کردید. extends چیزی است که شما استفاده می‌کنید تا نشان دهید این کلاس یک زیر کلاس از یک کلاس بالاتر است.شما فقط می‌توانید همیشه از extends برای یک کلاس استفاده کنید.



مثال حیوان Animal Example

خب پس نکته ارث بری در کجاست؟ نکته اینجاست که ما می‌توانیم مقدار کد را کاهش دهیم و با استفاده از ارث بری در جاوا کد ها را بیشتر شبیه دنیای واقعی کنیم. اجازه بدید بگویم ما اشیاء سگ و گربه را داریم. سگ و گربه هر دو حیوانند بنا بر این به طور طبیعی ما می‌توانیم یک سوپر کلاس به نام حیوان درست کنیم که ویژگی‌های همه حیوانات را داشته باشد و سپس ویژگی‌های خاص را برای یک سگ و یک گربه بسازیم.

اجازه دهید با سوپر کلاس یعنی کلاس حیوان شروع کنیم. اینجا می توانیم متغیر ها و متد هایی رو دست کنیم که همه حیوانات می‌توانند داشته باشند. هم اکنون ما همه چیز را ساده می‌کنیم و فقط دو متغیر و دو متد که همه حیوانات می‌توانند داشته باشند را درست می کنیم. اینجا کد ها نوشته شده



public class Animal {

public boolean isAPet = true;

public String owner = “Fred”;



public void sleep() {

System.out.println(“Sleeping”);

}

public void eat() {

System.out.println(“Eating”);

}

}



ما متغیر ها و متد های اصلی را برای همه حیوانات ساختیم. در این حالت، همه حیوانات ما یک متغیر بولی دارند که isAPet خوانده می‌شود که به صورت true مقدار دهی شده ، و owner به صورت یک رشته تعیین شده که مقدار آن Fred است. همه حیوانات می‌توانند بخوابند و بخورند.



خب اکنون که تعیین کردیم چه چیزی حیوانات ما خواهند داشت، اجازه بدهید زیر کلاس آن‌ها را بسازیم. قبلآ یک زیر کلاس به نام سگ ساختیم بنا بر این فقط از آن در اینجا استفاده می کنیم. این کلاس خالی است ولی در‌واقع آن به همه متد های public و protected کلاس بالا تر دسترسی دارد. این همانند این است که من همه آن متد ها را در کلاس سگ نوشته باشم. به مثال زیر نگاه کنید:



public static void main (String[] args) {

Dog d = new Dog();

d.sleep();

}

توجه داشته باشید که چرا برنامه بالا هیچ خطایی نمی‌دهد زیرا سوپر کلاس تمام متغیر ها و متد های public و protected خود را با زیر کلاس به اشتراک گذاشته است.



بنابر این شاید شما در شگفت باشید که دو پیراینده ی public و protected چه کاری انجام می دهند؟ اینها دو تا از سه سطح دسترسی هستند که در جاوا استفاده می شوند. اگر شما تا کنون این درسنامه ها را دنبال کرده باشید حتمآ public را زیاد دیده‌اید ، اما protected برای شما جدید است. من در درسنامه بعدی عمیقآ به این بحث می پردازم ؛ چیزی که برای اکنون مهم است این دو پیراینده هر دو یکی هستند و به زیر کلاس این اجازه را می‌دهند که از متغیر ها و متد های سوپر کلاس استفاده کنند.



اکنون می‌توانیم کد هایی را بنویسیم که اشیاء ویژه یک سگ را بنویسد ، اجازه بدید متدی بنویسیم به نام واق واق bark :



public class Dog extends Animal {



public void bark() {

System.out.println (“Woolf!”):

}
}



فقط سگ‌ها می‌توانند واق واق کنند بنا بر این زیر کلاس این متد را دارد. سوپر کلاس هرگز به این متد دسترسی ندارد



اجازه بدید یک کلاس گربه بسازیم که آن هم زیر کلاس حیوان است.





public class Cat extends Animal {



}

این کلاس نیز خالیست اما این همان دسترسی به متد ها و متغیر های سوپر کلاس را دارد. اجازه بدید یک متد میو میو meow بسازیم :



public class Cat extends Animal {

public void meow () {

System.out.println(“Meow!”);

}

}



این متد فقط در کلاس گربه وجود دارد. سگ‌ها چیزی از این متد نمی‌دانند و همچنین سوپر کلاس هم چیزی از این متد نمی داند. و این همان چیزی است که ارث بری در جاوا را چنین قدرتمند می کند: توانایی تعریف متد ها و متغیر های مشترک در یک مکان و استفاده از آن‌ها دوباره و دوباره. جاوا اشیاء خودش را به شکل سلسله مراتبی می‌سازد و چه زیباست از این فایده استفاده کنیم. حتی دلایل بیشتری برای قدرتمندی ارث بری در جاوا وجود دارد اما ما به آن دلایل در این درس نامه نمی پردازیم.

Abstract انتزاعی

۱۳۸۹ دی ۲۲, چهارشنبه

آموزش گام به گام جاوا : ۵

- چگونه با کلیک بر یک دکمه یک جر فایل را اجرا کنیم؟
گاهی پیش میاد که می خواهید از جر فایل هایی که قبلآ ساخته اید یا مثلآ از اینترنت دانلود کردید در یک برنامه جدید استفاده کنید در این درس نامه این کار رو یاد می گیرید.
من برای انجام این کار از نت بینز ۶.۸ استفاده کردم.

۰- نت بینز را باز کنید
۱- از منو فایل گزینه New Project را انتخاب و از پنجره باز شده گزینه Java و از منو روبرو گزینه java Desktop application را انتخاب کنید نام پروژه مثلآ RunJar را انتخاب و تیک set as Main Project را انتخاب کنید.
۲- از منو Palette یک Button انتخاب و بر روی فریم قرار دهید.
۳- بر روی دکمه کلیک راست از منو باز شده گزینه Event و از منو باز شده گزینه Action وسپس گزینه actionPerformed را انتخاب کنید و در محل ویژه باز شده دستور زیر را تایپ کنید.

String[] jvmargs = {" "};
JavaLauncher.execJar(getResourcePath("resource" + File.separator + "runtest.jar"), jvmargs);
۰
خب حالا باید پکیج زیر را وارد کنید

import java.io.File;
۰
۴- حالا باید کلاس JavaLauncher بسازیم

package runjar;
/**
*
* @author kian
*/
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;

/**
* JavaLauncher Provides an easy way to launch java appliations. The ClasspathBuilder class
* is handle to use in conjunction with this class.
* @author Jason Ederle
*/
public class JavaLauncher {

private static boolean debug = false;

/**
* Launch a java program.
* @param mainClass - class with main method
* @param classpath - the java classpath
* @param jvmargs - arguments for the jvm
* @param properties - any system properties
* @param xDockName - Mac os x, application name
* @param xDockIcon - Mac os x, application icon
*/
public static Process exec(String mainClass, String classpath, String[] jvmargs, String[] properties, String xDockName) throws Exception {

//get a jvm to execute with
String jvm = findJVM();


StringBuffer strClasspath = new StringBuffer("." + File.pathSeparator + classpath);

//combine all the arguments into 1 array.
String[] allArguments = new String[properties.length + jvmargs.length];
System.arraycopy(jvmargs, 0, allArguments, 0, jvmargs.length);
System.arraycopy(properties, 0, allArguments, jvmargs.length, properties.length);

//build the command with jvm, arguments, and mainclass
String[] command = new String[5 + allArguments.length];

//put java command in place
command[0] = jvm;

//add all the arguments
System.arraycopy(allArguments, 0, command, 1, allArguments.length);

//set application name
command[allArguments.length + 1] = "-Xdock:name=" + xDockName;
command[allArguments.length + 2] = "-classpath";
command[allArguments.length + 3] = "\"" + strClasspath + "\" ";
command[allArguments.length + 4] = mainClass;

String[] env = {};


//combine to printable string for debugging
StringBuffer wholeCommand = new StringBuffer();
for (int i = 0; i < proc =" Runtime.getRuntime().exec(command);" jvm =" findJVM();" comm =" new" proc =" Runtime.getRuntime().exec(comm);" inputstream =" proc.getErrorStream();" inputstreamreader =" new" bufferedreader =" new" line =" bufferedreader.readLine())" value = " + proc.exitValue()); } } catch (InterruptedException e) { System.out.println(" jvm =" null;" jvm =" System.getProperty(" jvm ="=" jvm = "java" jvm =" jvm" style="text-align: right;">

۵- کد های زیر را به کلاس RunJarView اضافه کنید.و سپس پکیج هایی رو که نت بینز هشدار میده import کنید.


public URL getResourcePath(String yourPath) {
String mainPath = null;
String mainElement = null;
URL mainURL = null;
if (System.getProperty("os.name").equalsIgnoreCase("linux")) {
try {
URL inputURL = getClass().getResource("");
if (inputURL.toString().contains("!")) {
File file = new File(getClass().getResource("").getFile());
inputURL = new URL("file", "", file.getParent());
// JOptionPane.showMessageDialog(null, "1 " + inputURL.toString());
mainElement = inputURL.toString().replace("file:file:", "");
// JOptionPane.showMessageDialog(null, "2 " + mainElement);
String element = URLDecoder.decode(mainElement.substring(0, mainElement.lastIndexOf(File.separator)) + File.separator, "utf-8");
// JOptionPane.showMessageDialog(null, "3 " + element);
mainPath = element.concat(yourPath);
// JOptionPane.showMessageDialog(null, "4 " + mainPath);
mainURL = new URL("jar", "", mainPath);

} else {
String[] strArray = yourPath.split(File.separator);
mainURL = new URL("jar", "", System.getProperty("user.dir") + File.separator + strArray[0] + File.separator + strArray[1]);
}
} catch (Exception ex) {
}
} else {
try {
URL inputURL = getClass().getResource("");
if (inputURL.toString().contains("!")) {
File file = new File(getClass().getResource("").getFile());
inputURL = new URL("file", "", file.getParent());
// JOptionPane.showMessageDialog(null, "1 " + inputURL.toString());
mainElement = inputURL.toString().replace("file:file:" + File.separator, "");
// JOptionPane.showMessageDialog(null, "2 " + mainElement);
String element = URLDecoder.decode(mainElement.substring(0, mainElement.lastIndexOf(File.separator)) + File.separator, "utf-8");
// JOptionPane.showMessageDialog(null, "3 " + element);
mainPath = element.concat(yourPath);
// JOptionPane.showMessageDialog(null, "4 " + mainPath);
mainURL = new URL("jar", "", mainPath);

} else {
String[] strArray = yourPath.split("\\" + File.separator);
mainURL = new URL("jar", "", System.getProperty("user.dir") + File.separator + strArray[0] + File.separator + strArray[1]);
}
} catch (Exception ex) {
}
}
return mainURL;
}public URL getResourcePath(String yourPath) {
String mainPath = null;
String mainElement = null;
URL mainURL = null;
if (System.getProperty("os.name").equalsIgnoreCase("linux")) {
try {
URL inputURL = getClass().getResource("");
if (inputURL.toString().contains("!")) {
File file = new File(getClass().getResource("").getFile());
inputURL = new URL("file", "", file.getParent());
// JOptionPane.showMessageDialog(null, "1 " + inputURL.toString());
mainElement = inputURL.toString().replace("file:file:", "");
// JOptionPane.showMessageDialog(null, "2 " + mainElement);
String element = URLDecoder.decode(mainElement.substring(0, mainElement.lastIndexOf(File.separator)) + File.separator, "utf-8");
// JOptionPane.showMessageDialog(null, "3 " + element);
mainPath = element.concat(yourPath);
// JOptionPane.showMessageDialog(null, "4 " + mainPath);
mainURL = new URL("jar", "", mainPath);

} else {
String[] strArray = yourPath.split(File.separator);
mainURL = new URL("jar", "", System.getProperty("user.dir") + File.separator + strArray[0] + File.separator + strArray[1]);
}
} catch (Exception ex) {
}
} else {
try {
URL inputURL = getClass().getResource("");
if (inputURL.toString().contains("!")) {
File file = new File(getClass().getResource("").getFile());
inputURL = new URL("file", "", file.getParent());
// JOptionPane.showMessageDialog(null, "1 " + inputURL.toString());
mainElement = inputURL.toString().replace("file:file:" + File.separator, "");
// JOptionPane.showMessageDialog(null, "2 " + mainElement);
String element = URLDecoder.decode(mainElement.substring(0, mainElement.lastIndexOf(File.separator)) + File.separator, "utf-8");
// JOptionPane.showMessageDialog(null, "3 " + element);
mainPath = element.concat(yourPath);
// JOptionPane.showMessageDialog(null, "4 " + mainPath);
mainURL = new URL("jar", "", mainPath);

} else {
String[] strArray = yourPath.split("\\" + File.separator);
mainURL = new URL("jar", "", System.getProperty("user.dir") + File.separator + strArray[0] + File.separator + strArray[1]);
}
} catch (Exception ex) {
}
}
return mainURL;
}public URL getResourcePath(String yourPath) {
String mainPath = null;
String mainElement = null;
URL mainURL = null;
if (System.getProperty("os.name").equalsIgnoreCase("linux")) {
try {
URL inputURL = getClass().getResource("");
if (inputURL.toString().contains("!")) {
File file = new File(getClass().getResource("").getFile());
inputURL = new URL("file", "", file.getParent());
// JOptionPane.showMessageDialog(null, "1 " + inputURL.toString());
mainElement = inputURL.toString().replace("file:file:", "");
// JOptionPane.showMessageDialog(null, "2 " + mainElement);
String element = URLDecoder.decode(mainElement.substring(0, mainElement.lastIndexOf(File.separator)) + File.separator, "utf-8");
// JOptionPane.showMessageDialog(null, "3 " + element);
mainPath = element.concat(yourPath);
// JOptionPane.showMessageDialog(null, "4 " + mainPath);
mainURL = new URL("jar", "", mainPath);

} else {
String[] strArray = yourPath.split(File.separator);
mainURL = new URL("jar", "", System.getProperty("user.dir") + File.separator + strArray[0] + File.separator + strArray[1]);
}
} catch (Exception ex) {
}
} else {
try {
URL inputURL = getClass().getResource("");
if (inputURL.toString().contains("!")) {
File file = new File(getClass().getResource("").getFile());
inputURL = new URL("file", "", file.getParent());
// JOptionPane.showMessageDialog(null, "1 " + inputURL.toString());
mainElement = inputURL.toString().replace("file:file:" + File.separator, "");
// JOptionPane.showMessageDialog(null, "2 " + mainElement);
String element = URLDecoder.decode(mainElement.substring(0, mainElement.lastIndexOf(File.separator)) + File.separator, "utf-8");
// JOptionPane.showMessageDialog(null, "3 " + element);
mainPath = element.concat(yourPath);
// JOptionPane.showMessageDialog(null, "4 " + mainPath);
mainURL = new URL("jar", "", mainPath);

} else {
String[] strArray = yourPath.split("\\" + File.separator);
mainURL = new URL("jar", "", System.getProperty("user.dir") + File.separator + strArray[0] + File.separator + strArray[1]);
}
} catch (Exception ex) {
}
}
return mainURL;
}


۰


۶- یک پوشه به نام resource در پوشه RunJar بسازید و فایل جر مورد نظر را که در اینجا به نام runtest هست را در آن قرار دهید.
۷- برنامه را کلین و بیلد کنید و سپس اجرا کنید.

با سپاس از استاد شایسته علوی

۱۳۸۹ دی ۱۹, یکشنبه

هش ماپ Hash map

درادامه مجموعه های جاوا:

به هر حال مجموعه های جاوا خیلی بهتر از آرایه ها هستند. در اینجا ما hash map را معرفی می‌کنیم یک hash map یک رابطه یک به یک بین یک شی به شی دیگر است. اجازه دهید به روش دیگر برای کسانی که نمی‌خواهند ریاضی را حفظ کنند توضیح دهم.


اجازه دهید فرض کنیم شما می‌خواهید به‌ حساب ایمیلتان دسترسی پیدا کنید. شما نمی‌توانید این کار را انجام دهید مگر آنکه ابتدا لاگین کنید. در صفحه ی لاگین شما باید نام کاربری و رمز عبور خود را وارد کنید و در صورتی که آن دو ترکیب درست بود می‌توانید به حساب ایمیلتان درسترسی پیدا کنید.


یک hash map به طور مشابه کار می کند. شما باید یک ورودی مناسب داشته باشید تا یک خروجی درخور تحویل بگیرید. هر ورودی دقیقآ به یک خروجی مرتبط می شود. در مثال قبلی یک ترکیب نام کاربری و رمز عبور به دقیقآ یک حساب ایمیل منجر می شود.


در اینجا می تونید یک نمونه کد hash map ببینید



دوباره شما جمله import را فراموش کردید. به طور معمول می‌توانید جمله import ی را که احتیاج دارید به شکل زیر تایپ کنید.


Import java.util.NameOfObject


و به جای نام شی از نام مجموعه‌ای که استفاده می‌کنید استفاده کنید که در اینجا HashMap است. همچنین می‌توانید با گرفتن کلید های Ctrl + Shift + O به طور خود کار هر چیزی را در اکلیپس وارد یاimport کنید.


اگر به HashMap ی که ساخته این نگاه کنیم می‌بینیم اولین مقدار و همچنین دومین آن هر دو استرینگ هستند. البته شما می تونید هر نوع ترکیبی داشته باشید.


شما از یک کلید برای بدست آوردن یک مقدار استفاده می کنید. یک کلید درست برابر یک مقدار، درست مثل یک نام کاربری برابر یک رمز عبور.


وارد کردن یک کلید/مقدار جدید آسان است


map.put(“Me” , “Password”);


و به شکل زیر آن‌ها را حذف می‌کنید


map.remove(“Me”);


اگر یک آرایه از کل کلید ها در یک هاش مپ بخواهید می‌توانید از متد KeySet استفاده کنید


String [] keys = map.KeySet ().toArray(new String[map.size()]);


این نسبتآ خدعه آمیز است. متد KeySet یک مجموعه Set را برمی گرداند. سپس آن مجموعه به یک آرایه ای از استرینگ Strings با ایجاد یک new String تبدیل می‌شود که طولی برابر اندازه هش مپ دارد. سپس آن آرایه در یک آرایه دیگر که کلید keys خوانده می‌شود ذخیره می شود. دلیل آنکه من یک آرایه از رشته‌ها strings درست کردم این است که کلیدها keys همه از قبل رشته Strings هستند.


چگونه است که هش مپ ها مفید هستند؟ آن‌ها به شما این اجازه را می‌دهند که اشیاء را با در نظر گرفتن دیگر اشیاء در عوض مقادیر لیست شده ذخیره کنید، همانند آنچه شما با یک ArrayList انجام می دهید



نکته: تکرار می‌کنم شما نمی‌توانید در ArrayList ها ، HashMap ها و یا هر مجموعه ی جاوا دیگر نوع های اولیه primitive types را ذخیره کنید. مجموعه های جاوا فقط اشیاء را ذخیره می کند. این بسیار مهم است پس فراموش نکنید.


امیدوارم این نوشتار مقدمه مفیدی در استفاده از انواع توسعه یافته ی مجموعه ها در اختیار شما قرار داده باشد. آن‌ها ابزار های قدرتمندی هستند به شرط آنکه به جا استفاده شوند و می‌توانند قابلیت‌های برنامه شما را به طور چشمگیری ارتقاء دهند.مجموعه های جاوا بیش از چیزی هستند که من در اینجا لیست کردم ؛ من به شدت شما را تشویق می‌کنم که به بقیه آن‌ها نگاهی بیندازید، بیاموزید چگونه از آن‌ها استفاده کنید و سپس در برنامه‌های خودتان به کار بگیرید.