ایمان ریحانیان

دست خط یک برنامه نویس

ایمان ریحانیان

دست خط یک برنامه نویس

ایمان ریحانیان

زکات علم یاد دادن آن به دیگران است، کمک کنیم که علم گسترش یابد.

طبقه بندی موضوعی

به نام خدا

 

تقریبا همه برنامه نویسان جاوا میدانند که Bytecode ها به وسیله (JRE (Java Runtime Environment اجرا میشوند. میتوان یکی از مهمترین اجزای JRE را ماشین مجازی جاوا یا همان Java Virtual Machine ) JVM ) در نظر گرفت که وظیفه آنالیز کردن و اجرا کردنBytecode ها را برعهده دارد، معمولا برنامه نویسان احتیاج ندارند که بدانند که JVM چگونه کار میکند. بنابراین برنامه ها و کتابخانه های زیادی نوشته شده است بدون اینکه برنامه نویسان آن اطلاعی عمیقی از JVM داشته باشند.
بهرحال اگر یک برنامه نویس جاوا ساختار JVM را بشناسد اساسا جاوا را بهتر شناخته است و بهتر میتواند مشکلات را حل کرده و تصمیم گیری کند.
من در این مقاله قصد دارم ساختار JVM و نحوه اجرا کردن Bytecode ها را توضیح بدهم، امیدوارم که مفید باشه.


میتوان اجزای تشکیل دهنده ی JRE را Java API و JVM در نظر گرفت که نقش JVM خواندن Bytecode  های داخل کلاس ها (که نتیجه کامپایل شدن کد جاوا است) و از طریق Class Loader ها آنها را بارگذاری کردن در نتیجه اجرا کردن آنها بوسیله Java API است.

ماشین مجازی (Virtual Machine)
ماشین مجازی (VM) یک نرم افزار پیاده سازی شده از یک ماشین (مثلا یک رایانه) است که برنامه ها را مانند یک ماشین مجزا اجرا میکند، جاوا بر اساس ساختار ماشین مجازی طراحی شده است که بتواند ساختار WORA یعنی Write Once Run Anywhere  را پیاده سازی کند، ساختار و معماری مهمی که معمولا نادیده گرفته میشود، بنابراین ماشین مجازی جاوا (JVM) میتواند کدی را که یکبار نوشته شده است و به Bytecode تبدیل شده است را بدون تغییر در هر ماشینی که JVM  بر روی آن نصب میشود اجرا کند.
میتوان از موارد زیر به عنوان ویژگیهای JVM یاد کرد :
ماشین مجازی بر اساس ساختار استک : با توجه به برخی از معماری مشهور رایانه ای  مانند Intel x86 و ARM که بر اساس ساختار داده ای رجستر میباشند. ولی همیشه JVM بر اساس ساختار داده استک اجرا میشود.
گربیج کالکشن (Garbage Collection) : ترجمه فارسی این کلمه را دوست  ندارم برای همین معادل تلفظ انگلیسیشو به فارسی نوشتم، باتوجه به کد نوشته شده و کتابخانه های اضافه شده به برنامه بطور مداوم اشیا مختلف ساخته میشود که به وسیله GC پاک میشوند و از بین میروند.
تضمین کردن مستقل بودن از پلتفرم با تعریف داده ساختارهای اولیه (Primitive Data Type) : در بعضی از زبانهای برنامه نویسی مانند C باتوجه به پلتفرم در حال اجرا سایزهای مختلفی برای متغییر ها در نظر گرفته میشود. ولی JVM بطور واضح داده ساختار های اولیه یا Primitive Data Type ها را تعریف میکند که همیشه و در هر پلتفرمی سایز مشخصی را میگیرند. (مثلا همیشه int چهار بایت فضا میگیرد)

جاوا توسط شرکت سان مایکروسیستمز طراحی و پیاده سازی و توسعه پیدا کرده است (که این شرکت توسط شرکت اوراکل خریداری شد) و هر کسی میتواند با رعایت کردن استانداردهای ماشین مجازی جاوا آنرا پیاده سازی کند و ماشن مجازی جدیدی پیاده سازی کند همانطور که ماشین های مجازی زیادی وجود دارد که میتوان به Oracle HotSpot JVM و IBM J9 و Dalvik VM که توسط شرکت گوگل برای سیستم عامل اندروید استفاده میشود اشاره کرد، ولی برخلاف بقیه ی ماشین های مجازی جاوا که از ساختار استک استفاده میکنند Dalvik VM از ساختار رجیستر استفاده میکند.


