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

تولید عدد صحیح تصادفی در یک بازه در جاوا :

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

  1. java.util.Random.nextInt
  2. Math.random
  3. java.util.Random.ints (جاوا ۸)

۱- کلاس Random و متد nextInt یک عدد از ۰ و شامل صفر تا محدوده ای که تعیین کرده ایم برمیگرداند(یعنی شامل خود عدد محدوده نمی شود). برای اینکه عددی در بازه دلخواه داشته باشیم و اعداد min و max را هم شامل شود باید به این صورت:


private static int getRandomNumberInRange(int min, int max) {

	if (min >= max) {
		throw new IllegalArgumentException("max must be greater than min");
	}

	Random r = new Random();
	return r.nextInt((max - min) + 1) + min;
}

برای درک عبارت ( (مکس – مین)+۱ ) + مین  توجه داشته باشید:


//Random().nextInt(int bound) = Random integer from 0 (inclusive) to bound (exclusive)

//۱٫ nextInt(range) = nextInt(max - min)
new Random().nextInt(5);  // [0...4] [min = 0, max = 4]
new Random().nextInt(6);  // [0...5]
new Random().nextInt(7);  // [0...6]
new Random().nextInt(8);  // [0...7]
new Random().nextInt(9);  // [0...8]
new Random().nextInt(10); // [0...9]
new Random().nextInt(11); // [0...10]

//۲٫ To include the last value (max value) = (range + 1)
new Random().nextInt(5 + 1)  // [0...5] [min = 0, max = 5]
new Random().nextInt(6 + 1)  // [0...6]
new Random().nextInt(7 + 1)  // [0...7]
new Random().nextInt(8 + 1)  // [0...8]
new Random().nextInt(9 + 1)  // [0...9]
new Random().nextInt(10 + 1) // [0...10]
new Random().nextInt(11 + 1) // [0...11]

//۳٫ To define a start value (min value) in a range,
//   For example, the range should start from 10 = (range + 1) + min
new Random().nextInt(5 + 1)  + 10 // [0...5]  + 10 = [10...15]
new Random().nextInt(6 + 1)  + 10 // [0...6]  + 10 = [10...16]
new Random().nextInt(7 + 1)  + 10 // [0...7]  + 10 = [10...17]
new Random().nextInt(8 + 1)  + 10 // [0...8]  + 10 = [10...18]
new Random().nextInt(9 + 1)  + 10 // [0...9]  + 10 = [10...19]
new Random().nextInt(10 + 1) + 10 // [0...10] + 10 = [10...20]
new Random().nextInt(11 + 1) + 10 // [0...11] + 10 = [10...21]

// Range = (max - min)
// So, the final formula is ((max - min) + 1) + min

//۴٫ Test [10...30]
// min = 10 , max = 30, range = (max - min)
new Random().nextInt((max - min) + 1) + min
new Random().nextInt((30 - 10) + 1) + 10
new Random().nextInt((20) + 1) + 10
new Random().nextInt(21) + 10    //[0...20] + 10 = [10...30]

//۵٫ Test [15...99]
// min = 15 , max = 99, range = (max - min)
new Random().nextInt((max - min) + 1) + min
new Random().nextInt((99 - 15) + 1) + 15
new Random().nextInt((84) + 1) + 15
new Random().nextInt(85) + 15    //[0...84] + 15 = [15...99]

//Done, understand?

۲-و متد random از کلاس Math یک عدد بین ۰ تا ۱ و از نوع double بر میگرداند:


static double	random()
Returns a double value with a positive sign, greater than or equal to 0.0 and less than 1.0.

 

و برای به دست آوردن عددی رندم در یک بازه ی خاص مثل روش قبل:


	private static int getRandomNumberInRange(int min, int max) {

		if (min >= max) {
			throw new IllegalArgumentException("max must be greater than min");
		}

		return (int)(Math.random() * ((max - min) + 1)) + min;
	}

۳- در جاوا ۸ متد های جدید به java.util.Random اضافه شده اند. برای این کار از متد ints استفاده میکنیم که یک عدد بین بازه ی min و شامل min و تا max تعیین میشود و چون خود max را شامل نمیشود برای اینکه عددی در بازه دلخواه داشته باشیم و خود اعداد min و max را هم شامل شود باید به این صورت max را بعلاوه یک کنیم:


