آموزش جدید Java
برای ثبت نام در دوره آموزش Java می توانید از لنک موجود استفاده نمایید .
مقدمه ای بر زبان و بستر اجرای Java
پروژه ی زبان برنامه نویسی جاوا را توسعه دهنده ی مشهور James Gosling در شرکت Sun Microsystem برای اولین بار کلید زده و در سال 1995 آن را به عنوان مولفه ی اصلی بستر اجرای جاوا (Java 1.0 [J2SE]) از شرکت Sun Microsystems منتشر کرد (Java 1.0 [J2SE]).
آخرین ویرایش رسمی و پایدار جاوا، بستر اجرای جاوا ورژن 8 یا 8 Java Standard Edition می باشد. با پیشرفت زبان Java و محبوبیتی که بدست آورد، تنظیمات مختلفی صورت گرفت تا جاوا با انواع پلت فرم ها سازگاری داشته و برنامه های نوشته شده با آن در تمامی محیط ها قابل اجرا باشد. برای مثال می توان به J2EE برای پیاده سازی اپلیکیشن های تجاری و بزرگ، J2ME برای توسعه ی اپلیکیشن های کوچک و تحت موبایل اشاره کرد.
ورژن های جدید J2 هر یک به ترتیب تحت عنوان Java SE"، Java EE و Java ME نام گذاری شدند. آنچه باعث محبوبیت بالای Java شده، شعار "کد را یکبار بنویس و آن را در همه بسترها اجرا کن" می باشد.
از ویژگی ها و امکانات زبان جاوا می توان به موارد زیر اشاره کرد:
- شی گرا یا Object Oriented – در آموزش Java همه چیز یک آبجکت است و از آنجایی که این زبان مبتنی بر مدل شی گرا/Object model می باشد، به راحتی می توان آن را گسترش داد.
- مستقل از بستر اجرای خاص و قابل اجرا بر روی محیط های مختلف/platform independent – برخلاف بیشتر زبان های برنامه نویسی مانند C و C++، زبان جاوا پس از کامپایل، مستقیما به زبان قابل فهم برای ماشین تبدیل نمی شود بلکه کامپایلر دستورات جاوا را به یک زبان میانی مستقل از پلت فرم به نام byte code ترجمه می کند. این زبان میانی را سپس برنامه ای به نام دستگاه مجازی جاوا یا JVM که نسخه های مختلف آن برای پلت فرم های متفاوت طراحی و پیاده سازی شده، به زبان قابل فهم برای ماشین تفسیر می کند.
- سادگی – Java طوری طراحی شده که یادگیری آن سهل باشد. پس از درک مفاهیم پایه ای شی گرایی و OOP، یادگیری باقی زبان بسیار آسان خواهد بود.
- امن (Secure) – Java به توسعه دهنده این امکان را می دهد که یک برنامه ی کارا، عاری از ویروس، قابل اطمینان و امن برای تمامی سیستم ها پیاده سازی کند. برنامه های مبتنی بر آموزش Java برای سنج هویت و authentication از روش رمزنگاری کلید عمومی (public-key encryption) بهره می گیرند.
- قابلیت اجرا بر روی پردازنده و محیط های مختلف به صورت یکسان/ Architecture-neutral- کامپایلر جاوا یک فایل حاوی آبجکت با فرمت خاص و architecture-neutral تولید می کند که برای کد کامپایل شده قابلیت اجرا بر روی پردازنده ی های مختلف و محیط های اجرایی مطرح را فراهم می آورد. این امکان با حضور سیستم زمان اجرای جاوا یا java runtime system در اختیار توسعه دهندگان برنامه ی جاوا قرار می گیرد.
- Portable و قابلیت اجرا بر روی هر سخت افزاری که JVM سازگار و مربوطه را دارد – خروجی کامپایلر جاوا یک کد غیر قابل اجرا به نام Bytecode است. در صورت وجود JVM یا دستگاه مجازی جاوا سازگار با سخت افزار میزبان، Bytecode را سیستم زمان اجرای جاوا یا Java run-time system که خود توسط jvm فراخوانی می شود، اجرا می نماید. کامپایلر مورد استفاده ی Java با ANSI C نوشته شده و یک زیرمجموعه از POSIX می باشد.
- Robust – Java سعی می کند با تاکید بر روی بررسی خطاها در زمان کامپایل و اجرا، شرایطی که ممکن است در آن خطاهای زیادی رخ دهد را از میان بردارد.
- قابلیت پردازش موازی و انجام چند کار به صورت همزمان (multi-threaded) – با قابلیت پردازش موازی زبان جاوا، این امکان برای توسعه دهنده فراهم شده که برنامه هایی پیاده سازی کند که چندین کار و عملیات را همزمان انجام دهد. این ویژگی زبان Java به توسعه دهنده امکان می دهد تا اپلیکیشن های تعاملی با قابلیت اجرا و پاسخ گویی سریع بنویسد.
- مفسری (Interpreted) – byte code که خروجی کامپایلر جاوا می باشد در حین اجرا به دستورات قابل فهم برای ماشین تبدیل می شود و این دستورات در حافظه ذخیره نمی شوند. فرایند توسعه بسیار سریع تر و تحلیلی خواهد بود چرا که پروسه ی linking (متصل کردن فایل ها فایل های اجرایی کوچک در قالب یک فایل اجرایی بزرگ واحد) افزایشی و سبک خواهد بود.
- کارایی بالا/high performance – به کمک کامپایلرهایی که کدها را در لحظه و به صورت داینامیک (Just-In-Time) ترجمه می کنند، سرعت اجرای برنامه افزایش می یابد.
- Distributed – قابلیت توسعه ی اپلیکیشن های تجاری، بزرگ و توزیع شده بر روی بستر وب و اینترنت را فراهم می آورد.
- Dynamic (داینامیک و دارای قابلیت تفسیر کد بر اساس دستگاه میزبان در زمان اجرا) – Java در اصل نسبت به C و C++ از ویژگی پویایی بیشتری برخودار است چرا که برای تطبیق با محیطی در حال تکامل تعبیه شده است. برنامه های مبتنی بر Java مقدار زیادی اطلاعات زمان اجرا (run-time) را با خود حمل می کنند که این اطلاعات می توانند جهت بررسی صحت و برطرف کردن دسترسی به آبجکت ها در زمان اجرا بکار روند.
پیشینه ای از جاوا
James Gosling پروژه ی زبان برنامه نویسی Java را در ژوئن سال 1991 جهت استفاده در یکی از چندین پروژه ی گیرنده ی دیجیتال تلویزیون (set-top box) خود کلید زد. زبان مورد نظر که در ابتدای امر "Oak"، اسم درختی که در بیرون دفتر مخترع زبان قرار داشت، نام گذاری شده بود و گاهی "Green" نیز نامیده می شد، در نهایت با استخراج کلمه ای تصادفی از یک لیست به Java تغییر نام یافت.
شرکت Sun اولین پیاده سازی و ویرایش عمومی از Java را تحت عنوان Java 1.0 در سال 1995 منتشر کرد. این زبان با شعار "کد را یکبار بنویس و آن را در تمامی محیط ها اجرا کن" یا WORA و ارائه ی runtime های رایگان برای بسترهای اجرا (platform) مطرح، محبوبیت بسیاری کسب کرد.
در تاریخ 13 نوامبر سال 2006، شرکت نام برده عمده ی قابلیت ها و ابزار Java را به صورت یک نرم افزار رایگان و متن باز (open source) تحت لیسانس GPL در اختیار عموم قرار داد.
در 8 مه سال 2007 میلادی، شرکت Sun پروسه را به اتمام رسانده و کل هسته (core) جاوا را به استثنای بخش کوچکی از کد که Sun مجوز نشر آن را نداشت، به صورت رایگان و متن باز (open-source) در اختیار توسعه دهندگان علاقه مند قرار داد.
مقاله های آموزش Java

