به دست آوردن مسیر اجرای فایل jar

به دست آوردن مسیر اجرای فایل jar
به دست آوردن مسیر اجرای فایل jar:بعضی وقت ها نیاز داریم به پوشه ای که فایل جار در اون اجرا شده دسترسی داشته باشیم.مثلا شاید لازمه فایل هایی از دیسک خونده یا نوشته بشه و باید این فایل ها در کنار فایل جار باشند و در این صورت نیاز داریم که مسیر دقیق فایل jar در زمان اجرا رو داشته باشیم.

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

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

خواندن و نوشتن داده هایی که با utf-8 کد گذاری شده اند

خواندن و نوشتن داده هایی که با utf-8 کد گذاری شده اند.

خواندن و نوشتن داده هایی که با utf-8 کد گذاری شده اند

شاید برای شما هم پیش آمده باشد که بخواهید برنامه متن فارسی در فایلی بنویسد و  ?????? تحویل بگیرید. و یا حتی موقع خواندن متن فارسی از یک فایل با همان علامت های سوال مواجه بشید. این به دلیل نوشته نشدن فایل با شیوه کد گذاری مناسبه و در مورد دوم بهتره  coding خروجی کنسول تون رو UTF-8 تنظیم کنید و دوباره امتحان کنید اگر باز هم مشکل داشت کدتون رو تغییر بدهید. به احتمال زیاد در گنو/لینوکس با این مشکل مواجه نخواهید شد چون پیش فرض utf8 , JDK است حداقل برای من که این طور بود.

خواندن از فایل:


package com.test.file;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
 
public class test {
	public static void main(String[] args){
 
	try {
		File fileDir = new File("/home/username/test.txt");
 
		BufferedReader in = new BufferedReader(
		   new InputStreamReader(
                      new FileInputStream(fileDir), "UTF8"));
 
		String str;
 
		while ((str = in.readLine()) != null) {
		    System.out.println(str);
		}
 
                in.close();
	    } 
	    catch (UnsupportedEncodingException e) 
	    {
			System.out.println(e.getMessage());
	    } 
	    catch (IOException e) 
	    {
			System.out.println(e.getMessage());
	    }
	    catch (Exception e)
	    {
			System.out.println(e.getMessage());
	    }
	}
}

و نوشتن در فایل:


package com.test.file;
 
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
 
public class test {
	public static void main(String[] args){
 
	  try {
		File fileDir = new File("/home/username/test.txt");
 
		Writer out = new BufferedWriter(new OutputStreamWriter(
			new FileOutputStream(fileDir), "UTF8"));
 
		out.append("eng text UTF-8").append("\r\n");
		out.append("متن نمونه فارسی UTF-8").append("\r\n");
 
		out.flush();
		out.close();
 
	    } 
	   catch (UnsupportedEncodingException e) 
	   {
		System.out.println(e.getMessage());
	   } 
	   catch (IOException e) 
	   {
		System.out.println(e.getMessage());
	    }
	   catch (Exception e)
	   {
		System.out.println(e.getMessage());
	   } 
	}	
}

مطالب مرتبط:

توضیحات مربوط به UTF-8 در ویکی پدیا  (+).

Encode String to UTF-8 (+).

مطالب غیر مرتبط به این پست:

تبدیل رشته به عدد در جاوا (+).

ویرایش و ایجاد فایل های مایکروسافت آفیس (ورد-اکسل-پاروپوینت) در جاوا

ویرایش و ایجاد فایل های مایکروسافت آفیس (ورد-اکسل-پاروپوینت) در جاوا

ویرایش و ایجاد فایل های مایکروسافت آفیس (ورد-اکسل-پاروپوینت) در جاوا

شاید نیاز داشته باشید که اطلاعاتی رو در سمت سرور در فایل اکسل بنویسید مثلا فاکتور خرید اینترنتی رو که به صورت پیش فرض قالب بندی شده و مواردی باید به اون اضافه بشه .در این صورت برنامه آفیس که نمیشه در سمت سرور باز کرد. یا شاید بخواهید برنامه آفیس رو برای موبایل بنویسید.

راه حل اول:

به عنوان سریع ترین راه حل بهتره از یک کتابخونه کامل مثل آپاچی POI استفاده کنید. آموزش و مستنداتش تو سایتwww.poi.apache.org  موجوده.

راه حل دوم :

خودمون دست به کار بشیم و کاپوت آفیس رو بالا بزنیم ببینیم چی به چیه. به نظر من اولین قدم جمع آوری اطلاعاته.پس به سایت مایکروسافت میریم و دنبال مستندات آفیس ۲۰۱۳ میگردیم.

در نتیجه مشخص میشود فایل های آفیس ۲۰۱۳  به عنوان یک گزینه از (open XML) برای نشان دادن نمودار ها و صفحات گسترده و نحوه نمایش صفحات و غیره در هرسه مورد  ( ورد – اکسل – پاورپوینت  ) استفاده میکند.

openXMl:

در این روش هر فایل خروجی  برای مثال اکسل (file.XLSX) در یک پوشه زیپ شده است که از چند فایل XML تشکیل شده است.

پس برای کار کردن با این فایل ها به سه چیز نیاز داریم:

۱- کتابخونه ای برای کار کردن با فایل های زیپ (زیپ و آنزیپ کردن) که برای جاوا و تقریبا هر زبانی موجوده

۲- کتابخونه ای برای کار کردن با فایل های XML (میتونیم از امکانات پایه جاوا استفاده کنیم اما اگر فایل خیلی بزرگ باشه بهتره از یک روش بهینه تر استفاده کنیم )

۳- مستنداتی که تو سایت مایکروسافت موجوده (البته ساختارش بسیار سادست بهتره یکی از فایل ها رو آنزیپ و برسی اش کنید)

 

 

مطالب غیر مرتبط:

تولید عدد صحیح تصادفی در یک بازه در جاوا (+).

کوچک تر شدن فایل بعد از کپی با استفاده از apache IO و CopyUtils

کوچک تر شدن فایل بعد از کپی با استفاده از apache IO و CopyUtils.

کوچک تر شدن فایل بعد از کپی با استفاده از apache IO و CopyUtils

 

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

    • اولا باید در نظر داشته باشید که بر طبق امضای این متد باید آرگمان ها از نوع  InputStream  و OutputStream  باشند:
CopyUtils.copy(InputStream input ,OutputStream output);
    • دوما باید به سلسله مراتب کلاس های ارث برده از in/outputStream توجه کنید. در حالی که کلاس FileInputStream کلاس InputStream رو گسترش داده و در ضمن BufferedInputStream کلاس FilterInputStream گسترش میده و کلاس FilterInputStream کلاس InputStream گسترش میده پس :
FileInputStream instanceof InputStream  = true
BufferedInputStream instanceof InputStream  = true

و با توجه به تفاوت هایی که در پیاده سازی متد های read() و write() در کلاس های bufferedInputStream و FileInputStream وجود داره اگر یک نمونه از کلاس bufferedInputStream رو به عنوان آرگومان ورودی به متد Copy بدهیم فایل مقصد از فایل منبع کوچک تر خواهد شد. پس در این حالت بهتره از FileInputStream استفاده کنیم.

 

لینک های مرتبط به مطلب:

Commons IO (+).

مطالب غیر مرتبط:

ویرایش و ایجاد فایل های مایکروسافت آفیس (ورد-اکسل-پاروپوینت) در جاوا (+).