بایت کد ها (Java Bytecode)
برای پیاده سازی WORA ، ماشین مجازی جاوا از بایت کدها استفاده میکند، یک زبان میانی بین زبان جاوا و زبان ماشین است.
کامپایلر جاوا برخلاف زبان برنامه نویسی مانند c که مستقیما کد به زبان ماشین تبدیل میشود، در معماری جاوا ابتدا با Bytecode و سپس از طریق JVM به ساختار ماشین تبدیل میشود. سایز کد کامپایل شده و تبدیل شده به Bytecode معمولا با سایز کد جاوا که توسط برنامه نویس نوشته شده است (Source Code) یکسان است و به راحتی قابل انتقال میباشد.
کد جاوا پس از کامپایل شدن به کلاس فایل (class.) تبدیل میشود که یک فایل binary میباشد که همان Byteocde ها هستند و برای انسان قابل خواندن نیست، برای خواندن این فایل ها بصورت قابل فهم و تبدیل به کد جاوا میتوان از برنامه ای به نام javap که ماشین مجازی جاوا ارائه میدهد استفاده کرد. نتیجه استفاده از javap را Java assemply مینامند.  

معماری ماشین مجازی جاوا (JVM)
کد نوشته شده در جاوا با روند زیر اجرا میشود :
 


برای بارگذاری بایت کدها  Class Loader ها  این کلاسهای شامل بایت کدهارا در یک منطقه ای به اسم Runtime Data Areas قرار میدهد و موتور اجرا کننده (Execution Engine) بایت کد ها را اجرا میکند.


Class Loader :
جاوا دارای قابلیت بارگذاری پویا میباشد، یعنی در زمان اجرای یک برنامه وقتی که به یک کلاس احتیاج میشود آنرا بارگذاری میکند. که میتوان اصطلاحا Lazy Loading هم نامید که در OR/M هایی مثل Hibernate هم استفاده میشود.


میتوان از قابلیت های کلاس لودر اشاره کرد به :
ساختار سلسله مراتبی : کلاس لودرها در جاوا در یک ساختار سلسله مراتبی میباشند که شامل ساختار پدر و فرزندی میباشد. که بالاتر از همه آنها Bootrstrap Class Loader قرار دارد.
معدل معاوضه ای : بر اساس ساختار سلسله مراتبی بارگذاری شدن کلاس ها  بین کلاس لودر ها واگذار میشود یعنی وقتی یک کلاس بارگذاری میشود بررسی میشود که آیا همچین کلاسی در کلاس پدروجود داد یا نه اگر این کلاس وجود داشته باشد و قبلا بارگذاری شده باشد از همان استفاده میکند و در غیر اینصورت یک کلاس جدید بارگذاری میکند.
محدودیت در دسترس بودن : یک کلاس لودر فرزند میتواند در کلاس لودر پدر دردسترس باشد ولی کلاس لودر پدر نمیتواند در کلاس لودر فرزند در دسترس باشد.
کلاس لودر ها فقط میتوانند کلاس ها را بارگذاری کنند :یک کلاس لودر میتواند کلاس هارا بارگذاری کند ولی نمیتواند آنها را خالی (unload) کند و بجای خالی کردن آنها کلاس ها حذف میشوند و کلاس جدید بارگذاری میشود.
هر کلاس لودری فضای دارد که نام کلاس های بارگذاری شده را بر اساس FQCN یعنی Fully Qualified Class Name در آن ذخیره میکند. زمانیکه یک کلاس لودر میخواهد که کلاس ها را بارگذاری کند بر اساس FQCN در نامهای ذخیره شده بررسی میکند که آیا کلاس درخواست شده در حال حاضر بارگذاری شده است یا خیر ؟  حتی اگر کلاس درخواستی در فضای دیگری که مربوط به یک کلاس لودر دیگر است ذخیره شده باشد، آنرا به عنوان کلاسی متفاوت در نظر میگیرد.
ساختار زیر بیانگر ساختار سلسله مراتبی کلاس لودر ها میباشد.

 