شرح مفهوم platform: هر سخت افزار یا محیط نرم افزاری که برنامه در آن اجرا می شود، تحت عنوان platform شناخته می شود. از آنجایی که Java محیط اجرا (runtime environment) و توابع کتابخانه ای/API اختصاصی خود را دارد، به آن platform گفته می شود.

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

از آنجایی که گرامر زبان Java مبتنی بر C++ است، آن دسته از برنامه نویسانی که قبلا با C++ کار کرده اند به راحتی می توانند Java را نیز یاد بگیرند.

تفاوت ها و شباهت های بسیار زیادی بین زبان برنامه نویسی C++ و Java وجود دارد که در زیر به آن ها اشاره خواهیم کرد. لیستی از تفاوت های اصلی بین دو زبان مزبور را در جدول حاضر مشاهده می کنید:

در این مقاله، با گرامر و ابزار زبان Java یک برنامه ی ساده ی کاربردی خواهیم نوشت. کافی است ابزار توسعه ی اپلیکیشن جاوا یا JDK را نصب کنیم.

در آموزش حاضر به شرح تفصیلی جزئیات برنامه ی ساده ی چاپ متن در خروجی Hello Java خواهیم پرداخت.

اگر شما فایلی که حاوی دستورات زبان java (java source file) هست را داخل پوشه ی jdk/bin ذخیره نمایید، دیگر لازم نیست path را مقداردهی نیز کنید. در شرح علت آن باید گفت که تمامی ابزار مورد نیاز در پوشه ی جاری در دسترس شما خواهد بود.

جهت توسعه و پیاده سازی اپلیکیشن های مبتنی بر Java بد نیست تفاوت بین (ابزار توسعه ی جاوا) JDK ، (محیط و بستر اجرای برنامه ی جاوا) JRE و (دستگاه مجازی جاوا) JVM را درک نمایید. در مبحث حاضر شرح مختصری از JVM یا همان دستگاه مجازی جاوا در اختیار شما قرار خواهیم داد.

Java Virtual Machine یا به اختصار JVM یک دستگاه انتزاعی و مجرد پیاده سازی شده از روی یک دستگاه حقیقی مانند رایانه است که برنامه های نوشته شده با زبان Java را به مانند یک دستگاه واقعی اجرا می کند.

متغیر یا به انگلیسی variable اسمی است که به ناحیه ای در حافظه تخصیص می یابد و نقش ظرف را برای نگهداری مقداری در حافظه ایفا می کند. در کل سه نوع متغیر در Java وجود دارد

سیستم یونیکد یک استاندارد بین المللی کدگذاری کاراکتر است که قابلیت نمایش و ارائه ی بیشتر زبان های نوشتاری دنیا را دارا می باشد.

طبق گفته های شرکت Sun Microsystems، قفل یا monitor های جاوا reentrant هستند، بدین معنی که اگر متدی از داخل متدی دیگر که synchronized هست، فراخوانی شود، thread می تواند از همان monitor برای هر دو متد استفاده کند.
آموزش دستور کنترل در Java

if یک دستور شرطی و کنترل روند اجرای برنامه است که به توسعه دهنده امکان می دهد تا شرط یا شروطی را بررسی کند و در صورت صحیح بودن شرط مورد نظر دستور یا عملیات خاصی را اجرا کند.

دستور switch از میان چندین دستور آن دستوری که شرط متناظرش برقرار و صحیح باشد را اجرا می کند. ساختمان switch کاربردی مشابه if else if دارد.

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

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

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

دستور break در Java در برنامه نویسی جهت قطع روند اجرای برنامه و خروج از ساختمان حلقه یا switch بکار می رود. به عبارت دیگر این دستور سبب می شود جریان اجرای برنامه در مواجه با شرط صحیح مورد نظر که دستور break پس از آن درج شده، قطع گردد. در Java

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

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

در آموزش حاضر چندین برنامه ی ساده را با استفاده از زبان برنامه نویسی Java پیاده سازی خواهیم کرد.
آموزش ارث بری در Java

وراثت در جاوا مکانیزمی است که توسط آن آبجکتی تمامی ویژگی (property) و قابلیت ها (behavior) آبجکت پدر را کسب کرده و در اصطلاح به ارث می برد.