import java.util.Random;

public class TestRandom {

	public static void main(String[] args) {

		for (int i = 0; i < 10; i++) {
			System.out.println(getRandomNumberInRange(33, 38));
		}

	}

	private static int getRandomNumberInRange(int min, int max) {

		Random r = new Random();
		return r.ints(min, (max + 1)).limit(1).findFirst().getAsInt();

	}

}

 

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

 

آسیب پذیری تزریق کد

تزریق کد معمولا زمانی اتفاق می افتد که ورودی های نامطمعن و بدون اعتبار سنجی مستقیما در برنامه اجرا شود. یکی از منابع بالقوه ی آسیب پذیریِ تزریق کد استفاده از جاوا اسکریپت در کد جاوا است. بسته javax.script شامل اینترفیس ها و کلاس هایی است که موتورهای اسکریپت جاوا را تعریف می کنند و چارچوبی برای استفاده از آن در کد جاوا است.

مهاجم با سوء استفاده از api این پکیج قادر به اجرای کد های مخرب در سیستم هدف است. این تقریبا مثل SQL injection است.

مثال :

این متد یک رشته به عنوان نام کاربر دریافت و نتیجه را در خروجی چاپ میکند:


private static void evalScript(String firstName) throws ScriptException {
  ScriptEngineManager manager = new ScriptEngineManager();
  ScriptEngine engine = manager.getEngineByName("javascript");
  engine.eval("print('"+ firstName + "')");
}

یک مهاجم می تواند یک نمونه ی مخرب از کد را به عنوان آرگومان به این متد تزریق کند، و مثلا اگر این کد جاوا اسکریپت را به متد evalScript بدهیم ابتدا “dummy” چاپ میشود و بعد در فایل تنظیمات فرضی عبارت “some text” رو نوشته خواهد شد…