انواع مختلف کلاس لودر ها به شرح زیر میباشند:
Bootstrap Class Loader : این کلاس لودر که در ساختار سلسله مراتبی کلاس لودر ها در بالاترین مرحله قرار دارد و به عنوان پدر همه کلاس لودر ها است زمانی ساخته میشود که JVM اجرا شده و وظیفه آن بارگذاری کردن Java API ها و اشیای ابتدایی جاوا میبشاد و برخلاف بقیه ی کلاس لودر ها بجای جاوا با زبان ماشین پیاده سازی شده است.
Extenstion CLass Loader : وظیفه این کلاس لودر بارگذاری کردن برخی extenstion ها جاوا است مانند Security Extention
Sytem Class Loader : وظیفه این کلاس لودر بارگذاری کردن کلاس های برنامه است و همچنین بارگذاری کردن کلاسهای موجود در CLASSPATH$ که توسط کاربر مشخص میشود است.
User-Defined Class Loader : وظیفه این کلاس لودر اجرا کردن کلاس هایی است که کاربر میسازد و میتوان بصورت پویا در حال اجرای برنامه این کلاس ها را اضافه و یا حذف کرد.
البته framework هایی مثل WAS-Web Application Server برنامه وب را از برنامه اصلی بصورت مستقل اجرا میکند و یا به عبارت دیگر از کلاس لودر های مجزا برای اجرا کردن هر یک از قسمت های وب و منطق برنامه استفاده میکند.
وقتیکه یک کلاس لودر میخواهد کلاسی را براگذاری کند، مراحل زیر انجام میشود :


که شرح آنها به این صورت میباشد :
Loading : کلاس مورد نظر در JVM بارگذاری میشود.
ٰVerifying : در این قسمت بررسی میشود که آیا کلاس بارگذاری شده از مقررات و ساختار جاوا و JVM پیروی میکند یا نه، این قسمت زمان بر ترین و مشکل ترین قسمت لود کلاس ها است که اجازه ی اجرا شدن کلاس را میدهد و یکی از قویترین ویژگیهای جاوا میباشد، چون کد نوشته شده در این قسمت بررسی میشود که مخرب نباشد.
Preparing : حافظه مورد نیاز را به کلاس ها و فیلدها و متدها و ایترفیس تعریف شده در کلاس ها را اختصاص میدهد.
Resolving : تمام مرجع های استفاده شده در این کلاس را به بارگذاری میکند.
Inittializing : متغییر ها استفاده شده در این کلاس  را مقدار دهی میکند.

 

ادامه این بحث را در قسمت دوم ادامه خواهم داد ...

۵ موافقین ۰ مخالفین ۰ ۰۲ آبان ۹۱ ، ۱۴:۰۹
ایمان ریحانیان

به نام خدا

 

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

امروز میخواهم راجع به یکی از نقاط قوت جاوا و همچنین یکی از علایق خودم به نام RMI بنویسیم.

 

RMI (Remote Method Invocation)

میتوان آنرا به فراخانی متد راه دور ترجمه کرد، یک رابط برنامه نویسی (API) در جاوا است که وظیفه آن فراخوانی یک متد در یک شی (Object) که در ماشین دیگری قرار دارد است، این یک تعریف کلی بود و اگر بخواهیم جزئی تر به مطلب بپردازیم میتوانیم یک مدل کلاینت/سرور را در نظر بگیریم که در أن سرور ماشینی است که متد قابل فرخوانی در آن وجود دارد و کلاینت ماشینی است که متدی را از سرور فراخوانی میکند.

 

سرور - ماشینی است که وظیفه انجام دادن یک عمل (Task) را بر اساس یک درخواست دارد.

کلاینت - ماشینی است که درخواستی را به ماشین سرور میفرستد.

 

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

در RMI، کلاسی که قرار است متدی از آن فرخوانی بشود فقط و فقط در ماشین سرور وجود دارد و کلاینت قرار است که درخواستی به سرور بفرستد تا سرور آن کار را انجام دهد. برای این کار نیاز به RMI registry داریم.

RMI registry چیست : RMI registry را مانند یک کتاب در نظر بگیرید که در آن اشیا مورد نیاز کلاینتها از طرف سرورها با یک نام مشخص (که میتواند RMI url باشد) در آن ثبت شده است و کلاینتها میتوانند با استفاده از نام اشیا که در هنگام ثبت در RMI registry به آن اختصاص داده شده است، آن شی را از RMI registry فراخوانی میکنند.

 