زمانی که یک کلاس جاوایی حاوی اشاره گری به کلاس دیگری باشد (entity reference یا آبجکت از جنس کلا دیگر)، این امر تحت عنوان Aggregation یا رابطه ی یک طرفه ی Has-A شناخته می شود. در Java
آموزش کلاس های انتزاعی در Java

یک کلاس که با کلیدواژه ی abstract اعلان شده باشد، به عنوان کلاس abstract/انتزاعی شناخته می شود. کلاس abstract می تواند متدهای abstract یا بدون بدنه و متدهای با بدنه (nonabstract) داشته باشد. پیش از پرداختن به کلاس های abstract در Java، لازم است با مفهوم abstraction آشنا شویم.

interface در جاوا مانند یک الگو یا نقشه برای کلاس می باشد. این ساختار دارای ثوابت static و متدهای بدون بدنه (abstract) می باشد. به عبارت دیگر interface مکانیزمی برای پیاده سازی مفهوم انتزاع (abstraction) در برنامه نویسی می باشد. لازم به ذکر است که داخل interface توسعه دهنده می تواند فقط متدهای abstract و بدون بدنه تعریف کند. آموزش کار با interface در Java

کلاس abstract و interface هر دو برای پیاده سازی مفهوم انتزاع/abstraction در برنامه نویسی بکار می روند که می توانید در بدنه ی آن ها متدهای abstract (بدون بدنه و پیاده سازی) را تعریف کنید. کلاس abstract و interface هر دو غیر قابل نمونه سازی هستند و به عبارت ساده تر نمی توان مانند کلاس از روی آن ها آّبجکت ساخت.آموزش تفاوت interface با کلاس abstract در Java
آموزش کلاس اشیا در Java

در این مبحث، مفاهیم و مبانی OOP را فراخواهیم گرفت. برنامه نویسی شی گرا یک الگو یا تکنیک برنامه نویسی است که مفاهیمی نظیر وراثت (inheritance)، اتصال داده ها (data binding)، چندریختی (polymorphism) و غیره .. را معرفی کرده و بکار می گیرد. آموزش مفاهیم شی گرایی در Java

اسم تمامی کلاس ها، interface ها، package ها، متدها و فیلدهای کلاس با توجه به این قوانین قراردادی زبان Java نام گذاری می شوند.

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

Constructor یا تابع سازنده در زبان Java یک متد خاص است که برای مقداردهی اولیه ی فیلدهای کلاس و پرکردن آّبجکت با داده بکار می رود.

کلیدواژه ی static در زبان Java غالبا برای مدیریت حافظه بکار می رود. می توان این کلیدواژه را به متغیر، متد، قطعه کد و کلاس های تودرتو (کلاس هایی که داخل کلاس دیگری تعریف شده اند) اعمال کرد. کلیدواژه ی نام برده به خود کلاس (برای مثال متغیر موجود در کلاس کلی) اعمال می شود نه نمونه یا نمونه هایی که از روی کلاس مورد نظر ساخته شده اند.

کلیدواژه ی this کاربردهای مختلفی در زبان دارد. در Java، کلیدواژه ی this به آبجکت جاری (آبجکتی که در آن هستیم) اشاره دارد.
آموزش چند ریختی (Polymorphism) در Java

زمانی که کلاسی چندین متد همنام با پارامترهای مختلف دارد، در اصطلاح برنامه نویسی شی گرا به آن method overloading می گویند. در برنامه ای که توسعه دهنده مجبور است به اجرای تنها یک عملیات است، داشتن چندین متد همنام می تواند در افزایش خوانایی کد اپلیکیشن نقش اساسی ایفا کند.آموزش method overloading در Java

زمانی که متدی در کلاس فرزند (subclass) با متدی از کلاس پدر (parent class) هم نام باشد، اما پیاده سازی اختصاصی خود از آن متد را در بدنه ارائه دهد، به آن بازنویسی بدنه یا پیاده سازی متد (method overriding) می گویند.

نوع خروجی covariant بدین معنی است که اگر توسعه دهنده بدنه ی متدی از کلاس پدر را در کلاس فرزند بازنویسی کرد،

کلیدواژه ی super در Java یک متغیر یا آبجکت اشاره گر (reference variable) به نمونه ای از نزدیک ترین کلاس پدر می باشد. هر زمان که توسعه دهنده نمونه ی کلاس فرزند را ایجاد می کند، همزمان یک نمونه از کلاس پدر نیز به صورت ضمنی و غیر مستقیم در حافظه ایجاد می گردد. در Java برای اشاره به این نمونه ی ساخته شده از کلاس پدر از کلیدواژه ی super استفاده می شود.

instance initializer block برای مقداردهی اولیه ی اعضای داده ای و فیلدهای کلاس (instance member ها) بکار می رود. این قطعه کد هر بار که یک نمونه از روی کلاس ساخته می شود، اجرا می گردد.

کلیدواژه ی final در زبان جاوا اگر همراه متغیر بکار رود، یعنی مقدار اولیه ی آن متغیر نهایی و ثابت بوده و دیگر تغییر نخواهد کرد، اگر در خط تعریف متد قید شود، بدین معنی است که آن متد قابل بازنویسی (override) و ویرایش در کلاس فرزند نخواهد بود و رفتار متد برای همیشه ثابت می باشد.

آموزش Java – Polymorphism یا چندریختی در Java

در این مبحث به شرح static binding و dynamic binding که تشخیص، فراخوانی و اتصال کد مربوطه در زمان کامپایل (زودهنگام) و اجرا (دیرهنگام) هست، خواهیم پرداخت.

توسعه دهنده می تواند با بهره گیری از instanceof بررسی کند آیا آبجکت مورد نظر نمونه ای از نوع مشخص است یا خیر (کلاس یا کلاس فرزند (subclass) و یا interface).آموزش Java
آموزش کپسوله سازی در Java

package یک گروه از کلاس هایی با کاربرد مشابه، interface ها و sub-package ها است. به عبارت دیگر به وسیله ی package می توان کلاس ها را رده بندی و سازمان دهی کرد. در Java پکیج به دو دسته تقسیم می شود،