dummy\');
var bw = new JavaImporter(java.io.BufferedWriter);
var fw = new JavaImporter(java.io.FileWriter);
with(fw) with(bw) {
   bwr = new BufferedWriter(new FileWriter(\"config.cfg\"));
   bwr.write(\"some text\"); bwr.close();
}
// ;

روش های مقابله:

۱- لیست سفید (Whitelisting):

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


private static void evalScript(String firstName) throws ScriptException {
  // Allow only alphanumeric and underscore chars in firstName
  // (modify if firstName may also include special characters)
  if (!firstName.matches("[\\w]*")) {
    // String does not match whitelisted characters
    throw new IllegalArgumentException();
  }
 
  ScriptEngineManager manager = new ScriptEngineManager();
  ScriptEngine engine = manager.getEngineByName("javascript");
  engine.eval("print('"+ firstName + "')");
}

۲- جعبه شنی امن (Secure Sandbox):

یک روش جایگزین استفاده از مدیر امنیت (security manager ) برای ایجاد یک جعبه شنی امن است. برنامه باید از اجرای دستورات دلخواه توسط اسکریپت مانند پرس و جو از سیستم فایل محلی جلوگیری کند.


class ACC {
  private static class RestrictedAccessControlContext {
    private static final AccessControlContext INSTANCE;
   
    static {
      INSTANCE = new AccessControlContext(
                   new ProtectionDomain[] {
                     new ProtectionDomain(null, null) // No permissions
                   });
    }
  }
   
  private static void evalScript(final String firstName)
      throws ScriptException {
    ScriptEngineManager manager = new ScriptEngineManager();
    final ScriptEngine engine = manager.getEngineByName("javascript");
    // Restrict permission using the two-argument form of doPrivileged()
    try {
      AccessController.doPrivileged(
        new PrivilegedExceptionAction<0bject>() {
                         
          public Object run() throws ScriptException {
            engine.eval("print('" + firstName + "')");
            return null;
          }
        },
        // From nested class
        RestrictedAccessControlContext.INSTANCE);
                                                                     
    } catch (PrivilegedActionException pae) {
      // Handle error
    }
  }
}

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

 

تبدیل رشته به عدد (Convert String to int) در جاوا

تبدیل رشته به عدد (Convert String to int) در جاوا:

در جاوا از Integer.parseInt() برای تبدیل رشته به عدد استفاده میکنیم.

۱٫ Integer.parseInt()

String number = "10";
int result = Integer.parseInt(number);
System.out.println(result);

و یا به جای آن از Integer.valueOf() برای بدست آوردن آبجکت Integer استفاده میکنیم.

۲٫ Integer.valueOf()

 String number = "10";
Integer result = Integer.valueOf(number);
System.out.println(result);

تنها نکته اش اینه که parseInt یک نوع اصلی (int) بر میگرداند و valueOf یک نمونه ی جدید از نوع Integer. و اگر رشته ای که میخواهیم به عدد تبدیل شود یک رشته ی عددی صحیح نباشد کلاس Integer استثنای NumberFormatException خواهد انداخت.

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

تبدیل رشته به عدد (Convert String to int) در جاوا

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

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

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

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

restart برنامه نوشته شده با جاوا

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

روش کار ساده است باید :

  • باید به برنامه java در jre دسترسی داشته باشید (منظور بودن مسیر جاوا در متغییر محیطی path است) تا بتونید برنامه ای در خط فرمان رو اجرا کنید.
  • باید مسیر jar برنامه رو بدست بیاریم. (در این پست در موردش توضیح داده ام).
  • به عنوان یک دستور خط فرمان و از طریق ProcessBuilder اجرا کنیم:  java -jar app.jar
  • جدا کننده مسیر در ویندوز ” \ ” و در گنو/لینوکس و یونیکس ” /”  است مطمئن ترین روش برای حفظ استقلال از سکو برنامه استفاده از File.separator می باشد.

یه متد که در سایت stackoverflow.com پیدا کردم به درستی این کار انجام میده:


public void restartApplication()
{
  final String javaBin = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
  final File currentJar = new File(MyClassInTheJar.class.getProtectionDomain().getCodeSource().getLocation().toURI());

  /* is it a jar file? */
  if(!currentJar.getName().endsWith(".jar"))
    return;

  /* Build command: java -jar application.jar */
  final ArrayList command = new ArrayList();
  command.add(javaBin);
  command.add("-jar");
  command.add(currentJar.getPath());

  final ProcessBuilder builder = new ProcessBuilder(command);
  builder.start();
  System.exit(0);
}
restart برنامه نوشته شده با جاوا
restart برنامه نوشته شده با جاوا

خواندن و نوشتن داده هایی که با 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 (+).

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

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

تعیین زوج و فرد یک عدد با استفاده از عملیات بیتی

تعیین زوج و فرد یک عدد با استفاده از عملیات بیتی.

تعیین زوج و فرد یک عدد با استفاده از عملیات بیتی

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

۱-عملگر باقی مانده ی تقسیم (%):

همون طور که در ریاضیات عددی زوج است که باقی مانده ی تقسیم اش بر دو ، صفر باشد. پس به عنوان یک روش با استفاده از % زوج بودن عددی را تعیین میکنیم.

boolean is_even = (n % 2 == 0);

۲-تعیین زوج و فرد با استفاده از عملیات بیتی و عملگر بیتی &:

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

number & 1

برای مثال :

۱-پنج فرد است پس:

۰۰۰۰ ۰۱۰۱ & 0000 0001 = 0000 0001

۲- و شش زوج است:

۰۰۰۰ ۰۱۱۰ & 0000 0001 = 0000 0000

و نمونه کد جاوا :

if( (number&1) == 0){
      system.out.println("even");
   }else{
        system.out.println("odd");
      }

در زیر کاپوت :

همان طور که میدانید عملگر منطقی and (&) دو مقدار دودویی با طول مساوی دریافت کرده و بر روی هر جفت بیت متناظر، عملیات عطف منطقی را انجام می‌دهد. نتیجه وقتی ۱ می‌شود که اولین بیت و دومین بیت هر دو با هم ۱ باشند، در غیر این صورت صفر خواهد بود.

جدول زیر را در نظر بگیرید:

۲۰ ۲۱ ۲۲ ۲۳ ۲۴ ۲۵ ۲۶ ۲۷ ۲۸ ۲۹
۱ ۲ ۴ ۸ ۱۶ ۳۲ ۶۴ ۱۲۸ ۲۵۶ ۵۱۲

دو به توان هر عدد صحیح غیر منفی و صفر ، همیشه زوج خواهد بود. (نمی دونم صفر مثبته یا منفی؟)

کمترین ارزش را سمت راست ترین رقم خواهد داشت. و مقدار آن در صورت صحیح بودن یک خواهد بود.

عدد یک در مبنای دو برابر با یک است و به سمت چپ تمامی ارقام صفر خواهند بود و این هیچ تاثیری بر ارزش عدد ندارد. (۰۰۰۰۰۰۰۱) .

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

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

 

 

 

 

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

restart برنامه نوشته شده با جاوا (+).

 

لود کردن کتابخانه ی native از فایل jar

لود کردن کتابخانه ی native از فایل jar:

برای لود کردن کتابخانه های بومی (natvie) از فایل jar ، کافیه فایل های dll یا so رو در یک پکیج مثل سورس جاوا کپی کنید و از این کلاس استفاده کنید:


/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/*
* Class NativeUtils is published under the The MIT License:
*
* Copyright (c) 2012 Adam Heinrich <adam@adamh.cz>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
import java.io.*;

/**
* A simple library class which helps with loading dynamic libraries stored in
* the JAR archive. These libraries usualy contain implementation of some
* methods in native code (using JNI - Java Native Interface).
*
* @see
* http://adamheinrich.com/blog/2012/how-to-load-native-jni-library-from-jar
* @see https://github.com/adamheinrich/native-utils
*
*/
public class NativeUtils {

	/**
* Private constructor - this class will never be instanced
*/
	private NativeUtils() {}

	/**
* Loads library from current JAR archive
*
* The file from JAR is copied into system temporary directory and then
* loaded. The temporary file is deleted after exiting. Method uses String
* as filename because the pathname is "abstract", not system-dependent.
*
* @param path The path of file inside JAR as absolute path (beginning and
* ends with '/')
* @param libname name of lib to load from jar without extension
* @throws IOException If temporary file creation or read/write operation
* fails
* @throws IllegalArgumentException If source file (param path) does not
* exist
* @throws IllegalArgumentException If the path is not absolute or if the
* filename is shorter than three characters (restriction of {
* @see File#createTempFile(java.lang.String, java.lang.String)}).
*/
	public static void loadLibraryFromJar(String path, String libName) throws IOException {

		if (!path.startsWith("/")) {
			throw new IllegalArgumentException("The path has to be absolute (start with '/').");
		} else if (!path.endsWith("/")) {
			throw new IllegalArgumentException("The path has to be end with '/'.");
		}

		//Host platform dependent library name.extension
		path += System.mapLibraryName(libName);
		System.out.println(path);

		// Obtain filename from path
		String[] parts = path.split("/");
		String filename = (parts.length & gt; 1) ? parts[parts.length - 1] : null;

		// Split filename to prexif and suffix (extension)
		String prefix = "";
		String suffix = null;
		if (filename != null) {
			parts = filename.split("\\.", 2);
			prefix = parts[0];
			suffix = (parts.length & gt; 1) ? "." + parts[parts.length - 1] : null; // Thanks, davs! 🙂
		}

		// Check if the filename is okay
		if (filename == null || prefix.length() & lt; 3) {
			throw new IllegalArgumentException("The filename has to be at least 3 characters long.");
		}

		// Prepare temporary file
		File temp = File.createTempFile(prefix, suffix);
		temp.deleteOnExit();

		if (!temp.exists()) {
			throw new FileNotFoundException("File " + temp.getAbsolutePath() + " does not exist.");
		}

		// Prepare buffer for data copying
		byte[] buffer = new byte[1024];
		int readBytes;

		// Open and check input stream
		InputStream is = NativeUtils.class.getResourceAsStream(path);
		if (is == null) {
			throw new FileNotFoundException("File " + path + " was not found inside JAR.");
		}

		// Open output stream and copy data between source file in JAR and the temporary file
		OutputStream os = new FileOutputStream(temp);
		try {
			while ((readBytes = is.read(buffer)) != -1) {
				os.write(buffer, 0, readBytes);
			}
		} finally {
			// If read/write fails, close streams safely before throwing an exception
			os.close();
			is.close();
		}

		// Finally, load the library
		System.load(temp.getAbsolutePath());
	}
}

https://github.com/RayanFar/native-utils

لود کردن کتابخانه ی native از فایل jar