اگر بخواهیم یک متدی داشته باشیم که بتوان این متد  را فراخوانی کنیم باید این متد را در یک interface که از remote interface ارث برده است معرفی کنیم.

برای مثال  :

import java.rmi.*;
public interface NameCollections extends Remote //Remote Interface{
    public String getName(int index)throws RemoteException;//Remotely Accessible Method
}

و کلاسی که این ایترفیس را پیاده سازی میکند مانند زیر است :

import java.rmi.*;
import java.util.*;
import java.rmi.server.*;


class NameStorage extends UnicastRemoteObject implements NameCollections { //A Class  That Implements The Remote Interface

private Map name;
public NameStorage()throws RemoteException{
   name=new HashMap();
   name.put(1,"iman");
   name.put(2,"reihanian");
}

public String getName(int index)throws RemoteException{
   String str=name.get(new Integer(index));
   return str;
}

در ادامه پیاده سازی RMI در سرور :

import java.rmi.*;
import javax.naming.*;
class NameServer {
public static void main(String args[]) throws RemoteException,NamingException {
   Context ictxt=new InitialContext();
   NameStorage store=new NameStorage();
   ictxt.bind("rmi:Storage",store);//Binding The Remote Object(store) With A Name(storage)
   System.out.println("Clients can invoke the methods....");
   }
}

و در قسمت کلاینت :

import java.rmi.*;
import java.util.*;
import javax.naming.*;

class NameClient {
public static void main(String args[])throws NamingException,RemoteException {
    Context itxt=new InitialContext(); //Searching For The Remote Object In The RMI registry  
    NameCollections coll= (NameCollections) itxt.lookup("rmi://localhost/Storage");
    String n1=coll.getName(2);// Invoking The Remote Method
    System.out.println("Name Obtained from the server:" + n1);
    }
} 

اینطور به نظر میرسد که متد از سرور فراخوانی شده است در حالیکه فقط اینطور به نظر میرسد و واقعا اینطور نیست، کلاینت متدی را که در شی stub است فرخوانی کرده است و این شی stub متد سرور را فراخوانی کرده است و نتیجه را از سرور به کلاینت بر میگرداند.

stub چیست ؟ stub را میتوان به عنوان یک cache از اشیا remote در نظر گرفت که در کلاینت وجود دارند.

 

میتوان شکل کلی RMI را بصورت زیر رسم کرد :

۰ موافقین ۰ مخالفین ۰ ۲۴ مهر ۹۱ ، ۱۰:۲۵
ایمان ریحانیان

سلام

 

این روزها بازار جستجوگرها خیلی داغ شده و هر کدام از موتورهای جستجو امکانات و سرویس های مختلفی را در موضوعات مختلف در اختیار کاربران قرار میدهند و خود را دقیق تر و بهتر از دیگران معرفی میکنند. که این دقت و بهتری میتواند از نظر جستجو و یا سرویس های مختلف باشد، میتوان جستجو گر ها را به عنوان دروازه های ورود افراد به دنیای اطلاعات دانست و این دروازه ها نقش مهمی در یافتن اطلاعات درست را دارند و میتوان گفت که با این سزعت روزافزون حجم داده ها و اطلاعات، بدون جستجوگرها کاربران تقریبا نمیتوانند اطلاعات زیادی در مورد موضوع خاصی بدست آورند.

بعضی از آنها به عنوان یک ابرجستجوگر (Meta Search Engine) از موتورهای جستجوی دیگر استفاده میکنند ولی سرویس های مختلفی را برای دقیق تر شدن و کارایی بهتر در اختیار کاربر قرار میدهند.

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

موتور جستجو های عمومی:

 

Yahoo

Bing

Google

Blekko

...

 

و ابرجستجوگرهای مثل :

Duckduckgo

Dogpile

DeeperWeb

Mamma

WebCrawler

...

و میتوان لیست کامل تری از موتورهای جستجو و ابرجستجوگرها را در ویکی پیدا کرد. انتخاب شخصی من برای یک جستجوگر استفاده از یک ابر جستجوگر میباشد چون هم در حوزه ی بزرگتری جستجو میکند و هم سرویس های بیشتری را در اختیار کاربر قرار میدهد.

 

۱ موافقین ۰ مخالفین ۰ ۰۶ مهر ۹۱ ، ۱۰:۳۲
ایمان ریحانیان

سلام

 

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

 


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;

public class Main {
public static void main(String[] args) {
try {
URL url = new URL("http://blog.reihanian.com/");
BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
String strTemp = "";
while(null != (strTemp = br.readLine())){
System.out.println(strTemp);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}



با استفاده از این نمونه کد میتوان درخواستی از نوع پروتکل HTTP فرستاد و جواب آنرا دریافت کرد یا به عبارت دیگر یک صفحه وب را خواند.
در خط اول برنامه از کلاس URL استفاده شده است. این کلاس مانند یک اشاره گر به یک منبع در وب میباشد حالا این منبع میتواند یک فایل یا یک دایرکتوری باشد.
در خط بعدی با استفاده از متد ()openStream کانکشنی با آن منبع مشخص شده در کلاس URL برقرار میکند و آنرا میخواند و یک کلاس InputStream برمیگرداند.
از این مرحله به بعد همانند خواندن داده از یک فایل رفتار میکنیم.
و در مرحله بعد از کلاس InputStreamReader مانند پلی داده های باتی را به داده هایی از نوع کاراکتر تبدیل میکند.
و در مرحله بعدی کلاس BufferedReader داده های کاراکتری را برای دسترسی بهتر و سریعتر buffer میکند.
و در نهایت با استفاده از حلقه while داده ها را از buffer بصورت خطی میخواند و آنها را در متغییر strTemp ذخیره میکند و در console برنامه چاپ میکند.
کل مجموعه کد در بلوک try - catch قرار دارد که اگر خطایی رخ داد، خطا شناسایی شود.

۰ موافقین ۰ مخالفین ۰ ۰۶ مهر ۹۱ ، ۰۹:۴۹
ایمان ریحانیان

سلام

 

بالاخره امروز بعد از چندین روز کار سخت تونستم مطلبی بنویسم، مطلب امروز مربوط به یک عکس بسیار زیبا که اصطلاحا به آن Infographic (داده نمایی) میگویند مربوط میشه، حتما تا الان با سیستم های مختلفی کار کرده ایم و هرکس تجربه خاصی در این زمینه داره بعضی ها ویندوز را بهترین سیستم عامل از لحاظ تعامل با کاربر میدانند و بعضی ها لینوکس را از لحاظ کارایی و قدرت سیستم عامل بهتری میدانند ولی تعامل کاربری آنرا پایین تر میدانند و  کسانی که Mac کار کرده اند تجربه متفاوت تری دارند و Mac را هم از لحاظ زیبایی و تعامل با کاربر و هم از لحاظ قدرت از سیستم عامل های دیگر بالاتر میدانند.

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

به نظر من سیستم عامل لینوکس نسبت به گذشته بسیار تغییر کرده است و بسیاری از حرف هایی که شنیده میشود مربوط به باورهای اشتباهی است که وجود دارد و به نظرم ارزش یکبار امتحان کردن و لذت بردن از این سیستم عامل محبوب را دارد.

 

۰ موافقین ۰ مخالفین ۰ ۲۸ شهریور ۹۱ ، ۱۸:۳۸
ایمان ریحانیان

سلام

 

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

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

 

The Java Posse

 

 

The Java Spotlight Podcast

 

 

Java Pub House

 

 

Sun Developer Network

 

 

IBM Developer Works

 

 

InformIT

۱ موافقین ۱ مخالفین ۰ ۲۵ شهریور ۹۱ ، ۱۵:۱۵
ایمان ریحانیان

سلام

 

در این پست میخواهم در مورد دو نوع مولفه (Component) در Swing که در برای ساخت برنامه های گرافیکی تحت سیستم عامل در جاوا استفاده میشود بنویسم،

در Swing جاوا دو نوع مولفه وجود دارد : مولفه های سنگین وزن (Heavyweight Component) و مولفه های سبک وزن (Lightweight Component)، مولفه های سنگین وزن قبل از معرفی swing برای ساخت برنامه های گرافیکی دسکتاپی استفاده میشد و Swing مخلوطی از مولفه های سنگین وزن و سبک وزن میباشد.
مولفه های سنگین وزن (Heavyweight Component) : مولفه های گرافیکی هستند مانند JFrame،JDialog و JWindow که از مولفه های گرافیکی سیستم برای نمایش استفاده میکند و وابسته به سیستم عامل مورد استفاده است پس در سیستم عامل های مختلف شکل ظاهری نمایش آنها متفاوت است و تمام مولفه های AWT سنگین وزن میباشند.
مولفه های سبک وزن (Lightweight Component) : این گروه از مولفه ها آنهایی هستند که از کتابخانه های سیستم عامل برای ساخت و نمایش کامپوننت های گرافیکی استفاده نمیکنند. و مستقیما از Java2D برای نمایش اشکار گرافیکی استفاده میکنند به همین دلیل شکل ظاهری آنها مستقل از سیستم عامل میباشد و به نسبت کارایی بیشتری دارند مثلا میتوان آنها را با هم ترکیب کرد و ظاهر آنها را تغییر داد و تنظیمات مختلفی را به آنها اعمال کرد، از جمله این مولفه ها میتوان به مولفه های Swing به غیر از چند مورد که در بالا اشاره شد، اشاره کرد.

۰ موافقین ۰ مخالفین ۰ ۲۳ شهریور ۹۱ ، ۱۰:۲۲
ایمان ریحانیان

بعد از خواندن از یک فایل متنی به وسیله جاوا میتوان همان برنامه را با اندکی تغییر به برنامه ای برای نوشتن متن در یک فایل تبدیل کرد، که شبه برنامه زیر این کار را انجام میدهد :

 

class FileWriter {
    public static void main(String args[]) {
        try {
            FileOutputStream fstream = new FileOutputStream("textfile.txt");

            DataOutputStream out = new DataOutputStream(fstream);
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
            bw.write("blog.reihanian.com");

            bw.flush();
            out.close();
            fstream.close();
        } catch (Exception e) {
            System.err.println("Error: " + e.getMessage());
        }
    }
}

در خط اول کلاس FileOutputStream اتصالی با فایل متنی مورد نظر بر قرار میکند و چون قرار است داده ای در این فایل نوشته بشود در صورت پیدا نکردن فایل مورد نظر آنرا میسازد و خطا رخ نمیدهد و با استفاده از این کلاس فقط میتوان داده ها را بصورت بایت (byte) ذخیره کرد.
کلاس DataOutputStream داده ها را برای تبدیل از متغییر های اولیه (primitive data type) به متغییر های برای استفاده در انواع output stream مانند FileOutputStream که از ساختار پلتفرم جدا است تبدیل میکند.
با استفاده از کلاس OutputStreamWriter میتوان داده ها از نوع کاراکتری به داده ها از نوع بایت (byte) تبدیل کرد.
در قسمت بعد با استفاده از کلاس BufferedWriter میتوان داده ها در buffer نوشت، که برای نوشتن داده ها از متد write استفاده شده است.
پس از نوشتن متن مورد نظر در buffer میتوان با استفاده از متد flush داده ها را از buffer به فایل منتقل کرد.
پس از آن بترتیب کلاس های DataOutputStream و FileOutputStream را میبندیم تا اتصال ایجاد شده با منبع خارجی از بین برود و داده ها در فایل ذخیره بشوند.
کل مجموعه کد در بلوک try - catch قرار دارد که اگر خطایی رخ داد ، خطا شناسایی شود.

۱ موافقین ۰ مخالفین ۰ ۲۱ شهریور ۹۱ ، ۱۵:۱۱
ایمان ریحانیان

معمولا در برنامه نویسی برای هر کاری چندین راه حل مختلف وجود دارد که در همین مورد هم مطرح است، برای خواندن متن از یک فایل چندین راه حل وجود دارد که من یکی از آنها را اینجا توضیح میدهم.

 

import java.io.*;
class FileRead
{
 public static void main(String args[])
  {
  try{
 
  FileInputStream fstream = new FileInputStream("textfile.txt");
 
  DataInputStream in = new DataInputStream(fstream);
  BufferedReader br = new BufferedReader(new InputStreamReader(in));
  String strLine;
 
  while ((strLine = br.readLine()) != null)   {
 
  System.out.println (strLine);
  }
 
  in.close();
    }catch (Exception e){
  System.err.println("Error: " + e.getMessage());
  }
  }
 

اگر برنامه بالا را اجرا کنید شروع به خواندن از فایلی به نام textfile با پسوند txt میکند، که به توضیح آن میپردازم.
کلاس FileInputStream یکی از کلاس هایی است که با استفاده از آن میتوان به منبعی خارج از برنامه دسترسی پیدا کرد.
کلاس DataInputStream کلاسی است که با استفاده از آن میتوان داده ها را بصورت داده ابتدایی (Primitive Data Type) و بصورت مستقل از ساختار پلتفرم از هر Input Stream مانند FileInputStream خواند.
در خط بعدی کلاس InputStreamReader مانند پلی داده های باتی را به داده هایی از نوع کاراکتر تبدیل میکند.
در خط بعدی کلاس BufferedReader داده های کاراکتری را برای دسترسی بهتر و سریعتر buffer میکند.
و در نهایت با استفاده از حلقه while داده ها را از buffer بصورت خطی میخواند و آنها را در متغییر strLine ذخیره میکند و در console برنامه چاپ میکند.
و در انتها اتصال ایجاد شده به منبع خارجی را میبندد.
کل مجموعه کد در بلوک try - catch قرار دارد که اگر خطایی رخ داد ( مثلا منبع ارجاع داده شده textfile وجود نداشته باشد)، خطا شناسایی شود.
۳ موافقین ۰ مخالفین ۰ ۲۱ شهریور ۹۱ ، ۱۱:۲۷
ایمان ریحانیان

به نام خدا

 

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

  • استفاده از دستور top :

# top

 

دستور top امکان مانیتور کردن پویا سیستم و نرم افزارهای درحال اجرا را در اختیار کاربر میگذارد و جزییات هر ۵ ثانیه بروز میشود.

این ابزار شامل چندین کلید بسیار مفید میباشد که استفاده از آنها بسیار پرکاربرد است.

کلید t : این کلید اطلاعاتی در مورد سیتم در حال اجرا به کاربر میدهد.

کلید m : این کلید اطلاعاتی در مورد حافظه سیستم به کاربر میدهد.

کلید a : این کلید نرم افزارها را بر اساس میزان منابع مرتب میکند.( مناسب برای شناسایی سریع نرم افزارهایی که منابع زیاد استفاده میکنند.)

کلید z : این کلید رنگ اطلاعات ثابت را از اطلاعات متغیر تغیر میدهد.

کلید k : با استفاده از این کلید میتوان پروسس مشخصی را از بین برد.

  • استفاده از دستور vmstat :

این دستور اطلاعاتی را در مورد پروسس ها، حافظه، block IO، paging traps و فعالیت های پردازنده گزارش میکند.

  • استفاده از دستور w :

دستور w اطلاعاتی در مورد کاربرانی که در حال حاضر Login in هستند و درحال انجام چه فعالیتی هستند میدهد.

  • استفاده از دستور uptime :

این دستور مقدار زمان روشن بودن سرور و اطلاعاتی مانند تعداد کاربران و load average را میدهد.

  • استفاده از دستور ps :

دستور ps اطلاعاتی در مورد پروسس های درحال اجرا میدهد، برای نمایش همه پروسس ها میتوان از دستور های زیر استفاده کرد :

# ps  -A

# ps  -e

 

دستور ps مانند top است ولی اطلاعات بیشتری را در اختیار کاربر میگذارد و ازجمله این اطلاعات میتوان به موارد زیر اشاره کرد :

نمایش دادن درخت پروسس ها :

# ps -ejH

# ps axjf

# pstree

 

گزارش کردن اطلاعات امنیتی :

 

# ps -eo euser,ruser,suser,fuser,f,comm,label

# ps axZ

# ps -eM

نمایش تمام پروسس ها که از طریق کاربر خاصی متلا iman در حال اجرا است :

 

# ps -U iman -u iman u

 

  • استفاده از دستور free :

این دستور مقدار آزاد و مصرف شده حافظه فیزیکی و swap و اطلاعات مفیدی مانند مقدار buffer و cache را نمایش میدهد.

# free

 

 

۰ موافقین ۰ مخالفین ۰ ۲۳ مرداد ۹۱ ، ۱۶:۵۶
ایمان ریحانیان