در جاوا دو نوع modifier یا تعریف کننده وجود دارد: access modifier ها که تنظیم کنندگان سطح دسترسی هستند و non-access modifier.Java

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

آرایه در Java یک آبجکت است که المان هایی با نوع مشابه را دربرمی گیرد. به عبارت دقیق تر، آرایه یک ساختار داده ای است که در آن المان های مشابه و هم نوع را ذخیره می کنیم. لازم به ذکر است در آرایه ی Java تنها می توان مجموعه ثابتی از المان های هم نوع را نگهداری کرد بدین معنی که تعداد المان ها یا طول آرایه همان اول مشخص شده و در زمان اجرای برنامه دیگر قابل تغییر نخواهد بود.
آموزش شی گرایی در Java

کلاس Object کلاس پدر تمامی کلاس ها در جاوا می باشد. به عبارت دیگر، بالاترین کلاس در سلسله مراتب وراثت کلاس Object است که تمامی کلاس های جاوا از آن مشتق می شوند.آموزش Java – کلاس Object در Java

عبارت object cloning در برنامه نویسی به معنای ساخت یک نمونه ی عینی از روی آبجکت مورد نظر می باشد. در Java برای دستیابی به این هدف باید متد clone() از کلاس پایه ی Object فراخوانی شود.

کلاس Wrapper در جاوا این امکان را به شما می دهد تا نوع آبجکت را به انواع داده ای اولیه (primitive) و انواع داده ای اولیه را به آبجکت تبدیل نمایید. نمونه هایی که از کلاس مزبور ساخته می شوند می توانند مقادیر از نوع داده ای مورد نظر را در خود کپسوله نمایند به همین علت بایستی به تابع سازنده ی (constructor) آن نوع صحیح را ارسال کنید.

Recursion یا الگوریتم بازگشتی زمانی اتفاق می افتد که یک متد خود را به کرات صدا بزند. به متدی که خود را فراخوانی می کند، در اصطلاح تابع recursive یا بازگشتی گویند.

در Java آرگومان ها به صورت پیش فرض به روش (ارسال کپی از مقدار به عنوان آرگومان) call by value به تابع ارسال می شوند نه با call by reference که طی آن آدرس متغیر در حافظه ی heap به عنوان آرگومان به تابع فرستاده می شود و تغییر در مقدار آرگومان تغییر در مقدار اصلی متغیر را به دنبال دارد. در روش call by value که صرفا کپی از مقدار متغیر به عنوان آرگومان به تابع فرستاده می شود،

توسعه دهنده می تواند با استفاده از کلیدواژه ی strictfp مطمئن شود هر گونه عملیاتی که بر روی مقدار متغیر از نوع ممیز شناور (floating-point) انجام می شود، در تمامی بسترهای اجرا (platform) نتیجه ی یکسان را برمی گرداند. در واقع دقت و تعداد اعداد (precision) در مقادیر خروجی ممیز شناور ممکن است در بسترهای (platform) مختلف متفاوت باشد.

می توان به کمک ابزار javadoc توابعی کتابخانه ای جهت مستندنویسی و توضیح کدبرنامه ی خود تعریف کرد. برای توضیح کد خود در فایل های جاوا کافی است متن توضیح کد را داخل کاراکترهای /**... */ قرار دهید. با این روش می توانید به راحتی برای کامپوننت های مختلف کد و برنامه ی خود نظیر کلاس، متد، constructor (تابع سازنده)، فیلدها و متغیرها را کامنت درج نمایید.

آرگومان های خط فرمان، آرگومان هایی هستند که توسعه دهنده آن ها را از پنجره ی فرمان (cmd) به تابع main جاوا(Java) ارسال کرده و این پارامتر ها در زمان اجرای برنامه ی java در پارامترهای ورودی تابع مزبور،(String args[])، می شوند.

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

تفاوت های زیادی بین (بازنویسی بدنه ی متد در کلاس فرزند) method overriding و (فراخوانی متدی با نام یکسان اما هر بار با پارامترهای مختلف) method overloading در Java وجود دارد که در جدول زیر آن ها را برای شما لیست می کنیم.
آموزش توابع رشته ای (String) در Java

در جاوا، String دنباله ای از کاراکترها (char value) است. آرایه ای از کاراکترها را نیز می توان یک رشته ی java در نظر گرفت و تقریبا عملکردی مشابه را ایفا می کند.
آموزش متدهای رشته ای(String Method) در Java

در Java متد String charAt() مقدار char یا کاراکتر مورد نظر موجود در اندیس (شماره ی مکان قرار گیری) ورودی را برمی گرداند. اندیس از 0 آغاز می شود. اگر شماره ی اندیس از بازه ی اندیس و طول رشته ی ورودی بزرگتر باشد یا مقدار آن منفی باشد، خطای StringIndexOutOfBoundsException را بجای خروجی برمی گرداند.

متد java string length() تعداد کل کاراکترهای موجود در رشته که همان طول رشته تلقی می شود را برمی گرداند. طول رشته ی java معادل همان واحد کدی (code unit) Unicode رشته می باشد.

متد java string format() رشته ی ورودی را بر اساس زبان محلی که توسط پارامتر Locale مشخص می شود و همچنین بر اساس فرمت و آرگومان های ارسال شده، فرمت بندی کرده و در خروجی برمی گرداند.

متد string substring() در Java بخشی از یک رشته (که در اصطلاح به آن substring گفته می شود) را استخراج کرده و به عنوان خروجی برمی گرداند.

متد string contains() در Java بررسی می کند آیا دنباله ی کاراکترها که به عنوان پارامتر به متد ارسال می شود، در رشته ی مورد نظر وجود دارد یا خیر. اگر کاراکترهای مورد نظر در این رشته موجود باشد، مقدار true و در غیر این صورت false را بازگردانی می کند.

متد string join() در Java رشته ی ورودی (المان هایی از جنس رشته) را با کاراکتر تفکیک کننده ی مورد نظر (پارامتر delimiter) به هم متصل کرده و در خروجی آن رشته را بازمی گرداند. در این متد، تفکیک کننده به ازای هر المان کپی می شود.

متد string equals() دو رشته از جنس آبجکت را بر اساس محتوا بایکدیگر مقایسه می نماید. اگر حتی یک کاراکتر از رشته ی مورد نظر با کاراکتر موجود در رشته ی ورودی منطبق نباشد، مقدار بولی false را برمی گرداند. اگر تمامی کاراکترهای دو رشته با هم منطبق باشند، مقدار true را برمی گرداند.

متد java string isEmpty() بررسی می کند آیا رشته ی ورودی خالی از محتوا است یا خیر. چنانچه طول رشته (تعداد کاراکترهای داخل آن) برابر 0 باشد، مقدار true و در غیر این صورت false را برمی گرداند.

متد java string concat() رشته ی ارسال شده به عنوان آرگومان را به انتهای رشته ی مورد نظر الصاق می کند. خروجی این متد ترکیب محتوای رشته ی مورد نظر (آبجکت از جنس کلاس string) و رشته ی ورودی می باشد. به عبارت دیگر این متد یک رشته را به انتهای رشته ی دیگر الصاق می کند.

متد replace() تمامی کاراکترهای جدید (محتوای رشته ی ارسال شده به عنوان پارامتر) را جایگزین کاراکترهای قدیمی در رشته ی مورد نظر کرده و رشته ی ویرایش شده را در خروجی برمی گرداند.

متد String equalsIgnoreCase در Java محتوای دو رشته را صرف نظر از کوچک و بزرگی حروف، با یکدیگر مقایسه می کند. این متد عملکردی مشابه equals() دارد با این تفاوت که نسبت به کوچک و بزرگی حروف حساس نیست. در صورتی که حتی یک کاراکتر با کاراکتر موجود رشته ی اصلی مطابقت نداشته باشد، مقدار false را برمی گرداند و در غیر این صورت true را بازگردانی می کند.

متد split() در Java رشته ی مورد نظر بر اساس عبارت باقاعده (پارامتر regex) یا الگوی ارسال شده به عنوان آرگومان به رشته های کوچکتر یا به عبارتی آرایه ای از رشته ها تبدیل می کند و آن را در خروجی برمی گرداند (یک آرایه از رشته ها باز می گرداند).

متد java string startsWith() بررسی می کند آیا رشته (محتوای آبجکت از جنس کلاس String برای مثال s1) با پیشوند ارسال شده به عنوان آرگومان (دنباله ای از کاراکترها) آغاز می شود یا خیر. اگر رشته با مقدار پارامتر prefix آغاز شود، true را برمی گرداند و در غیر این صورت false را بازمی گرداند.

متد string substring() بخشی از کل یک رشته را (از اندیس شروع تا اندیس پایان) استخراج کرده و در خروجی برمی گرداند.

متد toCharArray() در Java رشته ی ورودی را به آرایه ای از کاراکترهای تبدیل می کند. این متد در خروجی یک آرایه از کاراکترها را می سازد که طول و تعداد کاراکترهای موجود در آن برابر رشته ی اصلی بوده و محتوای آن با کاراکترهای همان رشته ی اصلی پر (مقداردهی اولیه) می شوند.

متد toLowerCase() در Java کاراکترهای رشته ی ورودی را به حروف کوچک تبدیل می کند. به عبارت دیگر، این تابع تمامی کاراکترهای رشته را از حروف بزرگ به کوچک تبدیل می کند.

متد toUpperCase() در Java کاراکترهای رشته ی ورودی را به حروف بزرگ تبدیل می کند.

متد trim() کاراکترهای space (فاصله) را از ابتدا و انتهای رشته ی مورد نظر حذف می کند. مقدار Unicode کاراکتر space معادل '\u0020' می باشد. متد trim() در جاوا بررسی می کند آیا مقدار مزبور قبل و بعد از رشته ی مورد نظر وجود دارد یا خیر. در صورت مواجه شدن با این مقدار، space را از دو طرف رشته حذف کرده و رشته ی ویرایش شده را به عنوان خروجی برمی گرداند.

متد valueOf() در Java انواع داده ای که به عنوان آرگومان به تابع فرستاده شده اند را به رشته تبدیل می کند. به کمک این متد توسعه دهنده می تواند نوع int، long، boolean، character، float، double، object و char array را به رشته تبدیل کند.
آموزش عبارات با قاعده(Regular Experation) در Java

Java Regex یا عبارات باقاعده یک سری توابع کتابخانه ای/API در جاوا هستند که توسعه دهنده به کمک آن ها می تواند الگوهایی تعریف کرده و بر اساس آن عبارت مورد نظر را در رشته جستجو و پس از یافتن ،ویرایش (جایگزین) نماید. به طور کلی Regular expression عبارت است از تعدادی روش و قانون که برای بررسی وجود یک عبارت (دنباله ای از مقادیر متنی، عددی و ...)، استخراج و جایگزینی آن در بستر بکار می رود.
آموزش مدیریت خطا (Exception Handling) در Java

مدیریت خطا/Exception Handling در Java یکی از مکانیزم های کارا جهت مدیریت خطاهای زمان اجرا است تا جریان اجرای برنامه قطع نشده و روند عادی برنامه دچار اخلال نشود.

در Java داخل بدنه ی try کدی که ممکن است سبب رخداد خطا شود را قرار می دهند. بعد از قطعه کد try حتما باید یا دستور catch و یا finally استفاده شود. کدی که ممکن است اجرای آن منجر به خطا شود، بایستی داخل قطعه کد try قرار داده شده و در واقع در این قسمت از برنامه امتحان شود تا امکان اجرای موفقیت آمیز آن مشخص گردد

در شرایطی که لازم است در صورت رخداد خطاهای متفاوت، جهت مدیریت هریک عملیات متفاوتی در Java را اجرا کنید، می توانید پس از بدنه ی دستور try خود از چندین قطعه کد catch استفاده نمایید.

می توان یک قطعه کد try را در Java در بدنه ی قطعه کد try دیگر گنجاند که در اصطلاح به آن دستورات try تودرتو/nested گفته می شود

قطعه کد finally در Java میزبان کدهایی است که اجرای آن ها بسیار مهم است نظیر بستن connection به دیتابیس یا متوقف کردن stream از بایت ها و غیره ... . دستور finally صرف نظر این که خطایی در برنامه رخ داده و مدیریت می شود یا خیر، اجرا خواهد شد و به عبارت دیگر فراخوانی آن قطعی است. finally همیشه پس از try یا catch استفاده می شود.

کلیدواژه ی throw در Java زمانی استفاده می شود که توسعه دهنده بخواهد یک خطا را به صورت صریح صادر (throw) کرده و از وقوع رخداد خاصی اطلاع رسانی کند.

در Java برنامه، هنگامی که خطایی رخ می دهد، آن خطا ابتدا در بالای stack صادر (throw) می شود و اگر مدیریت نشود، به متد قبلی پاس داده می شود و چنانچه آنجا هم مدیریت نشود، باز خطای مورد نظر به متد پایینی stack محول می شود. این روال ادامه می یابد تا اینکه یا خطا مدیریت شود و یا به انتهای stack برسد. از این رویداد تحت عنوان exception propagation یاد می شود.

کلیدواژه ی throws در Java برای اعلان خطا بکار می رود. این دستور به برنامه نویس اعلان می کند که ممکن است خطایی رخ دهد به همین دلیل بهتر است کد مدیریت خطا را داخل برنامه جاسازی کند تا روند اجرای برنامه دچار اخلال نشود. به عبارت دیگر زمانی که در یک متد خطا رخ می دهد و توسعه دهنده از throws استفاده می کند، بدین معنی است که مدیریت exception به فراخواننده ی متد واگذار می شود.

در این آموزش Java با تفاوت های بین throws و throw آشنا می شویم

تفاوت های بسیاری بین final، finally و finalize در Java وجود دارد. در زیر لیست تفاوت ها بین این سه دستور را مشاهده می کنید:

اگر بخواهید از (بازنویسی متد کلاس پدر در سطح کلاس فرزند) method overriding در Java برای مدیریت خطاها استفاده کنید، قواعد و نکات متعددی وجود دارد که باید آن ها را رعایت نمایید.

چنانچه توسعه دهنده خود خطایی را تعریف کند از آن تحت عنوان خطای اختصاصی (custom exception) یا خطای کاربر (user-defined) در Java یاد می شود. این نوع خطاها جهت تنظیم اختصاصی exception با توجه به نیاز کاربر مورد استفاده قرار می گیرد.
آموزش کلاس های داخلی(Inner Calsses) در Java

کلاس های تودرتو (nested class) یا داخلی (inner class) در Java کلاس هایی هستند که خود داخل یک interface یا کلاس دیگر تعریف شده باشند.

به کلاس غیر static در Java که در سطح کلاس دیگر اما خارج از بدنه ی متد عضو آن تعریف شده باشد در اصطلاح member inner class گویند.

یک کلاس که داخل کلاس دیگر تعریف شده و فاقد نام باشد (اسم آن توسط کامپایلر تشخیص داده شده و انتخاب شود) در (Java) جاوا anonymous inner class خوانده می شود. از این نوع کلاس تودرتو بایستی برای بازنویسی (override) متد کلاس پدر یا interface در سطح کلاس دیگر استفاده شود.

کلاسی که در Java در سطح کلاس دیگر و داخل بدنه ی یکی از متدهای آن تعریف شده باشد، در اصطلاح کلاس تودرتو محلی/inner local class خوانده می شود.

یک کلاس static که در سطح کلاس دیگری تعریف شده باشد در جاوا (Java) تحت عنوان static nested class خوانده می شود. این نوع کلاس نمی تواند به فیلدها و متدهای غیر static دسترسی داشته باشد. به منظور دسترسی به این کلاس لازم است اسم کلاس میزبان (outer class) ذکر شود.

interface ای که در Java در سطح interface یا کلاس دیگری تعریف شده باشد تحت عنوان nested interface خوانده می شود.
آموزش چند رشته ای (Multi Threading) در Java

Multithreading (تقسیم برنامه به پردازش های موازی مجزا) در Java فرایندی است که طی آن چند thread به صورت مجزا اما همزمان اجرا می شوند.

یک thread در Java آن واحد می تواند در یکی از 5 وضعیت (state) مختلف قرار داشته باشد. با توجه به گفته های شرکت Sun، تنها 4 وضعیت مختلف برای چرخه ی حیات thread در جاوا وجود دارد که عبارتند از: new، runnable، non-runnable و terminated. در جاوا وضعیتی به نام running برای thread وجود ندارد.

کلاس Thread توابع سازنده (Constructor) و متدهایی را در اختیار توسعه دهنده قرار می دهد که به واسطه ی آن ها می توان thread ایجاد کرده و عملیاتی را بر روی آن thread اجرا کرد. کلاس Thread از کلاس پایه ی Object ارث بری داشته و interface ای به نام Runnable را پیاده سازی می کند.

Thread scheduler در Java بخشی از JVM است که مدیریت زمان بندی و اجرای thread ها (بر اساس مقدار priority و اولویت) را برعهده دارد.

زمانی که متد sleep() از کلاس Thread فراخوانی می شود، thread مورد نظر به مدت زمان مشخصی اجرا را متوقف می نماید. در Java

در پاسخ باید گفت که نه. پس از اینکه یک thread راه اندازی شد، دیگر امکان راه اندازی مجددا آن وجود ندارد و در صورت اقدام به این کار، خطای IllegalThreadStateException رخ می دهد. در Java

آیا می توان در Java به طور مستقیم بجای start()، متد run() را صدا زد؟

متد join() منتظر می ماند تا thread جاری عملیات خود را تکمیل کند، سپس به thread بعدی اجازه ی اجرا می دهد. به عبارت دیگر، مقدار زمان مشخصی صبر می کند تا thread ای که بر روی آن فراخوانی شده کار خود را به پایان برساند و از حافظه حذف شود سپس به thread بعدی امکان اجرا می دهد.

کلاس Thread تعدادی در Java متد برای تغییر و بازیابی اسم آبجکت thread در اختیار توسعه دهنده قرار می دهد. به صورت پیش فرض، هر thread یک اسم اختصاصی مانند thread-0، thread-1 و غیره ... دارد. به منظور تنظیم اسم thread می توان از متد setName و جهت بازیابی اسم thread مورد نظر می توان از getName استفاده کرد.

تمامی thread ها در Java دارای یک اولویت اجرا و priority هستند. مقدار priority با یک عدد صحیح بین 1 تا 10 نمایش داده می شود (5 اولویت پیش فرض thread ها می باشد و مقدار 10 نشانگر بالاترین میزان اولویت اجرا می باشد). thread scheduler اغلب thread ها را بر اساس مقدار priority آن ها (که مبتنی بر الگوریتم preemptive هست) اجرا می نماید.

Daemon thread ها برای سرویس دهی به thread های تعریف شده توسط برنامه نویس که user thread نامیده می شود، بکار می روند. چرخه ی حیات و طول عمر این نوع thread ها وابسته به user thread ها بوده و با اتمام کار thread هایی که توسعه دهنده تعریف کرده، دستگاه مجازی Java daemon thread ها را نیز از حافظه پاک می کند.

Thread pool عبارت است مجموعه ای از worker thread ها که منتظر انجام عملیات بوده و بارها قابل استفاده می باشند. در واقع thread pool یک مخزن است از thread های آماده است که با استفاده از آن دیگر نیازی نیست هر بار خود توسعه دهنده یک thread جدید ایجاد کند بلکه از thread pool می خواهد که برای اجرای عملیات مورد نظر یک thread در اختیار او قرار دهد.

Java به توسعه دهنده این امکان را می دهد تا چندین thread را در یک آّبجکت واحد بگنجاند. از این طریق می توان به راحتی گروهی از thread ها را با فراخوانی تنها یک تابع معلق (suspend()) کرد، از سر گرفت (resume()) یا متوقف (interrupt()) نمود.

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

در شرایطی که تنها یک عملیات (task) برای اجرا کردن وجود دارد، یک متد run() نیز برای انجام عملیات کفایت می کند. در زیر مثالی را مشاهده می کنید که در آن یک عملیات را چندین thread اجرا می کنند:

در زبان های C و C++ به ترتیب از توابع free() و delete() برای این منظور استفاده می شود. اما جاوا این کار را خود به صورت اتوماتیک انجام داده و به این دلیل در مدیریت حافظه بهتر عملی می کند.

تمامی اپلیکیشن های مبتنی بر Java یک نمونه از کلاس Java Runtime دارند که به آن ها امکان تعامل با محیط اجرای برنامه را می دهد.به بیان دیگر کلاس Java Runtime برای تعامل با java runtime environment بکار می رود. کلاس Java Runtime متدهایی برای اجرای یک process، فراخوانی GC، بازیابی و کل ظرفیت حافظه و آزاد سازی آن در اختیار توسعه دهنده قرار می دهد.
آموزش همگام سازی در جاوا(Java synchronization)

synchronization در Java به معنی قابلیت مدیریت دسترسی thread ها به منابع مشترک می باشد. synchronization زمانی بسیار کاربردی تلقی می شود که توسعه دهنده بخواهد به تنها یک thread امکان دسترسی به منبع مشترک را بدهد.

قطعه کد Synchronized را می توان برای پیاده سازی synchronization و مدیریت دسترسی thread ها به منابع بر روی متد مورد نظر اعمال کرد. در واقع synchronized یک قطعه کد متشکل از دستوراتی است که که thread ها در آن اشتراک دارند.

اگر یک متد را static synchronized تعریف کنید، lock بر آبجکت کلاس اعمال نمی شود بلکه بر روی خود کلاس اعمال می شود و در واقع آن متد در سطح کلاس، نه در سطح نمونه ی کلاس synchronized می باشد. به عبارت دیگر متد مربوطه از آبجکت های ساخته شده از روی کلاس پس از علامت گذاری با کلیدواژگان static synchronized نمی توانند همزمان در دسترس چند thread قرار گیرند.

در جاوا (Java) Deadlock بخشی از مبحث پردازش موازی (multithreading) و مدیریت دسترسی thread ها به منابع یا همان synchronization است.

cooperation مکانیزیمی است که طی آن یک thread در critical section و بخش حیاتی پردازش خود متوقف شده و thread دیگری امکان وارد شدن در همان بخش و اعمال قفل را پیدا می نماید و عملیات یا پردازش بخش حیاتی خود را انجام می دهد. برای پیاده سازی این امکان می توانید از متدهای wait، notify و notifyAll کلاس Object استفاده نمایید.

فراخوانی متد interrupt() بر روی نمونه ای از جنس کلاس Thread سبب می شود یک thread ای که در حال اجرای عملیات می باشد، آن را متوقف کند. در Java
آموزش ورودی و خروجی (Input و Output) در Java

Java با بهره گیری از مفهومی به نام stream (دنباله ای از داده ها با فرمت های مختلف برای مثال 8 بیتی/1 بایتی است که از منبعی خوانده شده یا در آن درج می شود) عملیات i/o را تسریع می بخشد. کلاس ها و توابع لازم برای پردازش ورودی و تولید خروجی در جاوا داخل پکیج java.io تعبیه شده است.

FileOutputStream در جاوا یک کلاس مشتق شده از کلاس انتزاعی OutputStream است که برای ایجاد دنباله ای از بایت های خروجی (output stream) و مشخص کردن یک فایل مقصد که داده ها در آن درج می شوند بکار می رود. به عبارت ساده تر بایت های خروجی را در فایل می نویسد.

کلاس FileInputStream بایت هایی ورودی را از یک فایل خوانده و بازیابی می کند. نمونه ی این کلاس قادر است یک جریان ورودی تعریف کرده و یک فایل به عنوان منبع این جریان تنظیم و ایجاد کند. از کلاس FileInputStream برای خواندن داده های مبتنی بر بایت (دنباله ای از بایت های خام) نظیر اطلاعات تصویری، صوتی، ویدئو و غیره ... استفاده می شود.

کلاس BufferedOutputStream برای قرار دادن دنباله ای از بایت های خروجی (output stream) از دیسک در حافظه واسط و به اصطلاح بافر کردن محتوا بکار می رود. این کلاس همان طور که از اسم آن پیدا است از buffer برای ذخیره ی موقت داده ها از دیسک استفاده می کند.

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

کلاس SequenceInputStream در جاوا جهت خواندن داده از چندین input stream (برای مثال چند فایل ورودی) که در قالب یک sequence واحد به ترتیب به یکدیگر متصل شده اند، بکار می رود. این کلاس داده ها را به صورت متوالی و یکی پس از دیگری از input stream های متصل شده به هم می خواند.

کلاس ByteArrayOutputStream در جاوا برای درج داده های مشترک در چند فایل بکار می رود. output stream ای که این کلاس پیاده سازی می کند، داده ها را داخل آرایه ای از بایت ها (byte stream) قرار داده و سپس می تواند این داده ها را در چندین stream، برای مثال فایل خروجی، به صورت ثابت درج کند.

اسم کلاس ByteArrayInputStream از دو کلمه تشکیل شده است: ByteArray و InputStream. همان طور که از اسم آن پیدا است، می توان با استفاده از آن آرایه ای از بایت ها ورودی (input stream) را خواند. کلاس ByteArrayInputStream داری یک حافظه ی buffer داخلی است که به وسیله آن می توان آرایه ای از بایت های ورودی را به صورت stream خواند.

کلاس DataOutStream این امکان را برای اپلیکیشن فراهم می کند تا داده هایی از نوع اولیه (primitive) را در جریان خروجی (output stream) به روشی کاملا مستقل از ماشین و قابل اجرا (استفاده) در بسترهای مختلف درج کند. به عبارت دیگر این کلاس داده هایی از نوع اولیه را به متغیرهای قابل استفاده در انواع output stream ها که از بستر اجرا و platform مستقل هستند تبدیل می نماید.

کلاس DataInputStream این امکان را برای اپلیکیشن فراهم می کند تا داده هایی از نوع اولیه (primitive) را از input stream (برای مثال فایل ورودی) به صورت کاملا مستقل از ماشین (قابل فهم و اجرا بر روی بسترهای مختلف و مستقل از platform) بخواند.

کلاس FilterOutputStream پدر تمامی کلاس هایی است که جریان های خروجی (output stream) را فیلتر می کنند. این جریان های بایتی (output stream) بر روی یک output stream از قبل موجود قرار داشته و از آن به عنوان بستر پایه ای دریافت اطلاعات (data sink) استفاده می کنند. لازم به ذکر است که داده ها در طول مسیر ممکن است تبدیل شده یا قابلیت های جدیدی اضافه گردد.

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

کلاس Console قابلیت این را دارد که از console ورودی دریافت کرده و در آن خروجی چاپ کند. این کلاس تعدادی متد جهت خواندن متن و گذرواژه (password) در اختیار توسعه دهنده قرار می دهد. در Java

کلاس FilePermission در جاوا امکان دسترسی به فایل یا پوشه را فراهم می کند. این کلاس تمامی مجوزهای مربوط به فایل یا دایرکتوری را کپسوله می کند. مجوزهایی کپسوله سازی شده در این کلاس همگی مربوط به path و دسترسی به محل قرارگیری فایل می باشد. رشته path می تواند به دو صورت نگارش شود:

کلاس Writer یک کلاس abstract برای درج داده در character stream و دنباله ای از کاراکترها است. این کلاس را کلاس های دیگر به ارث برده و متدهای write(char[], int, int)، flush() و close() از این کلاس abstract را در خود پیاده سازی می کنند. بیشتر کلاس هایی که از Writer ارث بری دارند، متدهای آن را جهت افزایش کارایی و افزودن قابلیت مضاعف در سطح خود بازنویسی (override) می کنند.

کلاس Reader یک کلاس abstract است که برای خواندن دنباله ای از کاراکترها/character stream بکار می رود. کلاس هایی که از این کلاس ارث بری دارند فقط باید دو متد read(char[], int, int) و close() را پیاده سازی می کنند.آموزش Java

کلاس FileWriter برای درج داده های مبتنی بر کاراکتر در فایل بکار می رود. به عبارت دیگر، FileWriter یک کلاس مبتنی بر کاراکتر است که توسعه دهنده به واسطه ی آن می تواند اطلاعاتی را در قالب کاراکتر در فایل وارد کرده و آن را مدیریت کند. آموزش Java

توسعه دهنده به وسیله ی کلاس FileReader قادر خواهد بود داده های مبتنی بر کاراکتر را از فایل مورد نظر بخواند. نمونه ی این کلاس داده ها را در قالب دنباله ای از بایت ها مانند FileInputStream در خروجی برمی گرداند. آموزش Java

کلاس BufferedWriter به آبجکت های ساخته شده از روی کلاس Writer این امکان را می دهد که داده های خود را در حافظه واسط یا buffer ذخیره کرده و در اصطلاح از قابلیت buffering در عملیات ورودی پشتیبانی کند. آموزش Java

کلاس BufferedReader برای خواندن متن از یک input stream مبتنی بر کاراکتر بکار می رود. توسعه دهنده می تواند با فراخوانی متد readline() از این کلاس محتوای فایل مورد نظر را خط به خط بخواند. این کلاس به سبب استفاده از buffer، سرعت و کارایی اپلیکیشن را افزایش می دهد.آموزش Java

اسم کلاس CharArrayReader از دو واژه ی CharArray و Reader تشکیل شده است. همان طور که از اسم آن پیدا است، این کلاس به توسعه این امکان را می دهد تا آرایه ای از کاراکترها را به صورت stream یا دنباله ای از داده های ورودی بخواند. CharArrayReader نیز از کلاس Reader مشتق می شود.

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

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